From 23cb85bda74982de49c3083f77b1027cbe3012b9 Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Fri, 3 Apr 2020 15:27:35 +0800 Subject: [PATCH 01/10] prepare release 2.5.4: 1. update bundles; 2. throughput/smart_meter examples enhanced. --- .vscode/settings.json | 6 + bundles/mesh/inc/att_db.h | 4 - bundles/mesh/inc/l2cap.h | 13 - bundles/mesh/inc/os/FreeRTOS.h | 149 +---- bundles/mesh/inc/os/FreeRTOSConfig.h | 23 +- bundles/mesh/inc/os/deprecated_definitions.h | 4 +- bundles/mesh/inc/os/event_groups.h | 4 +- bundles/mesh/inc/os/list.h | 4 +- bundles/mesh/inc/os/mpu_wrappers.h | 12 +- bundles/mesh/inc/os/portable.h | 24 +- .../mesh/inc/os/portable/GCC/ARM_CM3/port.c | 4 +- .../inc/os/portable/GCC/ARM_CM3/portmacro.h | 5 +- .../inc/os/portable/IAR/ARM_CM3/portmacro.h | 4 +- .../mesh/inc/os/portable/RVDS/ARM_CM3/port.c | 4 +- .../inc/os/portable/RVDS/ARM_CM3/portmacro.h | 4 +- bundles/mesh/inc/os/projdefs.h | 4 +- bundles/mesh/inc/os/queue.h | 4 +- bundles/mesh/inc/os/semphr.h | 4 +- bundles/mesh/inc/os/task.h | 110 +--- bundles/mesh/inc/os/timers.h | 23 +- bundles/mesh/inc/platform_api.h | 51 +- bundles/mesh/inc/syscfg.h | 1 + bundles/mesh/meta.json | 9 +- bundles/mesh/platform.bin | Bin 258376 -> 258236 bytes bundles/mesh/symdefs.g | 605 +++++++++--------- bundles/mesh/symdefs.i | 605 +++++++++--------- bundles/mesh/symdefs.m | 605 +++++++++--------- bundles/mesh/symdefs.s | 605 +++++++++--------- bundles/typical/inc/gap.h | 15 +- bundles/typical/inc/platform_api.h | 9 +- bundles/typical/meta.json | 9 +- bundles/typical/platform.bin | Bin 132208 -> 132252 bytes bundles/typical/symdefs.g | 413 ++++++------ bundles/typical/symdefs.i | 413 ++++++------ bundles/typical/symdefs.m | 413 ++++++------ bundles/typical/symdefs.s | 413 ++++++------ .../peripheral_ibeacon.ingw | 6 +- .../peripheral_ibeacon/generic_cortex.icf | 6 +- .../peripheral_ibeacon.ingw | 6 +- .../peripheral_battery.ingw | 6 +- .../smart_home_hub/smart_home_hub.ingw | 6 +- .../peripheral_ibeacon.ingw | 6 +- .../peripheral_ibeacon.ingw | 6 +- examples/anti_lost_mas/anti_lost_mas.ingw | 6 +- examples/anti_lost_sla/anti_lost_sla.ingw | 6 +- examples/central_throughput/README.md | 4 +- .../central_throughput.ingw | 6 +- .../central_throughput.uvprojx | 105 +-- examples/central_throughput/src/profile.c | 105 ++- .../central_throughput/src/uart_console.c | 36 +- examples/hid_keyboard/hid_keyboard.ingw | 6 +- examples/hid_keyboard/hid_keyboard.uvprojx | 105 +-- examples/hid_keyboard/src/USBKeyboard.h | 7 - examples/hid_keyboard/src/profile.c | 2 + examples/hid_mouse/hid_mouse.ingw | 6 +- examples/hid_mouse/hid_mouse.uvprojx | 9 + examples/ibeacon_scanner/ibeacon_scanner.ingw | 6 +- examples/io_over_ble_mas/io_over_ble_mas.ingw | 6 +- examples/io_over_ble_sla/io_over_ble_sla.ingw | 6 +- examples/mesh-light/mesh-light.ingw | 6 +- .../periodic_advertiser.ingw | 6 +- .../periodic_advertiser.uvoptx | 72 +-- .../periodic_advertiser.uvprojx | 9 + examples/periodic_advertiser/src/profile.c | 19 +- .../periodic_scanner/periodic_scanner.ingw | 6 +- .../periodic_scanner/periodic_scanner.uvoptx | 66 +- .../periodic_scanner/periodic_scanner.uvprojx | 11 +- examples/periodic_scanner/src/main.c | 2 +- examples/periodic_scanner/src/profile.c | 145 ++++- .../peripheral_all_in_one.ingw | 6 +- .../peripheral_all_in_one.uvoptx | 2 +- .../peripheral_all_in_one.uvprojx | 107 ++-- examples/peripheral_all_in_one/src/main.c | 22 +- examples/peripheral_all_in_one/src/profile.c | 18 +- examples/peripheral_ancs/peripheral_ancs.ingw | 6 +- examples/peripheral_band/peripheral_band.ingw | 6 +- .../peripheral_battery.ingw | 6 +- .../peripheral_console.ingw | 6 +- examples/peripheral_etag/peripheral_etag.ingw | 6 +- .../peripheral_ibeacon.ingw | 6 +- examples/peripheral_irc/peripheral_irc.ingw | 6 +- examples/peripheral_led/peripheral_led.ingw | 6 +- .../peripheral_pedometer.ingw | 6 +- .../peripheral_piano/peripheral_piano.ingw | 6 +- .../peripheral_throughput.ingw | 6 +- examples/secondary_fota/secondary_fota.ingw | 6 +- examples/smart_meter/smart_meter.ingw | 6 +- examples/smart_meter/smart_meter.uvprojx | 105 +-- examples/smart_meter/src/main.c | 2 +- examples/smart_meter/src/profile.c | 2 +- examples/thermo_ota/thermo_ota.ingw | 6 +- examples/uart_console/uart_console.ingw | 6 +- examples/voice_remote_ctrl/README.md | 3 +- .../voice_remote_ctrl/voice_remote_ctrl.ingw | 6 +- src/BSP/eflash.c | 61 +- src/BSP/eflash.h | 18 +- 96 files changed, 2908 insertions(+), 2914 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..7409294b0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "*.rmd": "markdown", + "*.inc": "c" + } +} \ No newline at end of file diff --git a/bundles/mesh/inc/att_db.h b/bundles/mesh/inc/att_db.h index 479455e44..1766aff40 100644 --- a/bundles/mesh/inc/att_db.h +++ b/bundles/mesh/inc/att_db.h @@ -135,10 +135,6 @@ void att_set_read_callback(att_read_callback_t callback); */ void att_set_write_callback(att_write_callback_t callback); -// void att_exchange_mtu_request(uint16_t peripheral_handle); -// WARNING: ^^^ this API is not available in this release - - #ifdef __cplusplus } #endif diff --git a/bundles/mesh/inc/l2cap.h b/bundles/mesh/inc/l2cap.h index 0c2ce7257..311185471 100644 --- a/bundles/mesh/inc/l2cap.h +++ b/bundles/mesh/inc/l2cap.h @@ -155,19 +155,6 @@ uint16_t l2cap_max_le_mtu(void); // WARNING: ^^^ this API is not available in this release -/** - * @brief Request an update of the connection parameter for a given LE connection - * @param handle - * @param conn_interval_min (unit: 1.25ms) - * @param conn_interval_max (unit: 1.25ms) - * @param conn_latency - * @param supervision_timeout (unit: 10ms) - * @returns 0 if ok - */ -// int l2cap_request_connection_parameter_update(hci_con_handle_t con_handle, uint16_t conn_interval_min, -// uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout); -// WARNING: ^^^ this API is not available in this release - #ifdef CONNECTION_PARAMETER_DYNAMICALLY_ADJUST uint8_t l2cap_update_MTU_on_LL_link(l2cap_channel_t * channel); diff --git a/bundles/mesh/inc/os/FreeRTOS.h b/bundles/mesh/inc/os/FreeRTOS.h index 9d09d91af..8facdea82 100644 --- a/bundles/mesh/inc/os/FreeRTOS.h +++ b/bundles/mesh/inc/os/FreeRTOS.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -156,10 +156,6 @@ extern "C" { #define INCLUDE_uxTaskGetStackHighWaterMark 0 #endif -#ifndef INCLUDE_uxTaskGetStackHighWaterMark2 - #define INCLUDE_uxTaskGetStackHighWaterMark2 0 -#endif - #ifndef INCLUDE_eTaskGetState #define INCLUDE_eTaskGetState 0 #endif @@ -175,9 +171,9 @@ extern "C" { #ifndef INCLUDE_xTaskGetSchedulerState #define INCLUDE_xTaskGetSchedulerState 0 #endif - +//add by RAY #ifndef INCLUDE_xTaskGetCurrentTaskHandle - #define INCLUDE_xTaskGetCurrentTaskHandle 0 + #define INCLUDE_xTaskGetCurrentTaskHandle 1 #endif #if configUSE_CO_ROUTINES != 0 @@ -199,19 +195,19 @@ extern "C" { #endif #ifndef configUSE_RECURSIVE_MUTEXES - #define configUSE_RECURSIVE_MUTEXES 0 + #define configUSE_RECURSIVE_MUTEXES 1 #endif #ifndef configUSE_MUTEXES - #define configUSE_MUTEXES 0 + #define configUSE_MUTEXES 1 #endif #ifndef configUSE_TIMERS - #define configUSE_TIMERS 0 + #define configUSE_TIMERS 1 #endif #ifndef configUSE_COUNTING_SEMAPHORES - #define configUSE_COUNTING_SEMAPHORES 0 + #define configUSE_COUNTING_SEMAPHORES 1 #endif #ifndef configUSE_ALTERNATIVE_API @@ -241,23 +237,22 @@ extern "C" { #define configASSERT_DEFINED 1 #endif -#ifndef portMEMORY_BARRIER - #define portMEMORY_BARRIER() -#endif - /* The timers module relies on xTaskGetSchedulerState(). */ #if configUSE_TIMERS == 1 #ifndef configTIMER_TASK_PRIORITY - #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + //#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) #endif /* configTIMER_TASK_PRIORITY */ #ifndef configTIMER_QUEUE_LENGTH - #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + //#error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #define configTIMER_QUEUE_LENGTH 10 #endif /* configTIMER_QUEUE_LENGTH */ #ifndef configTIMER_TASK_STACK_DEPTH - #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + //#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE #endif /* configTIMER_TASK_STACK_DEPTH */ #endif /* configUSE_TIMERS */ @@ -759,19 +754,15 @@ extern "C" { #endif #ifndef configUSE_QUEUE_SETS - #define configUSE_QUEUE_SETS 0 + #define configUSE_QUEUE_SETS 1 #endif #ifndef portTASK_USES_FLOATING_POINT #define portTASK_USES_FLOATING_POINT() #endif -#ifndef portALLOCATE_SECURE_CONTEXT - #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) -#endif - -#ifndef portDONT_DISCARD - #define portDONT_DISCARD +#ifndef portTASK_CALLS_SECURE_FUNCTIONS + #define portTASK_CALLS_SECURE_FUNCTIONS() #endif #ifndef configUSE_TIME_SLICING @@ -962,75 +953,6 @@ point support. */ #define configUSE_TASK_FPU_SUPPORT 1 #endif -/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is -currently used in ARMv8M ports. */ -#ifndef configENABLE_MPU - #define configENABLE_MPU 0 -#endif - -/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is -currently used in ARMv8M ports. */ -#ifndef configENABLE_FPU - #define configENABLE_FPU 1 -#endif - -/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it. -This is currently used in ARMv8M ports. */ -#ifndef configENABLE_TRUSTZONE - #define configENABLE_TRUSTZONE 1 -#endif - -/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on -the Secure Side only. */ -#ifndef configRUN_FREERTOS_SECURE_ONLY - #define configRUN_FREERTOS_SECURE_ONLY 0 -#endif - -/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using - * dynamically allocated RAM, in which case when any task is deleted it is known - * that both the task's stack and TCB need to be freed. Sometimes the - * FreeRTOSConfig.h settings only allow a task to be created using statically - * allocated RAM, in which case when any task is deleted it is known that neither - * the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h - * settings allow a task to be created using either statically or dynamically - * allocated RAM, in which case a member of the TCB is used to record whether the - * stack and/or TCB were allocated statically or dynamically, so when a task is - * deleted the RAM that was allocated dynamically is freed again and no attempt is - * made to free the RAM that was allocated statically. - * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a - * task to be created using either statically or dynamically allocated RAM. Note - * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with - * a statically allocated stack and a dynamically allocated TCB. - * - * The following table lists various combinations of portUSING_MPU_WRAPPERS, - * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and - * when it is possible to have both static and dynamic allocation: - * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ - * | MPU | Dynamic | Static | Available Functions | Possible Allocations | Both Dynamic and | Need Free | - * | | | | | | Static Possible | | - * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ - * | 0 | 0 | 1 | xTaskCreateStatic | TCB - Static, Stack - Static | No | No | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 0 | 1 | 0 | xTaskCreate | TCB - Dynamic, Stack - Dynamic | No | Yes | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 0 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | - * | | | | xTaskCreateStatic | 2. TCB - Static, Stack - Static | | | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 1 | 0 | 1 | xTaskCreateStatic, | TCB - Static, Stack - Static | No | No | - * | | | | xTaskCreateRestrictedStatic | | | | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 1 | 1 | 0 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | - * | | | | xTaskCreateRestricted | 2. TCB - Dynamic, Stack - Static | | | - * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| - * | 1 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | - * | | | | xTaskCreateStatic, | 2. TCB - Dynamic, Stack - Static | | | - * | | | | xTaskCreateRestricted, | 3. TCB - Static, Stack - Static | | | - * | | | | xTaskCreateRestrictedStatic | | | | - * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ - */ -#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ - ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) - /* * In line with software engineering best practice, FreeRTOS implements a strict * data hiding policy, so the real structures used by FreeRTOS to maintain the @@ -1043,40 +965,25 @@ the Secure Side only. */ */ struct xSTATIC_LIST_ITEM { - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - TickType_t xDummy2; - void *pvDummy3[ 4 ]; - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy4; - #endif + TickType_t xDummy1; + void *pvDummy2[ 4 ]; }; typedef struct xSTATIC_LIST_ITEM StaticListItem_t; /* See the comments above the struct xSTATIC_LIST_ITEM definition. */ struct xSTATIC_MINI_LIST_ITEM { - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - TickType_t xDummy2; - void *pvDummy3[ 2 ]; + TickType_t xDummy1; + void *pvDummy2[ 2 ]; }; typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; /* See the comments above the struct xSTATIC_LIST_ITEM definition. */ typedef struct xSTATIC_LIST { - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy1; - #endif - UBaseType_t uxDummy2; - void *pvDummy3; - StaticMiniListItem_t xDummy4; - #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) - TickType_t xDummy5; - #endif + UBaseType_t uxDummy1; + void *pvDummy2; + StaticMiniListItem_t xDummy3; } StaticList_t; /* @@ -1130,7 +1037,7 @@ typedef struct xSTATIC_TCB uint32_t ulDummy18; uint8_t ucDummy19; #endif - #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) uint8_t uxDummy20; #endif @@ -1234,12 +1141,16 @@ typedef struct xSTATIC_TIMER void *pvDummy1; StaticListItem_t xDummy2; TickType_t xDummy3; + UBaseType_t uxDummy4; void *pvDummy5; TaskFunction_t pvDummy6; #if( configUSE_TRACE_FACILITY == 1 ) UBaseType_t uxDummy7; #endif - uint8_t ucDummy8; + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy8; + #endif } StaticTimer_t; diff --git a/bundles/mesh/inc/os/FreeRTOSConfig.h b/bundles/mesh/inc/os/FreeRTOSConfig.h index dc73649d8..90be50442 100644 --- a/bundles/mesh/inc/os/FreeRTOSConfig.h +++ b/bundles/mesh/inc/os/FreeRTOSConfig.h @@ -72,6 +72,7 @@ #include "ingsoc.h" + /*----------------------------------------------------------- * Application specific definitions. * @@ -90,31 +91,21 @@ #ifdef POWER_SAVING #define configUSE_TICKLESS_IDLE 1 #endif +#ifdef TARGET_FPGA_V2 #define configSYSTICK_CLOCK_HZ 32768 -#ifdef TARGET_FPGA -#define configCPU_CLOCK_HZ ( ( unsigned long ) 32000000 ) #else -#define configCPU_CLOCK_HZ ( ( unsigned long ) 48000000 ) +#define configSYSTICK_CLOCK_HZ 625000 #endif +#define configCPU_CLOCK_HZ ( ( unsigned long ) 32000000 ) #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configMAX_PRIORITIES ( 15 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 20 * 1024 ) ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 15 * 1024 ) ) #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_TRACE_FACILITY 0 #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 1 #define configUSE_QUEUE_SETS 1 -#define configUSE_TIMERS 1 -#define configSUPPORT_STATIC_ALLOCATION 1 -#define configUSE_MALLOC_FAILED_HOOK 1 -#define configUSE_MUTEXES 1 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configUSE_RECURSIVE_MUTEXES 1 - -#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) -#define configTIMER_QUEUE_LENGTH 10 -#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 0 @@ -150,11 +141,9 @@ to all Cortex-M ports, and do not rely on any particular library functions. */ See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) -void platform_raise_assertion(const char *file_name, int line_no); - /* Normal assert() semantics without relying on the provision of an assert.h header file. */ -#define configASSERT( x ) if( ( x ) == 0 ) { platform_raise_assertion(__MODULE__, __LINE__); } +#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS standard names. */ diff --git a/bundles/mesh/inc/os/deprecated_definitions.h b/bundles/mesh/inc/os/deprecated_definitions.h index 9cece988f..c74784736 100644 --- a/bundles/mesh/inc/os/deprecated_definitions.h +++ b/bundles/mesh/inc/os/deprecated_definitions.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/event_groups.h b/bundles/mesh/inc/os/event_groups.h index 6b4e72db5..990b95bf9 100644 --- a/bundles/mesh/inc/os/event_groups.h +++ b/bundles/mesh/inc/os/event_groups.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/list.h b/bundles/mesh/inc/os/list.h index 2fb6775ff..43e0ffffb 100644 --- a/bundles/mesh/inc/os/list.h +++ b/bundles/mesh/inc/os/list.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/mpu_wrappers.h b/bundles/mesh/inc/os/mpu_wrappers.h index 711393f6a..f7a53c5e5 100644 --- a/bundles/mesh/inc/os/mpu_wrappers.h +++ b/bundles/mesh/inc/os/mpu_wrappers.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -67,7 +67,6 @@ only for ports that are using the MPU. */ #define pcTaskGetName MPU_pcTaskGetName #define xTaskGetHandle MPU_xTaskGetHandle #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark - #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer @@ -77,7 +76,6 @@ only for ports that are using the MPU. */ #define uxTaskGetSystemState MPU_uxTaskGetSystemState #define vTaskList MPU_vTaskList #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats - #define xTaskGetIdleRunTimeCounter MPU_xTaskGetIdleRunTimeCounter #define xTaskGenericNotify MPU_xTaskGenericNotify #define xTaskNotifyWait MPU_xTaskNotifyWait #define ulTaskNotifyTake MPU_ulTaskNotifyTake @@ -126,7 +124,6 @@ only for ports that are using the MPU. */ #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall #define pcTimerGetName MPU_pcTimerGetName - #define vTimerSetReloadMode MPU_vTimerSetReloadMode #define xTimerGetPeriod MPU_xTimerGetPeriod #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime #define xTimerGenericCommand MPU_xTimerGenericCommand @@ -143,8 +140,10 @@ only for ports that are using the MPU. */ /* Map standard message/stream_buffer.h API functions to the MPU equivalents. */ #define xStreamBufferSend MPU_xStreamBufferSend + #define xStreamBufferSendFromISR MPU_xStreamBufferSendFromISR #define xStreamBufferReceive MPU_xStreamBufferReceive #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes + #define xStreamBufferReceiveFromISR MPU_xStreamBufferReceiveFromISR #define vStreamBufferDelete MPU_vStreamBufferDelete #define xStreamBufferIsFull MPU_xStreamBufferIsFull #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty @@ -161,14 +160,12 @@ only for ports that are using the MPU. */ (useful when using statically allocated objects). */ #define PRIVILEGED_FUNCTION #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - #define FREERTOS_SYSTEM_CALL #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ /* Ensure API functions go in the privileged execution section. */ #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - #define FREERTOS_SYSTEM_CALL __attribute__((section( "freertos_system_calls"))) #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ @@ -176,7 +173,6 @@ only for ports that are using the MPU. */ #define PRIVILEGED_FUNCTION #define PRIVILEGED_DATA - #define FREERTOS_SYSTEM_CALL #define portUSING_MPU_WRAPPERS 0 #endif /* portUSING_MPU_WRAPPERS */ diff --git a/bundles/mesh/inc/os/portable.h b/bundles/mesh/inc/os/portable.h index c76141e24..3f0ce8eb8 100644 --- a/bundles/mesh/inc/os/portable.h +++ b/bundles/mesh/inc/os/portable.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -84,14 +84,6 @@ must be set in the compiler's include path. */ #define portNUM_CONFIGURABLE_REGIONS 1 #endif -#ifndef portHAS_STACK_OVERFLOW_CHECKING - #define portHAS_STACK_OVERFLOW_CHECKING 0 -#endif - -#ifndef portARCH_NAME - #define portARCH_NAME NULL -#endif - #ifdef __cplusplus extern "C" { #endif @@ -105,17 +97,9 @@ extern "C" { * */ #if( portUSING_MPU_WRAPPERS == 1 ) - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; - #else - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; - #endif + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; #else - #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; - #else - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; - #endif + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; #endif /* Used by heap_5.c. */ diff --git a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c b/bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c index 3c0c8e063..cdd962beb 100644 --- a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c +++ b/bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h b/bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h index f1becb381..1f0c43a1b 100644 --- a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h +++ b/bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -233,7 +233,6 @@ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) } /*-----------------------------------------------------------*/ -#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) #ifdef __cplusplus } diff --git a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h b/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h index 1d69069c6..7bffe3e47 100644 --- a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h +++ b/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c b/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c index bb7f9cc4d..215a6a737 100644 --- a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c +++ b/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h b/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h index 65cd27ed9..ffa6654e3 100644 --- a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h +++ b/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/projdefs.h b/bundles/mesh/inc/os/projdefs.h index e0458619e..c8621737b 100644 --- a/bundles/mesh/inc/os/projdefs.h +++ b/bundles/mesh/inc/os/projdefs.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/queue.h b/bundles/mesh/inc/os/queue.h index 44b5d5f64..744ab1271 100644 --- a/bundles/mesh/inc/os/queue.h +++ b/bundles/mesh/inc/os/queue.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/semphr.h b/bundles/mesh/inc/os/semphr.h index 2c106eac0..53b158afb 100644 --- a/bundles/mesh/inc/os/semphr.h +++ b/bundles/mesh/inc/os/semphr.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in diff --git a/bundles/mesh/inc/os/task.h b/bundles/mesh/inc/os/task.h index 4f45fc747..2f322cace 100644 --- a/bundles/mesh/inc/os/task.h +++ b/bundles/mesh/inc/os/task.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -43,18 +43,10 @@ extern "C" { * MACROS AND DEFINITIONS *----------------------------------------------------------*/ -#define tskKERNEL_VERSION_NUMBER "V10.2.0" +#define tskKERNEL_VERSION_NUMBER "V10.1.1" #define tskKERNEL_VERSION_MAJOR 10 -#define tskKERNEL_VERSION_MINOR 2 -#define tskKERNEL_VERSION_BUILD 0 - -/* MPU region parameters passed in ulParameters - * of MemoryRegion_t struct. */ -#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) -#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) -#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) -#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) -#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) +#define tskKERNEL_VERSION_MINOR 1 +#define tskKERNEL_VERSION_BUILD 1 /** * task. h @@ -122,7 +114,7 @@ typedef struct xTASK_PARAMETERS { TaskFunction_t pvTaskCode; const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - configSTACK_DEPTH_TYPE usStackDepth; + uint16_t usStackDepth; void *pvParameters; UBaseType_t uxPriority; StackType_t *puxStackBuffer; @@ -384,9 +376,9 @@ is used in assert() statements. */ * memory to be allocated dynamically. * * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will - * be created and a handle to the created task is returned. If either - * pxStackBuffer or pxTaskBuffer are NULL then the task will not be created and - * NULL is returned. + * be created and pdPASS is returned. If either pxStackBuffer or pxTaskBuffer + * are NULL then the task will not be created and + * errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY is returned. * * Example usage:
@@ -1453,12 +1445,6 @@ TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION;
  * a value of 1 means 4 bytes) since the task started.  The smaller the returned
  * number the closer the task has come to overflowing its stack.
  *
- * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the
- * same except for their return type.  Using configSTACK_DEPTH_TYPE allows the
- * user to determine the return type.  It gets around the problem of the value
- * overflowing on 8-bit types without breaking backward compatibility for
- * applications that expect an 8-bit return type.
- *
  * @param xTask Handle of the task associated with the stack to be checked.
  * Set xTask to NULL to check the stack of the calling task.
  *
@@ -1470,35 +1456,6 @@ TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION;
 // WARNING: ^^^ this API is not available in this release
 
 
-/**
- * task.h
- * 
configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask );
- * - * INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for - * this function to be available. - * - * Returns the high water mark of the stack associated with xTask. That is, - * the minimum free stack space there has been (in words, so on a 32 bit machine - * a value of 1 means 4 bytes) since the task started. The smaller the returned - * number the closer the task has come to overflowing its stack. - * - * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the - * same except for their return type. Using configSTACK_DEPTH_TYPE allows the - * user to determine the return type. It gets around the problem of the value - * overflowing on 8-bit types without breaking backward compatibility for - * applications that expect an 8-bit return type. - * - * @param xTask Handle of the task associated with the stack to be checked. - * Set xTask to NULL to check the stack of the calling task. - * - * @return The smallest amount of free stack space there has been (in words, so - * actual spaces on the stack rather than bytes) since the task referenced by - * xTask was created. - */ -// configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - /* When using trace macros it is sometimes necessary to include task.h before FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, so the following two prototypes will cause a compilation error. This can be @@ -1521,20 +1478,9 @@ constant. */ * task.h *
void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
* - * Returns the pxHookFunction value assigned to the task xTask. Do not - * call from an interrupt service routine - call - * xTaskGetApplicationTaskTagFromISR() instead. + * Returns the pxHookFunction value assigned to the task xTask. */ TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - - /** - * task.h - *
void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );
- * - * Returns the pxHookFunction value assigned to the task xTask. Can - * be called from an interrupt service routine. - */ - TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ #endif /* ifdef configUSE_APPLICATION_TASK_TAG */ @@ -1782,38 +1728,6 @@ constant. */ // WARNING: ^^^ this API is not available in this release -/** -* task. h -*
TickType_t xTaskGetIdleRunTimeCounter( void );
-* -* configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS -* must both be defined as 1 for this function to be available. The application -* must also then provide definitions for -* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() -* to configure a peripheral timer/counter and return the timers current count -* value respectively. The counter should be at least 10 times the frequency of -* the tick count. -* -* Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total -* accumulated execution time being stored for each task. The resolution -* of the accumulated time value depends on the frequency of the timer -* configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. -* While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total -* execution time of each task into a buffer, xTaskGetIdleRunTimeCounter() -* returns the total execution time of just the idle task. -* -* @return The total run time of the idle task. This is the amount of time the -* idle task has actually been executing. The unit of time is dependent on the -* frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and -* portGET_RUN_TIME_COUNTER_VALUE() macros. -* -* \defgroup xTaskGetIdleRunTimeCounter xTaskGetIdleRunTimeCounter -* \ingroup TaskUtils -*/ -// TickType_t xTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - /** * task. h *
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
@@ -2368,7 +2282,7 @@ BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEG * Sets the pointer to the current TCB to the TCB of the highest priority task * that is ready to run. */ -portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; +void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; /* * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY @@ -2458,7 +2372,7 @@ void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBas void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; /* - * Only available when configUSE_TICKLESS_IDLE is set to 1. + * Only avilable when configUSE_TICKLESS_IDLE is set to 1. * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port * specific sleep function to determine if it is ok to proceed with the sleep, * and if it is ok to proceed, if it is ok to sleep indefinitely. diff --git a/bundles/mesh/inc/os/timers.h b/bundles/mesh/inc/os/timers.h index 06886dca9..57c4487ad 100644 --- a/bundles/mesh/inc/os/timers.h +++ b/bundles/mesh/inc/os/timers.h @@ -1,6 +1,6 @@ /* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -1245,25 +1245,6 @@ void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; // WARNING: ^^^ this API is not available in this release -/** - * void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ); - * - * Updates a timer to be either an autoreload timer, in which case the timer - * automatically resets itself each time it expires, or a one shot timer, in - * which case the timer will only expire once unless it is manually restarted. - * - * @param xTimer The handle of the timer being updated. - * - * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the timer's period (see the - * xTimerPeriodInTicks parameter of the xTimerCreate() API function). If - * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and - * enter the dormant state after it expires. - */ -// void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - /** * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); * diff --git a/bundles/mesh/inc/platform_api.h b/bundles/mesh/inc/platform_api.h index 3dc0b513f..7c2beb8df 100644 --- a/bundles/mesh/inc/platform_api.h +++ b/bundles/mesh/inc/platform_api.h @@ -76,7 +76,7 @@ typedef enum // when LLE is initializing PLATFORM_CB_LLE_INIT, - // when allocation on heap fails (heap out of memory) + // when allocation on FreeRTOS heap fails (heap out of memory) // if this callback is not defined, CPU enters a dead loop PLATFORM_CB_HEAP_OOM, @@ -143,38 +143,8 @@ const platform_ver_t *platform_get_version(void); */ void platform_raise_assertion(const char *file_name, int line_no); -typedef struct -{ - uint32_t bytes_free; // total free bytes - uint32_t bytes_minimum_ever_free; // mininum of bytes_free from startup -} platform_heap_status_t; - -/** - **************************************************************************************** - * @brief Get heap status - * - * @param[out] status heap status - **************************************************************************************** - */ -void platform_get_heap_status(platform_heap_status_t *status); - -/** - **************************************************************************************** - * @brief Reset platform. - * - * Note: when calling this function, the code after it will not be executed. - **************************************************************************************** - */ -void platform_reset(void); - -/** - **************************************************************************************** - * @brief Switch to a secondary app. - * - * @param[in] app_addr app entry addr (i.e. ISR vector address) - **************************************************************************************** - */ -void platform_switch_app(const uint32_t app_addr); +// NOTE: for debug only +void sysSetPublicDeviceAddr(const unsigned char *addr); typedef enum { @@ -232,8 +202,19 @@ void platform_shutdown(const uint32_t duration_ms, const void *p_retention_data, */ void platform_printf(const char *format, ...); -// NOTE: for debug only -void sysSetPublicDeviceAddr(const unsigned char *addr); +/** + **************************************************************************************** + * @brief Let platform do a self check + * Note: it is recommended to call this function in a *low priority background* + * task and reset SoC if problems are detected continously + * (e.g. restart watchdog only if no problem is detected). + * + * @return return non-0 if some problems is detected else 0 + **************************************************************************************** + */ +// uint32_t platform_self_check(void); +// WARNING: ^^^ this API is not available in this release + #ifdef OPTIONAL_RF_CLK // set rf source diff --git a/bundles/mesh/inc/syscfg.h b/bundles/mesh/inc/syscfg.h index 24c7c4ed5..c4bfcc369 100644 --- a/bundles/mesh/inc/syscfg.h +++ b/bundles/mesh/inc/syscfg.h @@ -13,6 +13,7 @@ * compiler error. */ +#include "ingsoc.h" #include "bluetooth.h" diff --git a/bundles/mesh/meta.json b/bundles/mesh/meta.json index 3ef86ffd5..814f14407 100644 --- a/bundles/mesh/meta.json +++ b/bundles/mesh/meta.json @@ -106,13 +106,10 @@ "platform_set_irq_callback", "platform_get_version", "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", + "sysSetPublicDeviceAddr", "platform_config", "platform_shutdown", "platform_printf", - "sysSetPublicDeviceAddr", "platform_set_rf_clk_source", "platform_set_rf_init_data", "platform_set_rf_power_mapping", @@ -349,11 +346,11 @@ }, "rom": { "base": 16384, - "size": 258376 + "size": 258236 }, "version": [ 0, 14, - 3 + 1 ] } \ No newline at end of file diff --git a/bundles/mesh/platform.bin b/bundles/mesh/platform.bin index cf17b86281d19676483eed38cfb08f55507295f9..5486c1035d8d686129a544e3ce5faa4fd77cfcb9 100644 GIT binary patch delta 73018 zcmZ^L34Bw<_W#Vy)^ts}Qo7_OX=vI~xzm6kOHg#w}lMOxf~fS@B> z(5JQ_Pe6ILKxHk9J1Sa06jU&RSQddPTlVCCCT)TDd!K(lpY-0@&dfb`=FB!bl5o-&FXa2&W#qc|NhC}ZZBXk_DXW@6LBhB*K9=c~~_VYrX@+^m9;HQOO=2`BI zHSurMNpZm&+Y%Bc)^W&UM|?7sMuZ-|c{`})=51w7ZDq+l!yA7r#0$t6JOo?GM*J+c z?oxB}Fb*ZP5)JOZt6tJmA#cc%qLwW3Yw%0@LMP%SRO2b7{yg~zY?II;Pny763TTWE z8SN*kng^5G5IvTVEg?nOiF-4z_)D7_g14T#Qv6bq@Rk!*_1@T5=&?4Rx}3c?^cB#x zS8>;^uL*J?pSC$kY-lo0Bzd7`&h8{Nq4@)y4&AnNK`#VB`5$o4?s~tSPtU@AKS7to z@<+h^=#Dza;Xb$H{%Z%h7pjYx=ge#G2t{torxubLmJ}1xTs2gB9oZx%WKmIn1U`{Z zwPa$LCitS;wo}!N5Dg~F!v^AgIUS=yax8Lk$6Z=f1|G3%T+~gBr;s5rdAJvO zE+!#tldI0+ZS0brCdANMvN>izavx7@BQGdvj34puwMzJZwIcKa%%Mf_JK`d~m}KtK z-d)MDBZ8ub9jY4opm0?t;#(rg3(4K^b+RRSKHfy)G#NOZlxQkAiHrPOW5hSekD5Gr z6fCaaZ;@brKWDqW>npw(R(b@Ios62n1KLklfhQ64ID2Y#2JAF;cn9{ z2{s8bI)@xfNfqw8v@r8i=_{^gM-boakg7~VG)?k?Ocl`DVM2jW2z7V*yEMwp(J+v6 zE|ZW(m$;iR`(Etq?7EBeHoSm;Ax#EN)Qdn!ih`)uKcNvwA_)yAtp?5T?>$<<2pzed zogEpWqc=V69i_uc$cK(np(BM^4IPbk8KI+_E?+a&a&)u*Y-?wCiDXo_$|&rT3k`Q` zrpQilLZ&$rS}4fzZV3jb({zi&Wk74ZCtC=j^ZaFvC`BujLEkmboWQk;gr)Yxh!mwp zrHx?Q2R!O%n7NECD}7xWrGZEN)LAApUv`wH(NX&mGK%x7a6hs8W-f>vNqs?Uav#5f zY9}dxN4U&P=Z{L5kKV2leC5cQ+TZC7VvuO#-rg^0(wnYNH3^12KFN>g2a6?sdx=>&? zL;5L)5&F90RW%~u(rzGjvsL-FK3&nG*JqoDL5;^8^JonEtF_sI;H@0<8XH-Q-+->N zCCmo7d^huOsAqzD7`3#r(j`!u*8*i^VS47cp^j`p+7^ptwAcZnz&sFYCplEwx+IP& zU7QeV79b}Yar@qdq!sg^79WSbLPF`@g&q)If^P2=C-R^&QPC8xW=k80! zZgXgb3}H41`rec{D&d}O8@=gjN5TF4R~^a*3R_`_fQ*t8YM~3ro)az=?8jA2;erfm zU+{FdNUzF~vAj3+c*qBteE4@BgJlS0@sM@NLr!M)2;br91+^3?8?wIkknkS8GFExY zmE#w>GK+Gtt= z1F1_zJZCnQOSK#<`|iywUAYJ$&TQ?-)7{TwZ9)QchIP;x7NDacMOmw31g9LuwD5~_ zmRO6`Cn|;Vq)fVyT+A|nC{ku8;Kzv}JJm48FLgW`VHC1yyr;bCL~E$c-@4NwDdYu2 zYhjoFrX`3TCiAo3!C@pUCzHG9A^mf<;)Uc=P7%%~skupb1sRg7&H2ZDy|qBt?ZDY8 z>hQF-PERZlrdbiuTUGRo>yK7{YrODO^7OD)(K(VOXlR!~u$ z_rU%8GFQ|6`yl78zj8-lyp-hh%EU9tlwNbNg?!g*Be%7U%*-2x)ub_RVN5OPLitVd zH0i%^3*z&e(OY`Dk`(mT;8|p1?;Ko4R`!m^Uz07p^Eii_{N6hm>vp+&%P=Mc=O@J6 zbq&3hJ-YDL@*=ice|E9|TS!iRe8^UJkSQp8aCsI8o^kn;aX-?SU(zFs-tkvAVxzj{ zl}03Dakrx!^%T;Dz*}(|t0hK7OM;E%=FnfDD;zsYz8spzM{8%S-x4BSk1^wY$zgjHe$0aaDlgPsNf)hQlllS};! z_(>AdUyC`C**~q1;MWOhph6(3cCc%Eo0Si>S%sy@u&^&5j1a17k_jroKnuz0{#w54 z{a!FVbTDZ1t^2ZSA=ItLf?^5dedd9T2*x{ade_Q{pN3o#||8dOseLM>^(j zELpyssllDk`LUgF1A72Vat5YN?(6u|y4{N2JbneM=2+9Mk>*I~JI`mj6@o!}(Kj8K zzUIa7@CJIgV{^*|rsPA}Ef*6cF;G9r$C%?QOr?7db#~K>j5<*w((PO<2_KY<*OAOY zTGjiMavW~0dT7*syW~En zv%4Wa+Xza;`-o>;4;SKikNr8nRKQvTjq++?xR@q;bdWX*88pt*t|o-|i~^&XdBsN} z3Nz!({wvm<9S^_InrlrrXTZY@CSwZImSr{PTaQR%PHzD5U#L)@?rQD@WhvfJn{Dy( zVr9#P`3m~J)3#XEh-s+@+b}KkFs7M6HDBn*bdCpuEH==(j*WU4Y}94Iv{O#DQD*`z zpU1?QR+>sTHp6wzgEutDEg@r06p1Z6Vb2^~^uhR*o-{hd@MLOot~ieKN0NKRn`X^+GJ^{9h<4ozdxbgJ^4V=kB$w_wfwfBd zBy3I|`vEV8|9fGa9{X``dwq}nn`SAJ7OI-0g2(=`M`FTOZ3(Vnr5^i#4z2}J4mKa? zkoZIjT}7^yXr{d22x><9u0p(!N2mMY9x=;sENHx{rY?;t8t+V?pE(ohXeZ|V_I0rF zsR|{03Vr%;Ra2M=S?l&C(x)ATw=N8k3R{cAPAN@=PnGR6(0oUJqk#?}m4o}?zsZ)t z2GBCT8(gV8RFC+_U^0#)1BN6m+v(z~6~-bIQ1stm!FsJ5}%F;IIv)K<4lt^U)JN_#nxvGs%wYAK;sU80;i zyi5<&yAfa244WO$S?qG$f1lU7+-qMUGoG0-_vy@mPcN>T!5gLrqZ-mSqGl+Ry*ltdMqi~Dd$(iV)^Nc42Rw)7!i;UD)PQ5PxcrLZ~-}M zdKEuLD$M?*-yzKn`|JwB@I+vMsDP8~PSxbI-zH0k>7ldwVF~yEX@>uK{rRW;d*?Akl`ZkO)^Gk3=T)OwNRFMIv*^IbXdX( zb$Z(0Z?IwBQq|VVudJ}7!_GNxL|mcKkNGI7afI9A%r@(5*0sfw6Lr>fm?<)wd4;u@ zgOrhq0hvr|J7run%)$N*i2qYYz8aCftm*?$3hDC)kX}-LPS z8gh(++dj{YjMrOuT_s3}T>2_>8njK?#-m(NPk315xfJXo{;vR0a_A8re?$IwBn=NG z%8{u#XIxJPni*hZku3#qpKi&e!ypyXq7@Qh>>z54vKEytaa%TYwvkkf%+dsH0%;9T zzM}yP(J-`JD)$sN&W25d4PgZNWaJF_T9D*#Bht0BH{MJ}l}3R&HKQ~S7n65Nx4^Dm zRMs!LW+URkfG!FXl7%=>3&5oElC@=t_-(SIEUomOFMnU8Ial9LSKk(jy3sS)ren3 z45Nzh$7I$hL-IxsFQiZpSZkeZ$#8^`P6B{z?s&;8&e*^egX9Cot7D*^+Q zwhR-xnp0qSyPc~Ysw$)9xI>LB@IMBbg|N1Glumn+rH>|oM)S_2nUd#`l>GQs46!|0 zHqhp%Tc&E1wylt1o3t%kRs@Pc3O((RwP|sXZbd+=Iq&cKNVbq>Nuj$P(l#UHzZS?p z=_hk1q~I=uOfbaC_JKhQPtUZD&L=u(CqGP>q+GGTYG^tn7_WGI zf7&vHc=GPV_=LUt{q_rhi%3tfxx$&$v|zugxxMa*iD@Cz9X9J)U}6egLS&OPsik|F zI-~%LT2IY;d0>B4VFq2*{IF7#?2wSdo8!s!Nu!6%^{jT_a>>>m4z6&ALt0gL8AU{I zP^`6pF=BJ23CcRR{k*&Mj;kUV`u@imN-I48XtvCwW~2;YBz1lXaZk#@JxS)|B<%+- zR#y&ncSGHrj=C`&b&o*ZIg=~Z@`F{)y*kvfb9*?{i(HyKL>c8|Dwvvbq~~M$gnWNC zs9hY-FE|f!MFleRSPe$3RTi25*sKujudvP*Fs}w-aPhGM^(a?<^Rb=fRymcr!SF!2 zq;Xe5f5s_Q6US%J-YyCJ@97GxIk@YwAHn|&;Cw#l3d>ieZI zdOTl^17zz~%IRgeLnw*V?oJ?=AMcBwAo?e=c)|BnVwI)VvaR^9Gw`-wgctYF+x{q& zEO=spc~Jw0f=vMbRwIStv@)Q7NLqr-LD1t(uhI+{Z4HKZr7BdIFx_;xbFzFE`oK_N zWEYXlDFyfoGHZ$^W4E_{3DPl*q|zY+>`kfFQ{$vQS|^Jz7wKnyRCbmp?{a=~5k;*7kgbuOtbA09Q;t*13^cGs7DHzSF=5kaobcnpsu zLuU@)R)>*SX3k~KgnKguZhr(BIO`R>hI~0|c*su??aZA!<7x85zF3lDDZu^79Lq$o z=DxI;x!)Z`RoMlPCux;^)QztEeR}iYj*Y@V37KD+npf(Swsk>qW(8Qz;{n>shwBg* zdxWS!-iVI8elC198Op3@y}TKr`2oL;zzES{qUGxnW18L6-PZPkU8L$<0!TbD*XeHO^rW)@W2 zsw-|I$d$HLAw5ka*XJauo&-pD`TZ^yhwtk8 z>a=tzx$@NGjFEGn!z%Lm+#JsCCHLm0Wd7xip#S(QEa+Mh{&Us`j^zzJ7)+u&y?VVf zM#ZGjM{W!#Ru>cj=KIijS}rOAWM1?UD<+;_Vv^XLxngSyZ_5g-dteB(d57aExe_33%+I}Uzi74=5GrV5}t9l zH>`FVq4E;9TtKO68@o>->ZkkQG0?(5=05#}at#2Z`9cJJf%IFXkK60Y7jCs)`T(Q0 z=MefBNzn)pFeol;mks%C~3 zsz9uCuK0#1GPgQ?WSUd1jfSebTt^zCfZUNvZmG&NBHLl#?aiR+9YjBOJs|pCfatD= zh<1|vGK&0NJrKV^42y^01~O-H60RpJ7B9r#5$|FR=*dY-H1L=MmL$dG!}N&?NcGOf zZ}}y=<}E3}QSbY;wv7te=_3kBi`vZB@pL^o@SFy}LVkNr%iU8E-*aohbGPRC0?zLv z-#%}QxC(4~Fr_OAUK)pc?TTM&$FZ$ov#FY`Fn?YQJUx?b8$(IAWmN_Jy#DU8Gk@-E z$6B=1(7gL@%^=yy`ujPagJ0ZM6d46Ajq^Upm60EpRls}BsVM=ae^HGA>&QDbX-Q#T zHVwn+9v{+{L7RVh_{z_$*ir`aVgvcJW@73|Pnda(@M!@6%w4cf2EG@b+Q6iewAhxw z9kMN8b;pp3+9(_;=1k-Ik%rnD{3yv;&iFQJxfbk(h0C?^2G2&YWSE4{2K7nWl5ZYg zx5UEJc(P;pLhcWMpI#h^_mKH7#&LH-cfIyv3I_1*lb8DRMQ)~Sgn&J)_%%P!bkj<; zIUaa?8-z)=EW27WvPKaEBKC+v)>144g9z^lg#U68{$-wPRFUGB-z-=GhGY$_T_e;A zYEfw=8$9+(4<{JSJ%Q2^SKcEQ%Mm0!J&(>uvcOB`wK*m`7(ijKyvTj0B5%I3guCt} z;jbog=bfbctE0i8vFz0$F>g4vOM42Hw`FSWqAOONV6N~(i_pR38#pLYjK}!9OCVz0USj2G|444iLcIqN4*`0q5I&f7e+xc~7jvW67Wm6LBipxM2w1NdDL`fV<=% z$r}f2K64DTX_w|(FvYm2>m-<-e)~UOzR>^<84cYfO(Ng+Nt5YS*nr;|i9aLL-kAu9Wb->Eux|0c zPDcd!C+cKvE3m9B8{M-%N-q5?4UEr-cjLM9Dw6(g6|NxfysN<=DBsoMm&v(zlkhXd z{caJ=%>nPtG0z8tw3~^~*3iFv-5M8IA{$46=DBvL))bl@MzbA3HjAZj2{uYwMgt7U z!+_JByr7}Ce1-5BzWb(|WmnsKkKlyy-shW*Pz>J0wd^|1yBdH$c2`Cw)+H(XdO29{ z4*Ny2tWJv!q`oc=qCEE1ol<||(TuQJw-(D=;><~P$@D|=ZhdNQp)aTr8;}hdO7Aqx z4>#Sj%bd(kv(+RuV%W$W_UjpaWWOiluc<|-u?Pz!@OWy*2sbavP;(DvX%%vKx!q^Hn-DSG$gErmCB)% zX^yGpJSh1K4B**_&Djf9*hGW&gAt?wxlQ_R<`v%nwwXc!#NVs|b*Xl90<491;hrbW zn}5SdJnlR;~#YK{!BunRfxZ%yg}x1WF6VZcaRSE-?! zoOP97I=W*(luV&C1h(p`X6808C-}ohWlcs2$|R3}m2Ghyv(ifSRg~U7R9{mHC7|gu$lEPX$dy#U{DF< z-K~1=dyagz^;^7!tlpLpo(+Igr|fe}$yeL@gNTxBAC)%6DF-=IRVb%j4rL2%_gBJB z*#k3#fmg|7>2?ENOEz!M(J^97T}^CK0~A^a=C`WDyooSJ)Fsh2Ke@NPcce}FfW$wX z6rH$927bijgJjA_L&83Ls1S^mj}l<99RFxc{MLu^+Z#y`>pzu^*|PaIgob*H}>sM{|efwYCac&pPs&2O_JtG)4iuk4fXCRYrb`FFMc0RegV@&+C|8Jd&{}>)M z`u=cK)u0quK#S4gplgF;bFAhe(JefTSM5-M%ORO=^Io;)1E#>!|9G;k5E`XLln;pM zdLK@mp2&5-a4H{GKE1zlMUr#>(SR`W{wE{t7ccYRwY!^AXw^ZPIUL6Sy_YSMhpm4T z8TH8hT1;D_54^TM(Q_K=m2wm3v7|f_Go53FnlYv12#Q}F#65Zo&2N*&Cka%`i zW>^^DQh;63i@yA31%L~hW%ffd-azjhV$KE$+}-q{?(IO06jGNDshW>ki(pqeTBCrp z?GQ^zJ5px@DXt@R@(>3#emsP=N2^%$*tdrmg|7htZU-mS5TubrA91&X6Crd1>~ENq z?ly#Nfzhy0U5D!}v3{B)p1i#~1xv}{-J`%mt8R+oYJ8+y({u>PS=p3;-y$D2Jy#Y7 zp)dJD2w47P#m`MUs(e|haoEWdVC8f-3~#z0;L)bqQU)f58Gqo)$3 znOEU`GF`!T3h|>RNzmenWWlE+m2oa5V8O}sGji;-{NCjev-dM;MTe%+l7k36PQvybHoV~o3Cuz1wU=NHf^UG{ak3}8cj}>i zinQ&U%z2z-2Jup`;#ER@4)`k%kn_lvR9l*fA-2u zwH9+?ZMjwm%|`Tj2b)Nl^lJ0-Fo{%6ne@SxL1+}aN&)psSd15#? zT#2lRXSH~;_~0NsjO;tOazL$H3QNhKTPgIQU%MERk9igahyd_sk$}vv#U@k_TIJ&e zsF{t{B0biYS7yOGsBKQtj|I)Wyn?yz+v}A*RF4bPDd&hpt z(_ZU_n-fBW2(z{>ks5sAw!(XRbMl2?de7g99I<^(0sC4aM4Q^?CQ%6pa@$Nc8(~9} z2cpzWyMP+Wn|Woc@aZFAfiUhAJfU|@7W8#gr3;au1SEpK zx#*}~SMOnly`vfPe3jIk3i%sgyLU8q2IQQQ@7jN~9CL@fB=PfZDc`&Gf_hUlDA9N9 zyZy{x_l5(3l4=1YdP6~Ge)&Xxt!o~Y2Nbgkt5Haz zoJ+fyU4vZ}fvenwx+!hwaGm9=YhU4PhgQW(Z#s$R%fzlW=i)%4-<{7SmM?B7zVSQa zj|2R>-bHf18mw(}R#>y4_6}!#;JVGpK?Fn+-Qr|{7D=>zm-y8c%)Jy(mVYxa>vOME z;2{y$iWMRRSJZM+%yr$Z`;$PWL)V^|wpHp7qE+`bHaMlD>V%9!mV*CV}>p^j)f^)LQ^? zMS42an#jpKn4sURwx)@P@O?2nkrD zb>$dRt7lQ73KmZEH|t^9CCMhJ1HFl(Bg;K zdDFF(1hg3Y~Q#ChVx^#{FSV0%~Ugg2_0UrRWVl z$3$?4RGf^D>gGWy96%#3`-?s;M3pAeon-aNv@SuOfbm$8OgF>Z=rjX9aFHKQo`;~- z9jA%_>b-eN6E)l24#6eT@dxFgek9NeqWvifk05zJO<8sT@XQxZu&86aHG|&sWI*6} z4n$sOP@4xsz%V%6?=uJK8sSa-l>G55h_!di)oWAP)jDkO5lJ+C~;>o(|+PXp2h`P>3^V2`M@q zx2z8+$T>hDgRY0cWF)cZYetOxS8A0c^ph8v>Y$*B=@7FLNl!T<>7PC|1p9(zBsD) zqwbOxHqoL$-NZj9CH(~9N4wi@4N|tO(8=o&sAg|>ypaUjjr99jgP$gof6khraz)ZI zXBwU0t&wx5Vd3OpTj?EC)YWv${;n^9rg$tuBwgy13TQ*|t(&;;o^+PA7@xvCnD+du zI(7YB`*3$(U=`vM=t>XTAiXE8sJkaEU%nGV&T@|t!19|v_e|3Uf-SMw1)`SHkz2VIe(E5l*#U^A6+Qj&J+x{V`Jevi9;v3Iq zM6PjQz;Y9*(IJOx0=Oc`&u8<&h>iGFn>Nu=2BPhV_dcjZl-*n)`F8Qq#m`r}thpdN~S9q6G66tbs z^fyC9?p{c}-$|+)x%=Cwj8RURkPK>Mja+d$sl$j&1f;erE%LL7vIP38Pae3wN9O;Y z1x%^`J*w-r!)zCoLhxQ!ss@m;lcqDA{P25UOo{SblKQ+4!%|M5&vsng-2mGk0KGM&`Fui{_)uSC z$))oHlu`S&)gG7=5hUY}iOLJkip6b^I!{*rk(cnf^R{`nLxPl6Yq9)<(ekIY&T&X} z6Usj&=l+OOl!I<_*Zu`@|4|h8iqmLW>nKKrw+q!rZr4Pb6R$(P=g1h_5C}2aXuF0l zkeB})4qM`hKVJr%=g|v`K-eF@Ff?|=9SJg(nEMVHKV;44kFJ^!(ef?rT`GjC8vIUbKe|3v7!mR^-Wg$}Z4g4m+ubfo=^(>eq zfBqH2{ox^wzn%z*^>D%!tEujm{SK+PGz%Xg$1bgif6n(OL^p+^)sC=+)sFDOu(k-y zoKgld=kGju7a)5%c-O!GuEFpOsh5+u!xAD~?gfkHxy$j~w-U1ca`&zYFs)cTk|F^A zOIy-~SaTe_SD%CYemSx4O-JCR*Rm?kfD`uK>7YP`3y!wd@*2!zTX_w*(dQ%nDri!j zQ(?D+L# z2M0;NHUfW2p1qcYCzEy83Y4$;nU5xj=8|8orRGg@{5?|&zPkh}aU?)MJ-dsADCoN_ zQz(*2uYIZL-iLX9yVBc!wy5)=Tuyralg8DAkthDig_8zv{9^#1cF#WPt};x`Zl!74>TrOzN5@WHfL69F>$tB^-sGVmO~2t1A^gYISZ>FZ+q z+XP4}-CO4sCU2d^1goR8D@{I751L9>N?lTP8hi*W-lcPN)5(^5Q!>AT$ZaMSgHJ00 zQc>QrshVwcQnL)Yx9xk_Bughb_9^%s@`l|2#}W6~wcyM-Yfl5kMB>O)&jPXLg9wXG z`YYMfm$V1Gu5wg!HyuRo?9QKY*s5z4s?!(dE@*t%a5Mm<98Zrq$Y^JGY$D5?8o)%} zclM01g5Lo~4(Io-fayJs{OSAzChHrnl4T9B+97;I;7l@V@E!>q479?sRW(^5AgdDm zi7iekcr>*1d#7}JWuTrK989d{-atLpGAPipyqy-LQ6PN;(#)oWpiIk~j>Y`)Vy;DL zsdX$yRYU)EOTzjMhRRnxj93+U+?~OlQIgl(UGYh>#jWQ+h<)qc2{ENhJ^CJNff#E9 zI0necB|w5nISG=Qm6lPCBUxPeFiUay3QKJ{BTjzsBi?fpVT zv>>f(vnP=VZ$;UL`{O?2W<#k9q;cR`e+=Znk`Lqsk0=LsMfeFNw5@ir|BGA^@PC1e zldpU_5It9Xvp}Sd^2c#|L&$9Z$ZqVxcxcBM z&cQ?1KExvoY3tMgU(Wku<5|@xAz0|_g1Fk>yJ}q+j>FmO40xfu5J>&&*1GrbXlz{9 zh6!g45nsXhJ$X%_KuqUw*Vufxe?aC*XMlOZ;v^0)$gKLWGGm~u8uH+*CSjeoKV2f^ z2Q^znCx;VqyFjtb%vqF{qmEpDx%Jyu+AH~C&ayF=!+dLhw1SS;FA5Tz3-d%=!me9y ziT{yc9k(G^JSoA$@S|dq6dou+%#&hsl*Jz$K+_PlA8c~qG6hW%-;m;{s4<>vt$a0S zynKR1@Uy-C-{KxA)<|{K=@);M;_m7kH&dWEssh`GhqFOl#5frqh3AWvGCYL)!6i1x za1Z>9_=gO~XO(*DSL5yIO$Ffpc+2`WpnRN?TZ1`)zxUm#?jAE}0ZGxF#{GMxDgd3;R`I^%p~quBOOZ zQG=4|A@>(oU6PR=>S$S)blV>7t*e2R3`Y;5!TL$27hGbf5}UYYm$)hncM<0*aWoDR zUsS>oymcLUhm<%H4-ii%G58t8>q=m&NgNc6d*UAA!eE?%mx%8N!&?j$_XOkA=uf?f zehY?16&$dF;~~(=O{aJ(75O+`xIDx9rZI|zBP>L^v z;7Ktn_CX{JK$Yu;V|1ki!%|D8gT(70*vyS^ioZtzk+M+S9jA#)LvaD?ITZKfZaBm{ zEcX{t8wR6m7RQC*JiJL<83u#AA?^vo8vHy|4af2%NzE zbU^$e0;j~U^`2`D1+dPx8m(oOitlka2&&x_LsU2o|0?FGuvX3ckr<=rwnK2RfJHeS zFV0foiI0yvkOEDW5CjEkcPZ=z2aJ%`t*Kw3YzXFA-Yt9m{`CK=mu$N z+en1g?skme>sN64NEkqtn54$>u~`SQ|Es$0fR6s{6-TH+oc-Yy=c;k{F0c7Q0V3h* z06?)w^imk5Nsv>gN8G8#+v5~IumG#e_L(4kQF1+DBK&5y?-wi3!_1^?87p$vaWli5G})3cWGP)80UES z@t_e*@*hdwS`4g%G+JN3B17majD{zALOdLe4TeU4ji5836pcZpi_I>u+^~=ICz}dZ zbOV3*Q;up&OXCgu`=T-iUeZ~Y*ewQ6!taU|u{c-U6@%4=qW@`r-q+qd84km?H_vKs zUfI!nGHX5ttHq{RTogo|3vDv$b&I}OtW*33fn)J>u$UT$H3{E1*Ex7(+IQD}+{Zxl zcnGC_r`0HQp{vD;IGluMip%1#0dEwy#NmFC&w*DSUh;i&&??(=D-L(V@xM48Xl)Sl za6hcG7BHJZVpTluk5`L3;(^i<@l-s{!4;ycE6lbLVpdoDXvC&NOx@{JcGfc3D4^?z zwyyZC_yc~`h@Tw&F@*cK7#F|g$X8p7l_wJD9C395@a#ggxIF>)kgf1jdyIH40mt{h z3_wt}5J#P0MY8K%AA(~9*&x%_faf{@=F)L{rH>4*x-{V8e;uPb7b)f@VgVP3ixXjd zDdOftoEa5%c!MJq*A>f7>I4Iv%8jK`@nRxQ<)}{#O~Tz{Gu;~iL2f9q!haQuFBzIh zZ|)aICgCos&*0%6`0jp+7N1GNE|7HdlW{_3)}i*pcC<)N-`UG)^(JaR2~p4qCm!Sv zf&3)M|4Q5kO}d7FYmycv(^f|Jp*WU((c+C{T%$bH+)iee_^bwJCTwm-5K^E#9Rv!$ z{B-%^7&AL6u7zhRMZN}oai$hPWkjWrOQgS-q zJOt_+yvD^W$lq_bHZ!jN@>LSxnx`m{{t0-42cF7$qWvg7 zn-n*r_q?D5=?SZFwGPJ@={!z5NOaVvg`K-fpsQT$Xhs}Z0lZENsLHQ_qZ)B^9;Csq zhYj?EBh6B%3l+?X@unO0@nWkECl%awtIQI9bwMpy_6!x77C@b7Q9OM*fCI+T3vNy; z<6ZVcU|>E_#!JKjdVD}r>W`{73ODTO4pn31NR$#})6(A@YJj|1u11VY!2`Ini}s99 z!S99l`PE$`uoH8gHdltVIAGq!(BHvR!B-W5UIChU$sPOn=2-fc<&50PaPY?jgB=-5d%F2@U}p1WtHdZf83YG< zV(61@7OcTapLQcDU(W7^y0w;|lFRT=S3<>Zz3{Jimk66!lm-Gz4omb%cefSk(K@`Y z0S=UMx_H4h6x(jv-xho3;hxGHzH?V%Rgv@qab6yd>lx;U6GkYgacgn^Q+taCocW<~ zLSyM2ew0PHX*c$MsFt#CL=#m8<~UaUGH+Zeau zAA6yH!ajCjDHf`27QJ~mM={n9qe0PPUT-`l{!!ndV(FRW#3Oaa$kQz?X;@`@k0bnHZ6eGeckW4g>r$AKK3M zhzgc3OG{1;?Fd+m#;lSYmcK`g||}sPvWwC*z>Q7yYlgjTOJx(icUvD5)B0kAc8TZQl^EzP+tmylND6QOubluK zm}ROdf`B`BeZ;=jlr}x?PtaMzBmf+6Px({5zw2hOU#j+pW%8gqd&6QD`6_(?w;uNmTJOkw_`LSRabCxj`` zYYqgMa?{R>t^IH+?k`64#}mWK0gN^a3Gn(X?kusfACA&z1Eq@)W&eP$$)0w;e%e9e zkoZx5tjE8LKlaCF&Q!PhHg=LaL&v0PtiXcpyJ;OoS(jp{Km# z8kLX}LqGPWfm5f_QdFL{1TV<2X;-n_J>r~!I8*)Y%LeeKazt6bvfVz3v->4 zJ|P?ea@rZj0(&>D=?>?5qp8Hh(FpO&Vr&?L9k1*(-Rh5-g)q!F3dB|nUF`1V$k(tt z3xtxe>vRx0etSN|{jpS~yUywdd!jux)m;z%(HQ!K`_I62k~p9Q$9LHq5WkFRV;=I? zTo16V4u2#@48|4VFC|M+qDG3Mc`5pf7hf0*BcCYl8jNTB-=c0q@RMPQ9=RSOowZ8% zxi>ewkn#AKg8*=RjNZ&w$~3KD)4y- z@j5h<4}^;6-J(jsWAPi}3<399CU4=ceI}P&6Xc^48yB41X-+)0lS`v#ks;P5gU}KQ zoEeZ?U#}IcKh(Zr4PXA1b>wpSir1G5D}Gr1%8Kw8zgnTnekyU~i`RFqEB^bGgqPcZ zUZBCFhW%|9ga}Lx2ETU-#H_|T zWTr0JcDu3tn4Vb*j2YJa5>RGLn)>97DVAxK)4&sg?us)^uokQKd}6{wF{Yy33|;*$ zYKDO#@uOHU3~TXPaq=)c8C%6Y!*I#4T$qvUdr(pVK4@bpZ2ZTr1SQfBem`c7{bLW^ zCo>_~wORjf297MT-rWb_oFVj$+PdIji4Bf;mAXbW4ad`An(i15JJnk8;&80*XLCwx zWR1AnD^+z4Y0az58(S1j^PqJ&ykh2}4g>eJR4>y?VFny?%4%S7fEOZ~>cyfFIKJ1X zPB~=NIV5H6+2IEOdibA)n;&ZE-7mgA0>6;l9iTM7-QmNq-TwEil%nr>G5rzzmf|XW z)*+f!h+jSe;;c!$@(3=7tlQ7eE?TUmJT98g3sLlYzu0Re&Ign6sgd|7JYQBRj^`R~ ziNi|quy6)^G|VxxItG=3#8{?WKMyC#pp!vO0OXOF=tc)hr03}}y# zy?+dTf?d0g#mVtWPAmk~U9-RBuLvBVW(YM#u~aRN8jDNtByrtX*!VNWn_~e@fJTwy z@YE>Ax2h)92o|64la{w!wP%X2j>CCztY90GpipiJD!n6Fz=6Z@y8W1VY8+mj#0uLn zH^2R`r^^TqKKHiPIT@6ZYxbGq((!l<>)_;goSPm57*t`H1f5%l5l5wmI6Ac%K}eMc zoG|Ush=^HkOfY$JzY$>%MlJZ7V=zkK%5DGD!f=9E`x_qiTmV#r2Qk^uTzl zn!1mWF-Qtt_ar_Y2D4B6qW%`JfDqe$pk!?U9V06hQhV?M4Zg7HIs zxBnc#V=V!^mSJjs_?$rdSRBeusL^l#yd$sSp?do|@(Ll3O~`L57>p?X04f*jCw3CP zfQ_Pa63zs(Gj%f7MzUThP(1@b8~iRS#YvO#CRW=w8NV=)2TBN#zI?cr!7m$r6X0iq zp96jfe#?9j$OKmv{Hoz+g8J?LDRKW}cv2ecLjtIBOS#g*So8 zcLmRFBn4cm97Op5aa=hz#HDvAFfsJ#L%Kw<_(nP2nA+-51c)8*NQLmgD3zz->kt7~ zk{;BT5OYZTI4gi)y12Lk_Y3tvv=NJ7ilTP6c%%Y%!TI9Z3Tzl*@x;Q%qJmUqfTP@j zGZa!4tMt7)$`%tKtvDSGq?r+_04ELv0C>`@tnPW|OK@fz;{I!(4Iq2IHNPTp*i^hE zQ|6I@HP~jK0>-})XgvvCPXsk2iY|3mSs?yaiFOrQD15H!n*C$3Z7NP3^qX4^zCkI( zXGPJ$>>&I5`M{+1vn#A?8GNN7l78ccF4x|C$P)Ylj?uyAZOD;Uke$=;jIPTddbBf` zWHKDM?bO0{W74C4w}ME}dH(m4If*pyp{nQcgZT0GPv%6?38HyA@Dh;P={TyZ!M)XT zbjkGF5`1(4Q}x&v>sUu$Ve!4`cqG^65^qe0WoS3~k zR8W{P#By_u3qF-t5*mvvypVmc%TTV-*P4A0Z0e!U_W(x?#B^0c(2n2!H+(*&s)^Hr zuh~A{#c45IN4vO`@|_Z`Ot@+v0dV?NyFnZ>2j}(t(38JUZsv61InuUpbjAL@hsDRK zn%j5nwnw6#QYt5G%Sbw!ep}s0(9r>Ew>!OrGVEc zPT#O!^YRu}hP1cr8v(V+FT7*-ig|N!AMUDJoI4lyF3?j?fKBY9WKnd39}94%E`Yxw z{dN1`!%QvI(b*n7y#=-b)0KX9v7B1*+*};@$S>~pZ&ZM*WMee_9!{mh!E$)r&p}95 zyUN2tcZ0w?8BLGE`7Ty#j=QipzZnAe=bK6z+-+1xpN3X?x=$>chohE#;(bsA{D)1f z{gY`?wD12J-QR~0eDG}Lezpd|_(4TiQBE|BK9Y{`!m&(s`*VQcglQm!FII%ZOmy3C zx{llqLD@CDr7+QLzwAOvV-3Shs|qFBNLneLnuiMv&wl_BvQ2W(O;tc{A;@I*!9h91 znmYc(OU)h2qz}Y$8f+| ze0)Ci`Mr0)10lQp2jAb%{`*-TMCs>FwEp5UrX@}Qxa|&13CEh3T;hB4@#|rc07t3{ zK~<;R-Velr1vtS_*8tPFNd_Mzl9{gB1xKKQ7Bn0>dLJvZ!7e^TT)Y5hM4a*#-LmEu z-mAsICWr_YcP)Ug9yuE^`d~NW>%?4*)``te<9_jr z{k*k4u`r=#C*M*01Qb^_*NN&ypqp(Hix%M$#api--fN#Eu3UttaL6zIvk0dredVhT zsIpu@m6ht*H!0v-4B9RrUr&lXpTXvsPvBU&?seO0aB*<@HB(ndnXcGZh;KZDV{lLL z!)LHQ>J{IgtEK#O3%6aRuN$g>(CK{f+%wn^Gt4CeNbC-Xprfnni={2>K1ck2jD2}r zR8{!*J!fVZ1_l{G1O(&`iwq(Pu9%vG=m>6Tt1Z^xQiDnk+5)8sE{R)dX-6{)TFtT; z%@WhZveL?e%-k|ZQ_sfKm2;oWnNJ? z^r2vG+kw4wqs1pDcpJ9HVDpw;P-^Dq>1JM&>m(vl4-hOME=1QhaxyMUYl2 zTn%D_)g1eV?<-0E!%uiZiv04Db}|zcc~IjNysbvZXMIitvW*Diz)}6%+RN+h61p0K zCH6syE0sY)k;A&eCqL&gITk8|tfy935mx!2pO@Le#U805oncF@sv_CRd@MQ33I+cM z)RBoEr^N+Iu9;KdYPP3}q;=*=IE?M$hB2eZAk?I*GZT?cKG_KCOBJ~%`7Nc3Q?-$6 zo_N`!pn;e3oRT+2H|nyd`9#5Bu?cPJSH;K}&cRF^Z-hEzVk>{1yA+ zSx{`ammPbS+!=8l?C|TBc7<9s%Xp4F)G-GUjY6j2q?z3?Y4zyKP%m5k99-Ocu+Nbo z<_zF}+7k@5bg0v!~$z7UDU=AO!r=BM@_5$1x z*j{>$Ookohu+lxxfZ_!s?nsoh3n3vARyDpz%18QLEsZfY0+ONwk zpl$Ese=E7ZBYUET>`ffBD?Z;KwV_&3(p!xj{izdo*ajZl&uq+m?8U!@_JwzyAeygr z>7}dx3*A>WAN~c{LB2MhbWV(bwiZ-c8SVTW226xY1B0S^OEs*iU$LL(lQF%=`4C5) z2Ea^Y`ngBwVQ3b*hCojotB}O7y7ThUz|%=}l?_90{>~S(RTr%7A`C6%t?M4D}k+m)$$qB!EO_q8{7RYVH7>G&c zYlC}fQS)Y&ybwfZWBnIG7(C2Y@n7B8hYQI-GM%+9#1c`)5*9&sejgjMh}<2v9(J^W z&8>2$0DFBA+%jD3hec#v#z&relnlY(h;S0It+nLFzNZCjObpUC?=U<+zctU&Dj#7> zUch94p8o}6jI8%Lt#vk2BabH!kp{6pUqEfGEPOF}F7{kNtoc-l5RA`-4l^fJZ!yjb zk$z|E7n9P0C>{w`tplhZJKpGSenpp`nanM=vs*uI4n`jDit8cV2npORrV_X&|cU}PC2?zQaE zW#l;4)q%@NMwHKQb0j)X0G%!ESrbqqKVcQiq1$O@U*Ij(y4mUFq^s^YM1a7f=j9wQ(}BXB3iSC!tl>V)DVAV(Xi*^7CacG!x9b@ZA%79muS%Udmg;BsZBIKeOYT40(^M#^9=On%j5u81o z0r{+_65}UCcUWuY*C@kUXqs5nOE7a40~I}h$>Mkk>V?7Vz)R4jc4k*zg3L3WMXZD% zl*k6GB*xgijeHu#ScEKfGxwj0M?0F>%#~!>y{q9X@PLw;D>(Jep}}CBwIj?Rw)2YG zxm>ZXDg)U}@mi}yNffLV;0%j-R!1_`Pu=Lm^X9S{+CHsjKwEb#rJJ0tk!mH5uX!h`Q%Kdd4*)B?SedMH@C_;V9HQE_sxBD z#tg1|=G@I-(W64!+1;<8Z@yzsy#iBTw2!^<3V8(jaNjFXK0VB`SCho-zkMNgbwxX! zMZ!y55MnXIxK3xSr4w?|XP}{(2IQ8-Dpq3?^$h!9HOYwF7monHhYsk8Aov#|5omdnp9b<{Fk|7!2`|nlK4Teo3Sl+2&Wt zvV@lanT^+)+po>nzK#yV>wGqzK^C;K#~B#aWVVWtxHvuREaHv8IH7H&y{Keoi>e>;;*yuUq54`5eeJkt?e1=x0gM%7Q)j^ z76sxaFR{FJpu}fb$vRM?g*~^9JQ}yj-$4wQ26%HFl~p8_({tywet7}A%9A#;$k)g~ zgFh&jiAGv;|V0uyAbaY~4g*3tnk z8|teK=)0v}VpO-SwuejKdF%irSW8J-T+l_&FNZN1E^N>yWv<8QKhEx5Pihih_=1yl zkYdJSoHIDxfa}>Ku>-rho{S>b+2GgFZFjQAU&nfp$X2`#P4WrW@;dCJ2ie)zu^C#+ zGB?0csE#e$0E_Q@wtEBVn{z)Te7>IE&OR}Py6@Nq!e6I19vqaiIe z0YbFFr?q4wNPp-xBjHh7!~7*cpct4MiJ<-T0FQm+WZ$z6T+7Nv)e%OV?9Vz7$uSmL zk0ttDmQ{}`jbkPCWI#lYiw8OtTU141Sew?=gR~a2ZS~|stYf8bky7kLzJ7}wj#;Wq zz-mm_H7G9_Q;N(A;y?zy$|7- zjWPh^2jrvvBJ|BQcJdvP9Xko=aku->d^0Y340>@qOL>NCox|31b{cmcE;X?FaoN2m*nW~3VQderLipY zJy^irW((c}O*S&ed+3{RcHlkIJ93qGShZz-J2&Yd{ly~RC&Obe2ly!ke)%D<2{?=f zjEP@9%*x&;Z;7W1!g6M2g6X=6J!k@v_{R{9|+gTVd6ha@Xx z4z%@nma}o!U&Ybb35B;pqex^D*fkCHhu++9a_ex7G^HN(XqdJ@hfEa+%Hj7<}Lm z+x#)sqvzQ-AHxA|5li@lWW@Z^m=+YT3=od_`W69g(D+YCR^}5f&Hu%F=g*3*ZJ8EHV)zp{h|@-A$iyBkP$#Ald(98X%Gdsd#q9D1!I4yABmPY4hB zJhF!6Y{f!wr|-WDL5JW%ppzbB4{arL-nekh-y#c)Ekk@hRGkb^BAY2A4;-K@jZXWiM5JSj8R#jjX%RVE6v3l?S30@fh=I-KSzPxS=r|h?O$T=eoo%RJQ%*6$gyMmK##;Ovj#3OyAY6`hp62`Hog&A zHL&tVq+h{4z@`5^*=j*M3bxRTLh9X|;R1KJT6rXj7(oS+w3FM|I2X5X6EeD6NY{{y zYB55(hb8X75DsC(caZ+!!xbT2gT2lf?3xzufE4^SYuQ0!b>%KSwq=Q+$SXTA&v&v> zUyv^nIzV-4nnN%J$|2Ubp`wOVljRJy^(i~C7d-XPgI|LVU+SO}t=$YLrY{O$kTh(I z7%i6ZO@>NTNzbzBJ4s>24(Q0^`*eVc#hi3TUguE(stbzJ$_B@$3Kf5ao6i~fMRsr} zhDl~^J0XHiW0QB0Jlz<7$Y{~3l8V`eU1V~^F1K}tVNkpyK0iW=U=d%EjPP$=`cwj+ z7nKyp27gJ08*jJ*sbSdRsHAl+XW99!*0Lj8S1W@IK%u2+MLPHuy!|B^lebl&s9}Wk zl$%IPf>;f_#t~9EM29k*yPy>xYvpdeogFF|-6JGShutK3>={fH4!F|CZzvJEh7MWo zu$GA?(Gt}hkl%uHgI<~(Sgc4^lMTnafQ7~9Qfz7Y6TaRCQB4Q)wc*+yrWQ ziRt!`zJ+~Up~cRmL@8Aqq5XyB)apb~6e7hP3q+$xQp+gB_Ylbr6wiAlcr{5n`xx$#33jNK?U$B_3!>yV<*6 zk-~62RO`PgD+Rsu2fO|iW_}UN_?nd78Rz2LNnYt35EU1Jgw(s>=BStM_Kq*+BXA%v zu87Pq&nUTZXT{i}GxAVnWQjdJbVz6EZ$I1nHQaf}v5Q}m1oauYqryV>k{-tI1J>E^ z&OST4t9@n=yY0-N&eA4-6T&~$ZLivK&+gw#(qb?9O^(&dorL3bF2pq)l|Rj1+Dm#G z()|X9UUGO9I2T`$WBlx=y`)plXro%V>?dfd&djSk`|tL?hM^o4{n9g`F%WFG26VKG zMSVkxjq(1<#x=?qp@UObELxVNbe1ChxxptUNF^G{%AWg%^rdhc+VTzgtambu8Rrd4 zw2_AdQ$%xiFgFwOZh=Y-z~YiiiN|MpDa$`+*E?Wadg)uX{#%j|&GjNfF0>xR`VU1O@3f)-;uP03m!gWzr*PKDWCOm z9z6__lLB6zw~zGhn1PS?;w6{zhGVT)WVM@B?jxz0*IZG~0*R9OO0$7lRKYb=FEx6g z*tVOm%_;?#Ht6B_uxB61Nc+(h`JcoTi9OVp^X z$|J&7<>7IA$-6@hM-3o0$z6oSwUaZyuL%R5&Mnmo%kER43*x& z;XrkGW+p-gAHTfd_`Sj={y<7%N^7gPG+b;+AxEM!!VtHqm*BMc0~unxq-ZQ>TLsgf z(1R;(XDi?8NHs&R=}9-peTv+RrThq<^eG$oBV?E!Z2FHRJMm)=9O&S|@DZZrhF&Wm z#5ok_XK+-+3(WB&iAy_y%?Kw#Z86MZV(pWBlD8=o2-*S=YC|2cSFnpek}(PI2JI5J zsWri(!!*#MozvO)1K9BFVN(x~w7j{2PR^kc!OU%j$w8IMyKp$xpVh(Pe9||?xDxg> zn_Yl3VM5y&Ydk;_AIx$+3O_lIk<%t8FuhbAoE(FKWc6=hu`VqfHJYH&EXMzuTWO~S z(+)=3Vc-RZZSCoK(LROs_zBS&W7wFVNaDPcu=fzV7IZn17bQBB(NS>QGU%mV!7MEQ z5ZAv&exv+vMRpFRABOY~-zt)~R)Zop2g@)7XNWeK3VjxAhL*Mdgx&Td%*X3;I6wh$ ztHRdz7u?ZiwKOXLx=qtK!@-j}OWCe`M>O&TgDKKV1F+oNcR~4Q6VjTLu2J;}{_YmV z-3a)ya_6mj&w)KK7Q0CUaD(1Qu41LGnV59V`czIPCX70VwFXv=sg1Fp$y`LR#5O}P zEM|S1$@s(_ip3e%_5RAq?G{@e=D~LtS?u0} zkktmWRR>90=&3U6bu~Fv%61+k!=eWLH#K5xvsl!xq=fYTy!2Nxgpi4>{t!0nMt1fP zd4_(I${zWR?11o>a2UGt_Phrl#-?N-d+0DkxdCj^Ve$>pvr$Lz(8tP-kQCh;TpV(6 zRpP26*l4`KzBz(z>r^)JC`p*NJ;)n-{fC}HF_s}fP#Xo_SX0djeUE)lHGw|jtzg=` zAdMtg3Xo2Vbp62^&8Z>9=A_ed94rqam|(cHJeam8(yISM>N=!PLB0j{8v7nQsj#xP zqa-q|BA8eZa&KiFhO8ryRD-N}h6&P_Eb|z|z7ke^j1(6)c+ZN?r#2?`ANI`_zuXf# zrI_Y~)LhFEWs2dnT<;ZY%~1J?)g45wbPRFrcrE~>QtIFhadNRrkUTr$^TVZ$>^RT$ zIp#YC;u^w|kCT^(hHXAhren*K@H@%Y&4zLCfo8w_02}i=X@uaTJ%KdIjGZ8#LtRqx z2T2Zp1*|g<9`1fwVbA=5oW5u54=hFf*{(kzEG=OPC$W{!V>3@efxVEWIYA8P*rQHj zOmGE+jAn;Q43oNG8pO72uMC)Ii(js1>zpJpFTpkSG0r@#PsHbkNuT;<%p<<2*tf-u zwmyNt8O%%IX!)tBQ;Qx7%J0}&C&@_pTbcTpeOLQOOZ_|!y#1qOOgW!Cn`NECPCbv^ ze+on$&z77*U8k{6PQjNU#Kq2^B3(LlXjE%-W^U^zk{XC5M&oHY#>J9Olceku%CAZX zsQZ$OPRoatq@rJyXhTG*n0s1oR^F=Z=7__S&ISX1?_-ls6Cf(EyW!%z2rEsZFUonLRz$N*Y{VHdxTg^x=C@2xx(b5PD}Ux$`31jk|4iMiH|F9a zpEuK4wuJ9?ud%IX$W+)@63&w3s5iXbkf{$YE+d^9bZ0FaaTXSl3RfNY-5pqHyFiaK zfjxt?P&BMLOA3mA!-CC6sAKR$ha$J~eOCJa*nx*hQ@tkWnpDkPD0j=9!Q1%hb=-}D z@6ZjvLc52hoP(Z!P$0}X4$W*(z7?7r6v^}yhe8zyyNA0lUX9Q}NbBn-dei7MhB)>HArw}P6!VKuFYqFqcJ$M(}ipS6j9l|BX=Bb9-um@CbJzF}V&R)33>CTfOF+N#PI*A(rYR{2( zitwTfd+0oN7}oO0PVYeR2VlU<*5pk}@6#SIWbZ*YiJRMFuN%6W=}GLeO`~Ecq`|7&Y5J z!O1Bi(Aqe{gBBPsl`jMzetz$)nLTT=8(EZZA6zWv6@D zM;GBD@GJZ7B1U_r>pc1^5p76lQKQ73%ykjUY9KuqM~g7)8EPRv0XjF>iA!1UOW=6B z1Dq)PK@ioooUe>V{52mlFYH3)m%uuc*@{afJEl$1{xc6mY)L%wO7_Dgl9}?X=hCgp zbANZP?vAqPuwS1N%=S2ox(vx>6U)2|^ZhUY&4fu`u<@6%?5$^uE|b1mJ>bs5qy=ox zWiqP&{hkCTC-yvtaJ7=!Dvg*sCzMF%=`B!apiXBMAlkuR4N~zbQV2w zYM?{#%Rye1Q;$23eD;>;%E!jA%@AY`I_VO-@;4cn*$K1IuZIpb%N6+I z3qE$~3W?XY0^&?3J;K5z@{q3Et#5a-nG!MEAYnJoDlR8lXq$FHGvud@}`pcsr|-&`Zx%%SeonV%|88=~t@ z$=d^hv>hGwjRG;UtTt#+e=M~_{hxBQ?+~7ib8u;qDPdQ{4+i{%?GyDnn z$)M{Ngr7@t&o5br8>AcLssT4J)??X2H^@ZO3tsNsW-#j{<%@+uu?Fj7Do$!5h@c6A zjRb={zGTiDWKhCA|D^sln3}66lE%hK{aN2OaDv5bVjJlhTZ(gHG=QKx8Vq#Ra(`{; zvg_MOjK-Bug{N3!8zMk1vMX(5c*OhICA|`KK|3XX$O>+f!pH%BXXQ{!)AfZUA8Yj- z_R38x>O0vtH_=Z}ZQLXq$P~6jCR0;-;0<ijX3wobC_E-=U{;!38)@Iu2)rCs~97 zJ!B!vP@pj%%fekaIzEq$cahi#t4H5&>`&F_#|k>|``Ioin{Tr3TqJ9JDU>=mH4kU^ zUE2Q6H9;H=362K_9Px&khhCEiv2x^9K{#?e%*>zf!}I@MHy&#LZPJB7+BgNdr@)Ph zuVs((%X4gn8|u9Uu6LA^nDRauM_JmwC+SAtiZfu2XW9YbN%8) z^OsYyAE)g?c`v=@I|U>Pt44hYi}VN;`nHYLdq`}?XD}=MDXU$A6oXx#AfBJp4uc^` z{UPxI^#a?92LA79#0yEWwMo`QO+pUNTcxa-(jR7EdR#a32}3J&>A=A9-xD zk1XySI$E3&-)Nm7P7y@wl#Ch4jpl1VVC&Z1^Qxb8F=ADcK7*4oOyPd`yWL+1`^|U@ zeN~WthPdmLH?bjp$QP^FL_fJVZf&4RG1N6(p!YOg(5%h3hFGIvSYN^R`(g1aVyXZP z83S2)038y>UI}2Y5W)@zU}ccjsA%tycQDd^@0vlh8+moj<1{0($`90jS1JJbgjWOd zrZwv+)Y5A{rx{V>@#g;E8`SFYfSk7GGTsemIzltxb=#BBESl_R4-(pgc-Rs`Wk|L) zl;%OO+e&E`d5E2$G&5_Rhik(R z0XYhNHV(QRryQr0-1xRsL=Q$Qth1U9LJZRVYGl2OT~*Wac`pEE$Xmm|Yxl`<%33du zWwL3UwbOuS&_dFwQ)d&hHoI*N4`lLV~r~D^8bh)~sz4g+FF6@Mcrs&MqT+vbWr{zDGCWQ9K4sCD< z%}QMEF^oPt{eZ(}YZ%(81umnLMcYOkEF6%Jvzic^8SxZiyl%I6F54DD7xYT=MBwCf z?!@7o-p=Pz;qr7^&i9Bm6Dl^-#fKpva}NW9*(t|lx7(-z0S$Gj*zuAiClx- zO)0YMX)Tcob#AQZq1Oeml=+}~hfT+*qdj3O8_zERR->cFoaNqh<+0_}gWh)bQS^}j z!*~HSI!;KtZ)B0Bv@9Us;c-5G;({Lb816FrGygJ)1$3aDD3%pQGhu)kA4Ugb!n_m) z@Aa3NBMk4pV#mYi0J?t}>l9A=&9j#O+m=$a(OTYs&F}Zx*yamWyhSy0Q^k1c9vFzv z2i;|OdOeeGcKiOwb3_(QkT^S6WkM|zX3`c`k{{_|D862aN81lGuK z8ino8iE!FGafRFYm^g@|8kujdN=?PM9>uO}xnOo!S+<_`g`KKYPY3E|FQLLB{FSnI z^|T=Fo_@JgoWaWFVqofS6$QU%J&l8&;&XZlz8{k-3=XbfyxGeA4gK;pSDkgOqaN=3 zHP~v^+aiiWOED{oic0Hj-#ivxRF6om!K6k>6EOF*yR;AqL$9;1B4{tf`nN^U2e1h( z=|D3QG&=++W`S}!DIQj#x4$rKGnY5biIa3}MF-kLh@Y#0K`ZzX5=uN z97+4n`z+{`sJ1*-gvpUAOpCIV+$egiSs6W!T-+mQ;Ur~H!iK1_(|=h|+n~^<$-^fe zX;4C%R7+kT{``@hS3@G7JGgad6`tvvJ{|rPo`gltI%r;JOt!R+rs_E^ixYOHIN zKH^HHpJCEJz8KfF3|9LkzSz z(_NZj&ZRbokg92W^{FUJJlH`g8xunlLhivUB%2XKhZ)6k_|c`&+Pe!s97+$GYv&Io zN29ww;jCLmOm{=|)StEB6Pi}eF2!K&{fH%Y1fR@jLpsug4i|iNkF|5Ycp^?`k9DN! z@I_kIkq(I4u#`f_j7T&|^51Sdm3pw_9cfOs$`x**n*<~HX!M0?)S^okp_>2R#b*#) z&eIU3CMLikK!p!_#{#p+TrNDn))5AEy2jWIdbLSDc4sHr8EX6mvDBC%ls8pXIvS== zvou2;bO4*+rlp$|EtD{WVDNa9eH}}Cj(SlEw}fpX!9uV8Q|P^}+%H0NLVn?enouZ* z9BT}4*A#xB(N3tQe{9VyH_!QR=`tJKi6&}`afUaAZ`q@rXl$%7ZIxxIW$%oQ7NL8; zX6v+EhaWgki#yT0LD8Pt#v!(+lWuMqJN(K)ZsB?kzJprlz@Y5KIbZ=!2D{dL?_Z%B zRWlbA1!){k`IHueR&REq!=MZw7za6M6o7(gT4puq;5ExCP_L@1!GTzGfjVt`xe&rX zsD?+49vF)%=`HqQ9L}UctrdrE|46Fpw1lQE5b>;l-Zr8h0F*m@C zwbB?@##ENnnRXpA)O}k`K;ZXg-^DcwnpELhT2xWWAAn7;^G&j#G2)3qB^`IiHxlev zZ=#Xh{xk6Nn$8eP5~@78aQWqnpkJQt5rX$CabM0_5~(rV?HOj_PE=ayA?8b@$<}jU zaIOyipW3n5fQA{AbR6aP2c*7Ggzsd4*F=Mi4+AkkNTq4UX`xf~#Y^o!*u$!I#+r&y zEI^OL10luTp6+WGPZ8YgNX3xG&U9zbCehTa)ySs~`ONkXM;o}=wa)m5{GErlXm5>3 z+il)jX%+h>3Bx{nr5`y7Wk%$w-0y%!Ds5`l}azHg#y;;_IIpb7dqP51=xLI(D-Et z0Xa;W;NV_1Q~WA~ra>VgQfV=Jy9>>L8@C$~VLBx2iY`3|*EpAaKm3AtP28Hg+2<=Zw3bMroEx{l62x=%SV@t$gdBjPU9XmQ6!(IGi+9Y0~PNyA*vibR~@6Ab95Oc2?X&>=PEUFrGi=l;zK`@*J*7A68Jt8QLAxc?Q16td`K;w;7@SSN+AE1E z1f{5(J39Z6CoAHDdvJXeS3#_s&r>yNkykU3d|u+j{??}v3R|qqmgdgHnX{zSkUIOU70j1!xW?dzDB>xJ$JE2^0B^hh>tbFSnFC&$j4Z? zi56gG9b=*yRB*E=P4tcgwTD}ID27XA(u3}lU85b=@_a`f`_4pD$PCtM0y}MGv03Qr z4QxObEr_y~hdS!Yg~sTNT*`xbUS-R&=-m;&DLB3H1{q(3!5PLb;)FUBX6#1eXtIml z(T#TQZN=inD@K~5GtRcwm2?z6P9T~Y2Sq3o+2U?A zv(Lmq>Z?-)Ds@G$e3?BzY@squ$k#7arVE^Axt#HV8;~5zRD*V;`sx$H1zG21r@PUv z35S965jGN`wQx`tK~Z~L;~d;M`3f^;({fl!CMcQ0!s)##E0XvseL_Y+K{g!)v+d<< ztX5~;d$&Y5xrF3LycGXmaf4XZDiEs)O+U!;x?_jigFV!pPKMHIcXyf>@uwm>hJuOp zK+_2Gb*B#`Pf&PxQ1x`RjbloFpbXpkZ;APAb`H&^LOH9;p?9LoPv+3!Fu`Z^pfgDn zThoJ%flKh8J?P@T8Su`kg$Q8>rPbP_oqUz9#MH8RmiMvRrkqdHhC1(2mPh*JM?E)N z`CA?(`esi$TzB5z{%LP^xhIWNeePb(N_x`R$TPFw4?u7Ip`Dr&FnB&}vY_o3rS8Z-8#gQLcJ zd1*FB$zP$O+NhCw0UnPI=v=>yazDI69`HF!cn?PbHwpcc)fdeg*3=iW;GjsjBA8NI zesZo>RtfPitF468G^bgr6s0*re6C~%E~C`hUsVM!iKwcI_V+V5Mm+e`N|x4-77YEM zHg|dH^|3BGTji)-sQr;{Ui7dn(aVXj&TEqG=u zDy-RZehK@iAMIQc+O$mxsm9aP73Wn^cNgm5{K=9ITu{&Y^+GBMxw$tQv8=xHTg#Sw z0PW-l_`d^=o*Low%Bx*dQmf-<)^4gTxGE3^k1Tw_;`-CHdA0Pw1yx$YNO#7H^L>Q) zQN3Us`on9TGy&d%yse#@SM$)Rq^2z@lWF@dWon3ptTAfsH!afRISX4Bx2n& zg4iDF3P+;WTr^ZKgyxEXP^eC_!1+{aom)YL;n?U&@TeJ6w5(wqYwQm?n!>L12ew0F#OY^*panmNh2;I*Jow}D;Fr)iPZSO|gq)$EhM z-{q61v$O$pd>mhhc)%;)a>Po5AVC&^>Fi|72GDF^l6^ja=JZHYrlc;87iXYLLIqnh zR+Qs_5Lw4}fgmBCL*qX=wE0-{9rO`!@QOP?R9~{M@4&M0BU2589%unHiQ_CW!Akx1 z<&qa&XyASjRw*kONPB0D=d)iBX9UYwc~lXsQq}De8iG2nSSgRK8wf36J=;H!CPwhG zZ@LJRj^5Yxn#I(GLUI&j{d?hY%>*knZFxMjg( z?Xy?u-q2yKIJpS6-R=m$H&=RaOo17ayR0FQ zsxoR}9(>c?0FaVgAp`R`1iuSd-e4M|Z3Oz9M}Crx8cYWy+R)OhMsuYZhsI2RFiZum z46#A<=*-?6OnXQ2C78b~4!*>06j{XD%J)3$tSY@eUvO63PJfo^?xg**_k)EkXw8Kl zAs1EApd@S+pigRNB!WA4E3XbecK03N213VbWgpxLnp?#7-${Gsak-5bR}?HRs8SV% zYGV&=K+U-4EU%%p{Htg8RZT+a``{6jH3al~2YYk~O^BTBIv>m)r)7gvbz+N$&;cl5 z58lPL=d8Jvles-7c4Y{S8~oo4g;d`76JV731_N}Do>s2dTpsMy{9I&;IF32ZybZi- zJ@R%|Xr=|a_my;8G)@72n5{6=Y~31{4f~J`?B4g7QFePL{?D@8yE6WN>&izIqm5PH zNjtIJ0@`u#M(8nlpO}Mv(q6&A!3x^{mkK_uoyG({8ItH{02Dw8op5(vAnn%F}Wu5?}*BSMhb@;v;9M{krZW9N_OsKBBM$y*gR%uL+{BrU<&hgev-x4MeT-Y zOHIwqB}TVg$F1oCHRk7f<-I{|1LU+9EHt0XYfTo~t(UI6XckZNo1!&9JEw#hK2yRC zdurPAD|l9Le&kewb6(-KKp8A)1dZ=JdM*J5wu%;@_*hJ1mE9! zyK)5W)micKyhyNKNx`@D_Se6UpxsTVRYh(UF{L&0ob9#vUHzGY(>d@5 zc%Oq)VaL9%m`*fKRtDHcR;5bSbYw+qRoV3yw5=7>%Guo1s>iPrnp!cF#f_v{k#pTV zcIW)GUKSzQ4G*yrJR~Pr6~F9bZ}ZDmc3>o^cO4_6f?{CiC|VfxgwQI#<0*ZnOXhy`J! zE4()Prr| z__~tCjHPeFfWCDsecu%A%56*q)QZ*_QXGu~e?uM7*x#pG+8OqUpn9Bp=Cb)EvH4@JB|>9owy32X<$f@9mGlx@bT>`unXp|D za?t?H-hULRol`^VPskoG*N?gZu*XBaI8C|bTz2qox-R07&w!~7A6c^s&QDeM(B%7n z@jy*yB-R2e7yOHI0QHAl?c1Wps4XB|p&1H2GdxmG$j<_dWv1X2b*M=;qQgK70n*HmrjM)wdYND zb!h(0!26F;C+~=>tl~a;FQOK|yN}jq?7^{z=S1P<0~d%rH=*bvCF)U{tLLa&o((wE z+wRIM?xzb9LzGjss?uBY9{CNHJpqeP2R3E`9TN0Hp2}8Dp#3Ah z@xO;7o}5pFI^6K*Iy3>6y>qPR19Uo|<<~!ebu$lZglNmRT5Xk9ph7`HS3v{0{{bvA ze%8t_WlZxRJwy!b_=9v_w%2Vf6`*}_!NpCS5`aG<9|D&wdaPx&TkFayw;E>%8KqlY zz=K}&5M4~(WDyV3%+L!#AL|RHY|z8B4*&%!9;Pwm6SnAKnwQ+g6StP*dw#ve2q7~d zPx0kCb}ShW?{$^*BRlvoJpf;^`iZn6CO2qL)HnlaLxaAbDk%pzh;&3`z)wh1FXH48x-DzMgyj>7>@Q^et{^!dkS#T6XZA_MNP zH5zWJ1g^0)Y|{hYKwWoSHp6d|lbOK?_vIZKIsIm1T47h^9Z?M(VuU4JJSHCx)PP$+ zTkgvqtF~m9(^hP*euW@RvgRiGPl& zeAU+uO#Q^vC)vfVG?R_BQhV=>fhg&cTS(PG`5qJ2HAXMkZrCMd{0pDI?j{SF1jFoHHf9n{2zUB~+Rf0gAU26rOaik$!`LL68UBWU zs3m@#X01m0o$cq(-(puL(VW=L-pB^)7A~m&3qWIHd6VhX@O}zK3qtLNT_VomrM*+G zc!dm{sx35KTx3vRtPTljD}B0Q+4iBK%^dP%EW19L8Y7@qHD(o^lJA8l()-Lfg(ho0 z@|}d2Tj3O%rvJ*f8Lj8=cCTyMtSNLXq6GF#p}mJp$GKbF=H5NkSpU0R<^|?5FlM>U zJqgePH(l*-d!{Df?Sub$TV|OmN^%41J(Xr={^lQK-KPjtiRP-QL=|k=0D4h5b{!kx1|cpr9_megPJSeAc)PMWk%JV`$k>=xk5PJU$xAaim-7 z_qWF4`U3MzrE_C}nHE%ZJe($`;y{_AvvTeiJK2iIpqv}b9FNiLyx1?n_ioOnF{tp< z9+Rz~i5%rkGT_i!L(x$jXBq<3gkOT^Q`p}W#A+7tIPE#F%R8JUUy+UA+WaVy$Rb0r zfU}Z93$MyQD;=c4N@Fdkm#4GYcimq5!B*||CeRc#P zJ`?%j@4&N&wRjq*8y{2&YtsRx7>-z=KAce}VTPT8yM?MaB!{ps9;bc8@|(Bd zxRe$fG(kO;V{)k*#wtau#QA{DUF~Xw64m<7fQqM}8=u6Vh;GCxDt&|CPqj1y=Lo8r z3jlFs0K^er6FE|ndV^D*9#FAYrqPmlUwNIjyP#VWEq}=0!fWh~z)A-dopLuH5ph}> zNb9QH8KW77a|Qx(X&_AUC}9$D4RsQviu0uxh1k!?vgZ$ZVBl=4u{ag&`^NQ$+$V5G zzT`jYHlhbM6*!h9^U{;y7lQ=ES z=1^}kS}w_}Sk?^sc+OMU=5g*i!J>LiyY7^n=#6)1z+H)C38>bpar*kE*4qfDcQD5y zaMLq0=u%ya!n3465_qPZ7KU$fSsnaf-b?b=?3;4hKO=y%PRHSW4;pf+qCV`paR7ya62(ugG0NfBRE%AwvB$#T`+RC;U8dc;K~vDsmsM z$UrvkO{!)eJwXSBACqI0_7=ym>rc?W@rv(ui~olEdY|U@Hix*Gc_zKn=!a^Nmjxy3 zYawe-$?srE(HAG6te<_n(KFbaGr@sJw72)tOo;SPrUL2z=Sb!3U%GZVa#bHQl;nvc@Is-k^wFNK^C;5Y(*PzvB*zZhbf+ zZ|BaYnY7KrzMMh3GVy7;BU~=2ZHNoja~NCoB<&mLL0kqmN!+fbW+ne^VJDuXiMo88 zwZeb)VF1LK9e2Pt!4a})05I&%!SSVIv-$(FHX0s#%bvmt`xE>5DViAB#XT9b`!-}; zM|O2Cs1ijV!#ht8TCAJD`C$)kKFnPbIU_+3wKif#;*~&!8dChRG7cOJ)U2`!pYhE`X$aG z*IXPXkfl)${`)iUlqA}{?SF6;Cp-h=9g)Rd>I5m-$JL)oiAvhOi@;b-gSozcD_7Q@ zYd8+={sX`V{IF4Gm_>7$b3WBGTMhh^9R3AC>$`(}UIT^PdM}(!Q7&T_Yv8}ohG>`* z@*FI5y_>tio%*EQ2lU(%m7jn_2`GkNbzY9?N+gXpD|jVdbe1~gRx|h;#q-~0JQ!q- zPPq@75mlUyW<2VhaH|<^z)H1!;uU&!*YD zO_jQ@y&U8=N(yJC3*ehcSk(fW166MKl9S4(Z2a>yfqlDx8la{=yZ}_R#LsCm4`7dP zG3`RyKl4wyi}JtG&J<7Me<-r#AL>a5!pNS5w0HkAZhkP6_K*m3IzM%|8%|Hfp%^%h zq`&Qi?Dq-jRxn0hQl|iqt5khphWvhpWiP@^Sj;9aq6q^Rz}sUN2p5biZUYR+bY(Ui zN{T@kVbZtm_gaAmNBR4x`Da@-=@rv(cdeTE%HV$IW|z4vxrkfAY^O)YaCcj>f4tP1?xjQ?_KIsBc$-)a0g@%IP*e#hT2{2jsH zZ}|Haf4{KF%jn~=z$Pgosc)HyZB-%M?je@pb9QnW#^7tO26#-Bj!-a?CGMOu?nC*K z=PAc|8|+KoafnkDq+Om6XK&!%hZG6Y6qd6b#GA#2FNZ$hRrdIDFqjwFvgPpC>dd~z zuQ>Cy#OQJL$K=^c$+bwqR^78!NIxQvV!q|H_ah}YUY|7>FUKl%!^u$+M1(V68xWn3 zXTua7&YH0UBlq^1_9Ztq%<6?V{T2I)k=Gua(3EIjBy=@jD@Z7ImM$q64lkHs4kIll zq)J!Viz}!p%zUjRItjnS71p$Z#v^j$<5@BFM`brVwF2hsCYJdkExdbMAfZSAMCUM@ z9vdCODToZt&PU}B0?s83@W*U_wl*~a&)y6^GaLo#HJqN8OcXBeLF|nng#jN%(^6_n zfRh!p18moe@L8@1;7Ei2kuh&ZD6*M?Y!G+wPqPO`tMK%JK%LDzk;^*evu8j0Wa;eb z{3M$0*SSc2Sk4M)M-#wlpumDob$G5pLiZ#AON2UIN9q4UO zLK%v%qw-0=9`GTCT_w`BT$PmOW~nQw2{1vURzjJ%j8(0~Y<`YyUP(8krTRJkXK22V zdRpERIE;uRUUH)Aui*Y}0%`*t`ERQL+D@zBEJy zzXKoP!*Z)ngtQcpHGyi02>TFib5y?J`}G1vfI~J`DZU{)kQ$Gt7g%5w%^35W@36ep z#}DC|0O(Wh^DFqt#0|mfuI$jYF;e+vx}}9HT;-_gTfu zG%w~3)FgmlFM`;Xe!=5#G;G_;&;}Lzcw2d{$NY!o(JcHGXzE^KV_w0WK+yLqbWC!X zPv3Z0K8JlNN!^5*7loO}pR{_9BUtz7D|FzPKfH;z2<5+IQF3EBJT8yQKYMS}rTJO{ zoH~!n-+Fnvn4@*JVF|Z~$$ZTi%?D~bD_sp;#VhPXToM)la((Xw@^nB>@@a;37-@t! zaMl`-?`08dXm(nbh6tB`;I6^}`MLi<^@qWCUR^c=p(GH-k&ql=i`PKUc!fFEz~jox zj;?{e?lP0t&{4790WMS^p;i(7T?+kdsPnM=9=rclEM2d7i1>FZr|oyy;#Y%H?!c?G zVBV8{gjiG_mhFCv*;-j&S!A}Dos|}I4?BN46>sZsEyY{$KX0F~^QZUujg^xs$D6DF zA|X!v9_v39{QhIRh+iZ8^>|xkHvT8YVC3^RFo^8iI*f*4DI|`qU{s6huVF!t+g*(I zj@#`QG8-&)FwGJ1m|WzqQvxSGN_EfY%+&$PKa&O8F zfzKVUDl-I?iL~61rz=iP^si5phx`>9!k4NlHg_%97Oa*{Twbj{Loq~(@k1!bAILU;;(dL>R{E+_47mgHo%A+ z=gFFj2LgfrOF?JRMqfKA{~xx#1T3nm|Nq{5W(5X@9R%dg06Mq?xZ;)r>Nw+uSeB+H zxD;r3f_wI{mu7;r0_w&kz1t? zoHv2*_*wD6)cc+g7WzEAHds4ggB0Ag==X7Wd_?o!7t&G&!akMKrb0EdJdD=t9D!Tp zK2D~OhR~|_A(k=9)5kK!HWOLQ9=#D{o03yfnseo@T(r6!G_U{G8$|6|?Y2_fr?rk4 zNaiQP%U~bNSlh!W(+y}YlXpw z@!JX!+6+0JB{CIc?+K-C3R2#5Kj{eN%G&PuGU?Zl@qzF*4=W3YKNM0l+hB3q4x{k& z_YZ~i{8HSWbHImR#buUUluB{m54Y>#D0UTZDrte`e@%U8nhGN43Y?O^;s9Wihxxv| zGkN}Mq~q#@gt*6{Ph^Mb3U<$$>c4Zr76(82stD9za_L=Tt&Pof-m zUV6n1C~9p+Jd&K9qjcE~FL$;cNCCA;{Ne66>{HPtTZID^^V}*6<|XE5R7-+9Kf{6c zizVlzdG1z-Y{~2|{ru`4)lu*(>zC#_tsNPV1HT}B;r>OkyLrqVsE&Y~%BWUMs67|Y zjIhwHvc)3*cqkV$iXiX!WAB~SyUBBx3G&*s=0Vi44I+~_Xx4V@+}CK~c5Iu!)5o_% zsIMsyzFREe%Ci^RrEy-?vK6&=N6Vw=j_pEx=t|H8!)&G+pR|kqv|UJz*c>=@&xK*9 z>@eE=k+4>~2W$Yb=}#0q`;m~Em>JlTAAUBwoP+uO+@Ke!a8#2*BX{8Zd75VK5SD{m z{^1T`HqX(}kA*Dt3cs@McL^7ZkI}1cKfy^t=&(<)F)yT3KM@`W zj~{zv-n173Doc;xht9m`L!Xsi4E)~@ZG@9i*ad-1fM5Do&;^b1gkVXw^+Nj7zI3~_ z!-^^Jv(y9u2;a`h8Yy%zQ-?2^$<|E$MbeF%G}!l1F`*vNm8 zp7aTJ2CIDMB;E;EH}JY3Kv74G{ei*sK0=7IPdznGTrT8 z4aj#3cMFLR|LFU_L%}@mKuX7B?HD7!aJL|J_Rc*24>n;9_HrNdfFLqLO6P3n90f2F zaA&^HVhybt*dEYWIgpr`kqLE8gyVZJgm0C7Kyrd1P4LQ{=Cjhg&mWfrZuXO%EKaT@ z0t$V#p9)ERl}w|j8(g(+?_<$mCy#J+z;Uavy@y3B$F6xJ95=Dnxi`pmwVZN^-uP6= zGJJ<@%(RO_PCSBaU&-0HG+eh)&1ZD@9!QThxGU@TH}Y&lLLx^W--Ao}BXs2+p?CBu zW*mk2M#&AoRr{ZVlPUsqSyBd`{46zYa_r=I`=c26cv=; z2ce0{bn-r78Ze>yeOOwh^oM;yV%%t7KZ|LxxbTl^d*#*Y%o4HWq$GH$cOSHMi)q&9 z!j*_4UR;SUWLpFr87+_j?YvA145U?EwG{r+KNBJ;(%11g2U%fMl|UhPthL^phqv#D+h#}$Z=lKl#AvT z+p8g}TB!roq31#2$*E!9UL_;ziy$h(H7+R9InurF!{U3{ejQ98G9(k4UujTv&(>t0 zfpaJJ(a?lt;$j_4j`GI^30jp-g0=I%TX^Fd&=QgT%ZpdGv)A$uH4;9V|O`RL4P?cq;<`P zC{O{0AXQGxM65evDRRu{qT(0A+6pEa$$HmEPK^lmE?bUig1x&>j`4EuddXprlXb3# z9KPjboioYd8&1}_ZgThvBVHTRLSS3yU0>si~M}$d+PjPhHU#`k0#~FnK4i7(LBoPr7dBU1CFiQ7t zdgF*-s9*+2#@!%X#Hac_WUH{@q*NEse?G$*<6&D=$XLyoBe=}II?ve198RcfPQtVZ zZ)8;xm}rk(9uhU=Tg!n_P8o|3kD z58fFU*8U^Q8>i5`Xs)XLGbG(R#$k-9i zY(0S(eLkd~IvdXZl)%b%__#w4jfCd4;@T1NND=2qCA{%1^GI!h!=6U2tsqC7mBz&S zBVe3o!vJ*l=O?A{Xm8>TLb%Uq%a=l?-n19;o&^fa#+}{8lTw6_cKr(CU(;#9S3+vV z*T6+5+h)~xrL*o5YvMMW<$2r_uEVr#fo*QhQo9IeKcTqU98zn586?)7k#?Yj)%G|_ z9CF7Z|3u^m&Q?DHX|s`kv*n)>Izuc<y4?$WaIjMrxd9z3IBIg=o_$r*4Db*y~Dy+1pB|X(CfQKk80l^w~9x zx%>KYPPD}+I4T~+UG|edgjnkQTDS_iy30qgkG(*3-$1kvMrM1RZ0=pl7^bB(?;9a0 zV;Yi9H63h=bMig2}SI zNj!Xss=tHeeo?~%-$C4sPoNu5;_&E0_nj0{BmE#Hf0XY$&$b>#%?T*tUOOq|#9lZM zTBEdw)eyV3KCFhb>+lE~KrKRE&s~0(^n}wTeTRRI^NiHZ9XgI}R6XD`KrGQY?sxJg zCs_L@q$;|x1rk($(Tr2VkjO?q^Yg?lI|PET)p8s@f)<_<@tDk$)tZC!868Ge(zNA-%p~zfPRFttuWrzW7@~ljz4d4n$3*Vk*>OwU!_li)kVrr!&{Q&X9MU#R5!J!OWCgF zewAJiW>U$SNJ|88M~{^3vRX5tc~%N)TIMRgYU`4!MRv^55!U6ohl0`{OjW(i{Ht{Q zb4D<}gPP55=zSLRO7kQx_N|i2NzLbkm_+U8O1R?nNHd%aKhfVMJ3L5>Z(@o&ZwMlN z{~Y9h2Rb$IzW1|CByN?4-o4@Mj-sc|3B7bN&OWwzmf8-b9_$4gabAcmob9vLceC}c zaZ7%<$WVzFrE{RG23F>G^aXQaiL3Xx8`b)LdSmy>o;ES%xHMdrsMJHgqzY3j*IQSe zyZe3TNL-L@mR{E5QWkyYypWnR!h1$?`Li+Roz7`1;ha{5%cNU65Xh*xDD4RxY%{HD zxhsgakbZSu*j0l zKf5gT@M;a=P(a?9Di| zl#2IO;=Mhdu>0hlQ6=ArNRt|J4sJ;wP>CPeHyUJ1tWWR|XyZ|YkwNAk@1KXrqde0w)jn#~c#5r$v{S-OvO+VY(lK#(z ztTRN_otBGZf&>^)|WWGL&RrYl>&FJx;Foj5HK@O1|xh zn&WMEHu%auYB**##G%4*sBnnwU#M`VUt9O9^qu9dWf!EMTpf2O z!s88-e}N=;#aQ3xySsrlFB%mf28Fqqf4VzImS_+`*ffG_mjnj2Tk7vi#thNqo|NA9 zCt8(q=nQBlVso5TCC8c(OKgt9iNRs+#5CzKOIZF7kgk(gqQbFvuNr=<-BP#@D>L5A zKFmewkH&kK=ecOwqg9xqKIzp%N^KR)uYyu`1S|N?l&FZIyIO^kv})OH!<|$UP9vZh zVhG1JGI-1uk4qJF*d&r64#Q`66YQ;K`iGDFTwjCL#=;wpO)@}Vn37GJ?rU| z`rZSI7mGK0dX2M}9)c+d9*peHw4)w-Y2GsS^a~bxnT0kY#4l%|y$Bta(_Zr=+e{_P zb0)&PWe7cuPIOQ9cCG-YQ?Lv2WbfQyebUBzu8jj};$>lJ{4rSLG)01E#h-@z5pMT- zXF7iw7F@Sq7P2zx;BF00qrfj3@i_}6fEMDGHtq}Qt%k~ejJ&enpn=Omnr?+hFlexk zJMu0{kJ7APg%siI7&_rs;d#(Entv5WPi_Z}(96~v6(~G?3JM%%LEZj?B6o3~g*WM& z-fuT^+`(pPOn^7^w4Q`=uem-KAGb?zWBBhr5!(Bgq~ig$Ic$Q;mI1lO&;`E<@e@vb zCPKB!3|iM4fq0u}yq=?J7dee%O`xmIjJfrK*9zi6GMYZ%W?f{H;exaQX2|e%jz)V_7eA+3O9! zvD{L?#il^GJ>5ECOr~XI?rG_e7fQ(ynx;hC7(Bm$=WGa$`9(WZqdV(QwkKM9S|*{_ z`s|-!eS1M0P^d-$V~ZSTQPbz8G?ur&J*yKv+Amlqx~Q- z6&FIc)Ig716%2_VfcnIu&j)H3izTO};Xq+n{4MIcDs&%l&Bd*qX6bJmT*JTRlDq*! zNw$T5%L|!WXpFz<2G7%8&3Bv9XtR_1G$(r6a%)^LuM;3FKN@oMNOK`iWCPvUE$s0s^!MUg8deJnohTprKs3p}b&2)8Nk1 zUVVEPXW9ea`HRlMJkCOpR3B;k1y`bn+Wr}lE|mXMc&g`YSBMRE{9xzH#Az{Spiu@l zOeR#`3`;x#=?H#1v8t1F)1RQ1^{0pb6k;Fg5n!_|1!rQVx=YLE@(c)_xNvB))F?SM zqUBO~Do_ZQ6eFjq?8;`rLKl;(!ruEy(ejvY#PYuLil0;S&&FKwp@%dll+=NTv@k#Q)9& z+Ym)x{Yx-KCjifMH~%c{^eedAP34AW*mwBhFJR<)dhIVEaddYKC3DgHDP)Svz(GA0 zP;gzEYFFuMj!OgGiuNKd{c$CZ>+x{39Bnfp^ju(cNA@IhM^zq+&4i8GpQZcg*c;G# zgc0Q%LTcVVkSTwWCi!?Syh*c|gU1G5)GXvdP*Xsa?kf-|*=30Hu#zW@|M1d&mlKS~>v>7n} zeu2m27?6nE(w|;ljvw^cs|C}o<61ejHJExam}J$vaXaI${6 zn;s^oKL^fNK=Sxcz)gkn9IHzu*R=?y<6BG5OLLrGqYHQB`l6|=L)ac0>4kaI46)Rl zEEfM(2FZtWEfDL~-W0m$yyQ6}@t%p0EY{kYyy_p=P|D0In+|>WZ67ZdmBj!_`R9m- z_qUrMaAniwH^HZ`qepKF8HQFr)720w1-mU-$h;<3(IUm%MHTZ{p;&7C8)rf`?f*B7 zXHNI9VZI5swu}zXa85R-%WR9$?gYB@Z((3;AJ0;2e!0*CPR)9xG|iA7nds5K(JrBp zw_pVWqA)#ff${hYoq9`HjV0T5OBfa#=VJCs_WI1033u_TZgkLXi1w5XLG9tr7e+J^J;nb6$CZRREib@1bc518j}rc z!M;?h3GgRhighU9F<+8(BH&T_nn&obI_}dtd_MZ4N9d8UqCY3@8~{Ny5Sw!MXdMTA z;p1Rxv{8rZUh;*>)jdyByh2i>%Pm4UEY}PJ)BAr#XUF@mkLYwJ^1gMKr>PF<3#z`-Gm#9S1lrhA#IB zqkD0=P#J&%PuKCO6C&*}gzR;cd|4u`>q^XB>xxS7TT%oQ!(Qs}3HSBw5~!PZ z1vWnv$IZ8U7lxp*HaBy*u68uTSq^_f>qzs3z)sQ^ZEO_(#QUzGg}CZe=)p>@nWNvI zUi3FUGShW_({ka8c7GyQpIKYh;h$a-_K-gNr}*KLJ!L{UU z>8~o@iHb1Euctt?V4duWPHNV} z9Tx}Na_Hj!7P5CPa&x`HAQSbd|4XQ=!r;KeUtZCaiYW~D(K@a(DeILm>s-2E?jlwZ z{^-*IVM+2~~0tLOC)B3AtAs+r$9AH#dXeA|+vM^l%B zDPhOgyGBhM%t%Mr8zLd1Qv#)u1<5O%qb4$XxVNfk9%pia+nmmYI1+F#y4l2cYj0cl z%-m<@q7P+zUfS7n!Zfiv08lXr?r_4RCw;ysEw&H+C;7JfrWg=wg)0j*Rjhh+3; zKf;FEQexpp_K=%h8ZhlHo+nzWN8?^%>INDQx0dDL(()4$kt4*>!YACG>|h1dbVA)!9RVaKh{TV*KtxIVWO#wozu%1pwxQiA2{ z4RJI>6XvhxBwK-_a-v4203W>h3;TJe=k(yy`o&5qp}|o$9%UhFu~cfWh?#O&eJIZ>Bje? z6#_}Ch@X&dM~fv&xygaU5OwFrR#?Ij8jND@5;I^rl=N+3HLyQKANs1-5vl33#x(|?yR)R2lv~YeF-!u zV0|%^E4~R0ML>IXi?kXdCEX#`b6#2mVzUV)^jrykqd4X;-6j3UEtY;!%>&c+z$4X0 zB}t68!lx&TF7l{%iWbNICmpjCx7()EAC$xZ#oQZ8l7vfMsEQ6NRAh8SjlZbGoK#+vYncnFzCxO*CPQ#%nX4uP z!%yWXLGzpL*E+g7)92A`YBE4rolh^R$^R-Qc~q9RzFLJUHJkLHGu+|tEP zarHTffUb9T(|?PdIiWrd0(6(97O=HV{6zHeJNG&1B=|uSVb)X%oRiK3!|g$_j!EEA zPeHzPS*&9i-mk#PNc8>!k974e(es$x#im_?hNg#-FZjP{TPR5pVh>PN80iCporA(i zCK#!+!^pyTt-sgEk)y7i-v@zp#ZF}nKHkhG=8Pna*rt67W{_ZG7+!TH?w+(Xh0+Fw**yw8|4PPS)V93_uJkgFlCS2_V>rpqtJI zXQ!^zDQ%={bQqym=vE!c(EknDd8Rm8V=Sya&P<_S)RBaN>w~FVjH7FtL8a|_SDm!3 zM77pX{a&(ao7s9osto4aW*mlmS84BX5@aArI*7=&!j&75bUsJ@8g(;j$<>J zav;{1FUDChjb=uW1!)c+lgIM!*VV%Xy#4<72HJ+#7)vDSS6`>}*H6+>+89BGL6BRD zAgOST6|X0KW8Z-H3jcooEd@|MMOp~N+#+&jbE^8 zr^528c)>ZP@+Zkk6QfC14}z2$Xy)C!z>>HIe+*IZ z@bOFHNZ%pz1G)7~vGCf7BJ3s1&LYO8*F()xTMM*GvMr~a9M;%7Fo&lx$g!PHX}CKZ ztMehcFpeY{=6abThS@fuhH>#EsF~t$g=h&=M4tln)QxmU9OHBw~6-^mcz z7n)e8!yk^5mAA*@mU~9Z@_<$9;!R&Q7cCB$zJTTJqJ_DbGocNy$CE)kKa2j9fSnua zUI}CrL`DZDk~FIT`M9&V$AAEbE6|4loy};uZ;%z?o?hk-^QMc9&gakq!F<@HgdnIS z{o#DlQNqED`rRG=xI{N6k|oLp=WkLYHFUviY@vBwNLI?j*uTh51t^RtZ~je|+`n@! zh;(%q@(ORKiAkg|b*MMLs|sWd2|5p=!8$nkkkr$yoACZjx^ky9GlT7A? zKP&4F^AM8YxIi4;mP|H_sSsKex!`J;rpN@7Veft*S z+~N$PgDWa3VpOs@P#smsgjYt&Ud-sEIQy7x{GGn{rM|AD7(!SxQ%TQ(oS$32-r0kT z8GGoaIVyVy?uV%5hOZht8Dq_DiESMU+#{JBX+W|Z48axuHp~DVPQ|feroW|{&PNFZ);s6pAP~(?Nn;_)rLl#h zS4$uz!$?>zDRRH|y$kouh^O%R9^_y9acCU<$VjrWs4o~v(!*JP!7|nM2#V%|W>Kk3 z#@+vrI947DtOCh91Z%cjT=V9`5ZBrzkSK@gDp4)5>;knT}%9d>r2UTO{ z!}ektNy@klj^r@8a;@qHUC?j6K58}0G`B934U}rAI zCl$I_%tDM6UHKG(15tQ^J#EZYSEk2YA8so`O&@{euY`1dH655vQuW2Yp?GgFfC-6oLtyEU;B6sD!!CDoh(=4jI=9Kx4QqJ?E~thcSDGymsKdF0`f_c~u*S4zfx21|8C!^oIFr5GD=YTt-g8d9_Vg zuQZUl6HN}7imO_8KY&O90B!xj^Zj|sNN&LFmsm&@(3*R6y961K6p zq!D=C514Rz939w$^sgv!TRReYer*d-PH>qvNRk@L`TU04Kts81?4GY~f=UMBX9KFD zmnvUcm~6Mn&)cB;b-4NvyLRaFu5vjn&jqCMOIYYvgsSAwF9_wyp>u(O^-ux9)7=3k zETFUt_sP+Z0-4o(C6~s%AuFW5)gp0shpMNO-++7SOqcZa-WK+q;%HV+(zoI|t|?Fg zfY@|MORBsAR81pr{HEAaYPdIUNsfTEBNgklMH=sBr`&Dm+rp{^;1h5`#$buu9TpmY zr#o0#x52EEdm~R%BZwYTP{*5)a#q3Mz%A)Z`MWsv1ukjk-hYn5G}_*iJUe2Zs}dh+ zBtFtPR}QF#x4{Zv3eC468qhfx^P!@`=3*{tWRu~RG&{g(j?NKI$$#*Wm(bKtK^Q#L zi^N42!P(Op$i^$6U&>gXI3?(nUL7$! z3=woo@AyQy;7UJZ|0x_-J)Q9iI<_}S95dHr#28kBoNkcEPy@poX2WsmI#}l+7|B}_ z2a>->dd9DWFxl!sjFr;KG;vB*2RSYlTN&d5UWuk3_a^hOViWHpBlre7<3930+5*43 zdQ!c$N5t7RwoRyOE>v8mad*eoOzYgq{6$!tEBdTZskX_m$Xl$^FnYq$-eu!Vg{?Cj^g45wmr82b{lA@Ay1o_%Gfr=!|r z$w9{mNIX3)kusLH%RLbSr2q7S@8vDL^^7$6 zvkf5I_P*jQP+JCAe}#umGLU2pQ~C#4de{6Q@%|kA`h5kCfg$nreAa!<20Iapo=QX3 z{hpc?Mm)XY`_z@LHz9P@mx13lI(HzM3L^2rf#k(u$6TTI5-isrTvbbI^Oemim`CSQ zzQ--IrkPFn$Lh7%X7M>|12_f(Q9!!QMK}sBhy?uK1^bzLw z9-Ne{@8LXeun^>1MrRHtBjT*ytxH67e56;gvnRXo=lvkv|2f?|m^>0{bYBJ@$J)!K zDMQHY)U%%2B^G3E@o07y1~dP(Pmi}MK}W1~(-1N$ve8v)8HNU++p%>hU_HGxgj7Ud z@LX@JStL7}uFA9|;z0>rIg}Lg3H0nxGCWG>ne}p}B@(r3JYDgt^w1u|$p3`y9(rjQ zF{f6$jZ2GP*5b(v`0_tUmF_Lf2+?TX(Tejcf#%&$rWUrlp~i*VS(8NFJ#gSLCRVti zNm~1vAJnpNYci~;teh7Q!vzX)@8}R)i6uGbwDh81gU@stGDf3In8ygnn_BjcW+|og z+WnwRV2Fp4jA(`10Abo6Af&?TjX=mlhYcrh>vp)_Lu8w43w}SOzYQlNbT7KrBl5g! z9eyile>2JG`Gl*kd`kVxwITK&q{mz@@nh{wxSdcMDL>dDR`df;_M&VpFt?b^$30= zT{J3>^vZBMdo0_!^hu=La*oAshjRpeZ#XlTvb@)v?1TP6XXlYoX= zL?#=p9Z913Lb_)p=^rt`*9U4XHaIX4tKq9gpoR#d6WVWcQN#}uT+mE} zQr_@UBuVG@n&vSXy%(~NL7MdOQKa{@$UxOD)4Uqzm--1c?b4UXknQ|3HNU#hTva&+ zDf_%BVryHHJp&Cf4Lmqt_J%`x45O0R_^sYl zv9aw^4lBCOn>nv<&7~anFv&s|@*29@LRurzgH?U47g6vuT|Szm38{X%c{HgU`k*Ic z&X%V_tXt+3&1HnMn&%bmPw*KF)v|3cyX1gy5je93h4nJjX4&Gb*{9=l6@=UWANr`3 z9M9o>rg=sSKTm7@9;P3)7#Amc%gw7{J^~?jj_qSVD>pKK^k5N}vjkdfBZDHohm8>x zGJoUM;P)%K)kcQRU*rzK(zp!0v&?xR*?J>?Ywf~gQnl|8_OHv*<6tq|Xf8zdS6K@k zdHSCu0!0?nytPhqyAbw=b4sUlm9DAC_L48MK6J@K0*=jLy1Sg2_4hx}W- zkEhLHBXwBat%(WG#vxORw_|C}vH=Jsc)Q{^)=NXi5;6XHZ}zgHGRM-Ivh3#w{C;rI zhP@=UHsp>v%D|jdtIz^dm6qi09hiD z!dd~>OYyX_>6|P9syCmLUO%AUZ>73I65p*tcAgy8`iG6@978Fc(4k{3V8dBQp+`$x#n z@Rk{FNu+#7XE__Q7=oWU>cg;vcexZbQ;%9#q9=i0Yf=fK(e5uehswdNQuA*Pfc z;dTWwvgIEmegj*|G3n2Msl0e;b-t?kU7O1IXpSl67|iQA>x)oFW|JN5XE(itd}ji6 z_-%;_YyvnQP_~EgI?G2j4t$!oA0SD^2LkWo!M?z&_+>r>{Fr%K`wF=SmA>a?_%!%n z+nOun@V|Uh8Y_@@vs`XdUMC%gg<=UmtE&4&S|8Yp@%TmhAB}&I^bf6v z^0%p4Ww-*C?xM|tuBD+HDXxrmT=PpTpdhkKgUGsimII2wx(7zre zahmvm8L^lE4Vz5zBRl+8mu4=TgOuz3p7^~=XHF(5W6%4Ih@A1)yu6no9%%U-xS17y z-~S0q8UFX$k5z^msP;!Ych>L4MIK7spmKM>G$PiGKXYj*V52`0zyG60Q6aBs_-!(2 z;Q9V^I0jfM-f^o+21)poLS24W?J#oNN65_!*pL&X+my8^ERz zI%zt2LOTw3H#Me-l^&f=8spEp4Jd!gosQoVZo|B^nv5I=5J)vecE0JzODsjr*<_$Zl_ zxe{wrgSE=rnEX`PXtqun&s&2$9v7?1=?cN`Eoz%d#tt1F0KPx3MS3>S!=kaV(9?HB zwG1paIUvqshewNKJjklr@h;RD;Oe7A>T!@Z%_Kwlvs70E6#gi!Eg~bduYe$!3tt^8 z>GdLF8~R_Uo!&7W8TIczmay9IrD=XKMc>rNqOIjcY|Xe)q6;bC0lzVTk6&gMjS(WK z69?#`V$x&kEpO5|aj{?$oA?ZzXySJ`RaGE5iIy*&V&V7D#$~9NBs~BL-)zfGsR-o8 z6_5m80ikO~Xdf>V8OzMKq(}GT9J@<&UPNydlYtSui|K{O^SbtE?mGwt4Vguf20iDD zw3-ZJmzrCH%GP??9bfM1Y0+-efoRzwJr8QA50vsW^jcfzmevO1q2R3oNvs3z2-eIZ zu|lPWelUwn@7@CrBR0R10V_)#Qa>+4d3EhNwDPjEQx{#=o`Tp5G;=oTo8SqQlwU31 zTE6-ZHP^E|Y#Xx`*uj(#pPo%j%Ih9y+aefXB{XA`=Rr`-DuF!5`wGWthVI;5#8f&} zhq$PgF;EO@9@GI>$us7VjHD%=nNTiNT>DC`?ily*km{%E@828+%;Y;H<#6_p&~1W>(S_h{_*L1eB&8iTuIq@@q!Kd1SLobQ0Q{BFL<*y++C zi>XDc{pFnZA*TfzGpxp~a{cE)2W7F%a_kGIN{+qlEuV3>nup+YJ{ot&|KxN?QF1lu zs3y&?mb1PD@6@U$)lSa9E*q)VX6eA^DkcgKQu(i%e?-I?t7+22aakGV%&rD~Yc6>x zWL+KMQuq8MX+6|E7h(i&)4az>v~rz0b^l;G^)WJ+{}(+7kdcWyroj?}W(WIJxKb*> zt>}=tx}CVs+_}MKP}}2Vqxg+WiL5$gJ?l-~Prz;OkPd+A*GahlSxr?X=!kgV!` z^aPu*%fK)DuZI3uLeAv=;nYI_w#U53Z&QG4-65TH z&f+pHJf`Pwp5NMPHS}UB`LWN7fnms}vcqyJ@;r)-uxx+Kdt{qZF7uF6gBeOt=5bGZ zTiG+SxF1n&9$7oILn8mD-GpGf3Bh(_(Jrf_9p~zub~&^Q_sw$4DfH-kV#|9Eq_z{% z`w*y3gFrjWzAbP9)*p5_p@Aqb4mdoKyq@SZOU3!fcK0#u` zssrqcD0*_@cd#D(1lb@C2$10C80}7$KSw*Hfs=!u9xj!fAPYXz_>RZ3FEuf}X7m%0W-+SS|$mkJe@o=`YhilK~ z74T=L0VCQ3VJU@D1i3y6eJk)s*zFbN^~}Tsdz$FB)`wzVv`hK^so0mkl@3$Szer+8 zDpR~g&t6p1u1}IDDi*s%$Wau*8RBZ^EM9M{P0@AC)_*Hm+`)aR<0-_3yVKK(x1|}T z)On@v-TK|LtD`q}HB7AgPWsX{vF=;gE&Fnp(K2ys2^z|D4>RbT3jLhq63ef<#F1&n z;;r9e9;fw7?0;$3AG=DSivOBxJ~l1T;$qOlJw9h!URl}Lxr^n6!&zxc8JP)R?90nY zZ+;2gUPcTN_1GtscsX6i4D@FkJzqxp3Q(HWFC;OAnZD`h#Lq6)iRoJj!pmHwZkU0e z%#;|#kp|-&bYYRp&@XntrCp9)WUF0jbN&m{Pbq&{EqX9v?$dXBFquBHkj#LGvl9z( zvKP_FMdX>JJYjWn@)RRY{%R3t>!+Y9>cJHe zSAFqY>Gu92n)o#79#!B>gdQNLhA_+1kxhR{(H=VKY4Q+S*!nc?i|GL_%zTwM*A(gT zg^K8Pl)$gzZ1nb;Y&BJ^Y@C-&hO_ex=Y zUQ56JH+ch0o(l|05mVZwB>_exZih)@ zMvrfo76tUs=}d$a&9~B7pX!=2QlG<$?WK>Glaz$5UVYj;OQJ=y;alKGOfY~w#5VU% zIZ1$}sy*eP9bTnp%gK1%5zHpgFW~FtJ7}u+T}-;iZUw@eW7#q%Al>xKQUxfyi9WfQ z#D=!{GNF7Z!Vt+Nx@Iw%924U!dcriaXiheK$M!*!-%6oA>Re171ow6P5;7t=+|6j= zC#Bi`4)*Nk>5$Yn|`!}n1w-p`qvVYp7eu@7v<4{Pa39ptl(ms%Fws( zV3M}?Qc}U6r8|~_8ulzzFC#ruKME|e8kTb<%m|XX3m;;=$`ySFnT1d6CXCQyv~U^F z%>U9SmyrdqPk3P&?xcgEFtD5-VQ0R2et|KijO8RVq-)?okeoXtrISusPR2lB1f2w3 zdpvj@AGEy?*RX3jG4fdLEzd!aA`e9N-`ZFU2stX$Ec7Q$sUU+Ay7-G%iL3g8;`5WV z!qeOqQp1d)u8yPssvutj`|MwdOWCVF_yR$hVNjTBm(0E@^`V>pQT!OrVyoy2m85%g znQw|^_bAm_!P3`q%yt!6;^TCGC8>(;=Cj%VVLE?M`VEL0g;n5MhxzE!RpdTM=Fmu5?f1Zqwe9l`m|4{WCrqr{OY~SPQzv-su$&i85 z{q|z^b-A?{CA~kpQN-s=0H=%Fa1o|R#AP6a>s`|Cp5pl-C4)*rv0u5Xzme9^$QMXb ze3tjaQei`ZgAY}YSd=^kWUmj4zk!k05igMLI=$Dl+^kA$F@ZWekv{tZNlkKlYD$GS zt4GunGh0Hv+LRlhA5q4ddX3h<0Lg|*Ut#Nr*5roYULfZMel9)y5{VvP>#nP3!u27t zgagcWmU3%nuQINR11rG+wx-PJcp)0rQykJLw!tWf5&m$ADN1TMR zieV+`E_@J2$E+kz_fPhlyH@UcF<*0>2|dKiP6x`&oB^2b-l8>_!O@~a`q2kkziC(#YmlJ9*TI1>G!>N`m7b@+ti#5*mFiw4 z@wppeDmIc~W^10`WwI2bS$MYv`e?EogARuYHLb<~T)!(&^P5Cu1wXoAFG-}&yh`?i zaN74Z(lckebF96jB(FTbgeyNKeG(Xn7zgJLTzMi;p3wpDscMcwE~~g)EZ>}b3Y>&B zuaRLx8~ri%(vnCgA9@N#62tABJsJh|PCn_B^p!_tpI`D;`PA}grvlGo10^M)JGs>T ze`K4FOEI5Q&3f`gN_TfU4(y|n+V>;QRnD}iX^O3`8n2Z19VBqpttUyL{hb%29k3mK z0z}Y;^&~U#{9fjDLV;^bjhi<;)Rdl*ZWv(w8p2?%_25gbqdBjW=#)pjxhaY!`|>F! za{M2w`T3Ug+HbL5ieHEP-*o!y>%dF(#WHqZ=lVu zlX#)|2EF<^`E%?ffA~(p%Fe3?I|%pmsylRkU=OyhrHy_ghMrxj*be)z10#_~zb6dO zxRkFYACu&Q^h>7%jFlSTh|bV23k=4wq=>XX$Z3iyMLi5KROjG6iA|d6v7M#MDXx1N zG;#yZmuT9518z|gY~6|V=8pJCc13c~rR>=obkhcG=w&qZO;T@&_ePA8iI#p?Xt} z8V~l<*0)Hk;Z^Mgdw2lVhp zOoe{bwUIoK_mrDi9xAbXE&b_!zde?lWQsd(+hzpoPxYE zZa*}2GszNEE;?~DNf*-m^xvCFFWt}1bVy)tTF8d%6#Zl~iA_4@9EUr}ILL9Xa9X$# zvR7<~`LDkPLz=&ACI)^7<=-Q(51ZxO2VnqJv-kv?FCB()sA7r}Ho2PZ^Lg~j+;P(| z8fg=poZ}@=cB66w%Xiz5kF=5W#Cs$wX0EsPi9z*37T3JGk$I20g@sPz-Y37t?hG)m zT%DB{{Jn5tI5>GI9;@);s~p`P)kuCLoqYecN${t)O#1BCm~RDmqa5$YXN( ztY7Y&c;xv2e9Qz+4TVdkFLu0XKGZ|&2U()6ercl5J}F1TOjH%x)TTx*lxWm zv-hmr$)*1d&&E|Blm4*3ylSBu4g5$CehdOpV?I6gG3lm0vM>^fA5roNnW{b#DIl_p z&i(|eWf^_(6EZ>{)?L93+{SYm_~*EAzTwO#WE_e72-`fzCwA#>f}sE}(CCK#y9u1B ztV6cd_^*<)bDZxm&$Z*IS8|-d!ZyMsAgn-GR}Yaez)<|V z5blEX1cWm`6}Y5Iu7Xn`vgLCD!okprLU{6*0+)<1OK;sTfW+0AzV0i5>l#cSc0}Ne z!StvBB`DwhDpELxlC3zbtV1 z2(!N}2wN&U(>LA_xX}o+x3~_kox>1jl`hyWaKnS)s*eS3EW)f4${hkXKA6tJHiX%q z?xw&+RLVi_%|1M*N0^_2cx~HOMEkn}7aI)!@CnbwA%!bCJ zWV?_z0pUmtZ6P2`>ToQc6pW_?As>c$g>(YQ{$>Z`%K%|x?mN=mz>4!?XEp(l{Si?H zoD%S1dL7v+9zwP#L>Y_*oC*j+8&?b%3&^U83&ME7Ify3!vcE);;~q!63*Z94BtVuw z8Ib*nVrP9uz%rz#0kXdZ=;cbpvqf$Q_aFi}BFDW1*az@w!2W=&LjwSp01gCv889~p z2LZ0kqCXxZakC1LJ`8aN?+089I2`a5K(m|=p9YZCpAYyt;0VCC07nAW0FDA=e-^Rx z1x5qDgLJD5spWgJInp+YO%%+#w>zg&26cT;e$uY%#dA;*WcI$*wQwV23ys=B?^I^!x>RC|4b3Bq3Oanx` zczO^vv>zv%NNoQ{2>0d;!Y#%>gX}M-Vaq9?&DwP_u=o8J;TAMBpC!Zj-c8t8MP_aq zHK`N?a|t`=i#(U25CoRS!hD!U!`8$`I_x}&AI6e$!g%xmNyi1QZ+>iA%5VWJ=;1j9NpF%fTtW=el1SvFQh6td!l}Qt)`I| zNc`mA@VKi;6l_U)5Ka|2j+t;_e7qgrC%3#D zRWFdgf=Ec0;CuGLOX-8f`XZejHy6-kKNMrlw<6phd2|R@Av^%%5*`c>6a#^XU^o|H z_7PZ~L88$ZiSS0sUxXYXOJd6^8cFQ$epD9&$kKC%(P{4I(}SaRy&U!wh~HjNbyh(=iXvhjn%+ zCkXonVgF93<@Lp{Ab*~qm-A^!C)6nQg)CiNq3ui{gFAaB3<>sdY%o5i6RO6^kaffp z?8xpQ{7LQ*-)ems9B7;iy`*e4vu(iMr~C`=na4x4F! z6&@5w!yCA9TFDh^V#P=laO0HfY$!4KNutHk?2W_X#6he=tc53oBXEO_K&VlCfI&2L z_`iV4Y`Md%L*KG=z)Wmx3|0kU;YvPE?r}@7qVs^gdMdbaw5pXnEd1Q7;an@3rK-5Q z@m?fc0EffY|FG><$?5Qhhp-8=JuR^bs0dQSuwYp@2Vu7LvTz@S1!Q93z6i%-^{{Y1 zgmrik7VeKQ&n7y;1MUeA&&hi*1f&8gx&1@I3{F+!G#(unOoN%Rda^JDs>6 z;XCyVM>rv&GmrV6a2~=0i#f6B0W5z+?(}ZNJz=jJu<-(qJ)7r>0olHsiFCGaulof9&j!|pKsXZk6Fg2Vo@+f1 z)E2P!&&UjT9RtVkga2Pgd*FHPQJ(7wcm=Q*;EYz31=L;Qx%&WJZXm0Gg%U0yfWE&v zXNe(QzzhNAxIayhr^n(f9LC7-RfZr>3tKlqo)T}~C&<&`3LvHew-x!=ELexZaO^9$^uYc;2Z1Xnz`pLfo&v|d z>@7g{RrjNZ?2B$ehuGJAy*n-vfa6U9$G&1apbc;o((~|9UdPDYhp}qLC&~hBohoqS zGJ#vroI@n3Vh)0XkgSZ3iS3d(L`DxXbOOE#@SJb~UxjeX5!V530SpH`jC4KVGl1;e zo}t3|59kULaE=jf6w+e=Tacffw2_FjQ+7v$fUgcbEfHu5;8%%41*Qk#ijlxDpB7QT zG$GtN#2IpwXke3!aN_}4jyJW?5CS}m^};Zs>wsFoLCDYWl!a)3;V1?`c0gVT#Z?k8 z1&|$HtfNVQ!!)=J0Rxv=)+>VjQerM9hjCJt%naU{MRE3RV`0tN1M%wPFOp9!e~(Q}(X(Ko0R#R4y^8HwJcx=E^rY{ZvpX!0`QG1e-tN5LvarA`EancG0CKl|TO^-$ z+IwIx^7R-u3j6|m5B!F9eZV%R3dH4VRYG-zmR1o6-48l*KJw-}D)z6U<*qx_I2?#B;OH$jU z#>ojGa&dA3q2xR{A%qWkO3CvvE~yZQKi(yST%nt;PgP_55cO7B$oVsJ@88=)PJl}z!KxhYeTO!~^)t@wlZWFQ1~ zV3xb65WicHhX;e157+pteIgUb%jV>(R&!P9<=~cGZpdn{->Vyj^x079>%Wc1PKkZu zSdDSD*x&rF*7P?7OMKx#YGKlC>JD7|lw18jq<%1p_18eKPHm=ZH;hWFFMH&F@OSF{ zb)8UpROzg8_q>*J50vXvS|O{{9Z^=u=qMWqGw1xynS1Db>{l0J zH<^a6{*gni@Jl<(p_j`MGC)`ezy2L@mS(xp%?(n# zdGpSUjOGRoS)GW_q|(@^BiC<+)nC6EUcbDi;`XS`zb(Qakui8MewJ*-kKt$c#&Pp8 zex59sXs~JTHc1bKyre*iCKQmLB39{pxe+g+8s7*SES3+$4hik;%Mo~MDV-QVMrUhn z%eQ2Cq#h3;Z$*|BRPD>Z930Wy7_sBrZ(;dwWz?X|U!&}~x*9pLG;rH_EFuEFU$ zo)P3i2`%=Juu3E9iwVc&~?N_SEa85~_yhzJgB8(l@zu zJ4biqiG%c_j^{`>xgDj8-RmxHuL#BOETQj_>}Yk;h?d$R(rd^eF(a#z24it+37ttM zMr$I@dL4U|EeO>`k`>Vd@CW2rbVB6oK4nY8x@|RybPM?{x;y@X#Kv^TuaSWGUC<`ZlZc+OMA+W|4DiMe^OrjpOp3g zld`HkCF&m1kCU9(x9|n>eQb*AYj=1fYMGFQ_^@WgqfMN-Mv%}7PgqMTCY;iQr;!R} z>9R>dyi*5b+MA9JmcqE`BRZ(m(SHL^XP^6J);wY}RPFYCw_7b4KehzoI{CcOAx6}k{xc*;r0!z1^OOSq2lI5Ie?80V75 zlQL56o(8MGDYYO+NTP4})Q;dqn++Kc+r^PfIis<`T2>PWZ+7LuaL z!#t_bRC8`Od0S(|e~|Ar#qx02ax-p{2>t+Py|woXz8vHCNVrbZR~T*z$dVU27m5w;BJ-;^sv zTQrdUxL3g@WMe;VRztv99~`O8GbhrQ{aCx!g_OrHW9vT`sR8kwBa`YR-|08tePnW0 z8ty|L%gV;9$m>~}$bMe)4GA_2GFnZJXJrr8d$q71vgsaAiz|$8aY>bCA(0OB1E&?x zrb?kyFhSlO!PF+XB@r4D=`{;E^lfj;rNGM0$`+GRUGhkkVJvo&W`ic731~@C7`+*s z&;(SGgi6UpgJ$R_KCNJcy0Y)oWrVsu^tIQO3tOZF>QX~p3QHW+RqruET^Zg$3)XUU zYw+yF&Klo@8fy~rJ#wM(-}e4> ztuPYme$QPP3SS}7**&n1lw~L6)Uk5~dOI4HG#i=afz&2xsJDN(M+z;MTqAPmlLruL zBu{1^(+=>SxQyy22}QyH%Rs2}5jU&j*7b|wFX?j?cD=s9QVBVpam}Ym=#PsnE(B9? z#BXe3C0c=QxINkdseBj9P{{Wvjx5ajNM;7JgkL&L$5TtF%SVl`+z!)q8 zAooz0Qrn>BXwc0GQ5FGG$|0oy%HD>Quuw{=>y3-DP%C=^?MSo%cC7K?#ScA{gV0yv ziMKe--o(6Ij6Wm;yJ{jI3U)5Y&7`Jl_TVu=wjjIE3xRtVRga#yzL9pK>G&G zf|33wc<+K-&KBfz`6I_(b7_S-N~>Q3nx{ zS|aLDuCx{FB5I}DL^=~1(vXdK&SI{TYB|{T!&_LqW-&sX#nzEF=uR3dlOLi}*+Hi= zM5m0Dbzh&<&n-tuc793WQd@akYmHE)&Zi%f-@6;|CnUTe11}?nf^35rl)CPZH3|iE zvahPP^Z)b z!A07_3*KuNON9?zxIjt&@m;()LscqFw;`gpDd~5f-!29(rU~;hXQ)2EIYNS-SJH(< zEXwYZ>OFQ5J(nwJ1tm@OAH4G{c$)7#2V8sqC>n!h$}KDLpmJ?G*nKSsQV6^GRiZZrmzxA;HFO$NOw8+=IVdk)cK~>%9P%^G$ z5}r(&N-DY)z+S0q!p1oJ(@jXk;)kv()I-P>LbKvF)=7*CdxnFh7SaqK(UtbXJIKV+ zc`*E6mge9J(pGB0nWS%@^<39B@^zm+cp{PYorDRg?yJGCkmY^z@NZ;yUrpM6*e6C{ zPPL|PG!5pvlQrHTfA%%tmq=tkEq;dN_si-12#8HNAXgw7=VD=dneTz2b(Trwq{y(S z4k2}N#^H)Mf$fOxhwG4H)o6vvZk{RP7YPgw1i2N8`0{$%r*YoDz>t{Sb9=U)FA z@z{l?fqvlPtC(!u+2)=u!VTyKLsB>(XHtRdyls~aJ$K?VR?fBM z+TtzoQ1|qJ`9>rLCPr;8OzZs^I&Yv?JI=Nu7?cutcge$8NfP8A8eoGHFlEy}4tG{_ zNZcGInMh&=X5w`uf1p-&!!MyH$(Vutm%Z%6^j{w~a`q}~Jq|xzenYu{jctTEp1yXZ zn7->eaFl7sMAB5uf!s;@ODD2r0bJ`FKz&V66d;UoA8h(?p*R;zl8l z=KIWv;(2<2?j45Z?Iv;3t^_$s%jmV~-w?Me@?(BT&m55^^Bo;EL?9K7}eK~ZJFW^i9 zsUX9iHsVJYA7`NHKBVP=e4bCjqpPdYu{|u7qc+Ge1Yh*d_J`z z&z&{&SOOVPUOBD?NJsko&d-A~WU$9lh5KkvEbz08KbI`27Nk!X(u88VCkW4osf1%es8u$nHYsVEJA>YEt7yF&^Fin9aJ(r^ z5Je8we4WCWYELlcw`Qr4R%_0tZ+KMj2nAWHV2%3vbj>Pe#Xb-+JOobO|UD zxv*U`8uav$puvH8Yi-*_eqFUSm%aj{yrY)olZWz2PAe_RkgqC;`2-NpVjL+JhwT~L zrgBMZgDsaXbjuu;wYG8&Vn#UXj}1$Zn;JoUkdvQ=<*FZf6XZa;=OEHcs*Ya9@vOVp z+=DJYjLMx3aRiE;f}Oeg&y=@fL&sK4jZc6mAaF~Cj?5G zc%5=5FBDN1NSHiGtZ~5j5z0!FqJrkljnRTsh^u6JWDk0cY`!n)z9n8{yk_ThHL&T6 z=xG_*S*I0ri7b)F1YBA*VQDSsY#whohSBYGw6cE8_*w{XT%duiod zV2@^@8-1578BvTkkq<_^g}ah*Bl{Mv+KPDA@Ms}ZNC8ox3rzs+Aju9&uJtQxxRp~;#pH`=g)r#!QZ#*5x(os(uIDtzw>2b$KGRdf)qBzdq9{r zf7%!&Bnep12+6zHh^_L@r&9T*CWYgN%P5|uyzQOPG%qu(C(8d9WX=*u$@7xB(IY|L zIX=1vm*XRW(JC(8M^s~aCCu|iH!{J7ZtSe~0GT;vF+M<6k1HM{u@Z_ST){E^2heTkCE!JeeqZ1)v=l+3s7UHI=$y`dYiP4{S$vpJ|3rz zP7ju}bk?(poFBIYKS3sqH{bze`FMT!{RgCNVJMFJ$?oxb+(=r-FVM(6tOd!T79`li zV2K8uhrFD?TMW<+C#k+aDdTVVdY7`+Xg%SILss~oge*dITN=ux%gN^Z)!0rxxIdqh zV)E<#vj!x)81=RiU3uu;}d5AeV$VcW8-pVo7-Of!ZMGIhA@rjX(!T*qwP96<1Y35eDuAPcNmmkhjFM=uAqt(zktpk;KEEt5;)MudnptdoQA$%ws0 z&QBhPUnIS!bjMGT*;CY9k7)Arl!dsJxTj>~X9vP90HxMr7+IxBVa9a(k^lLn}8x|0V3;nv%gcBaAqXfD>*{i1?dD&Af z`E90}dsImRGatlHlS#Asb4fAerCASi-902?w!oDu$>`Zn<1fkC*+cPzWb?IT($`u6 za>g?2M0`uc&v41)y0u3J9Fx|tCeu$+}uEq zlhrlZ#jD-Ywp5g2QGlkq!lMP&sH6)#tak~aw7QP8*&dWFz4|5UTA-(M$@!Y@vVTi3 z!X#}aweslGCPn1wYRj_?TEGbW^Cq)lefV)~CO^4=%s|A{%yPi8C_ z#1+MmT?;l~k(4eh28KOWr+|= zcaaf`_36}8BHXyx`X)wgk0aC*OVKcx@hzZA6FNSLy!l`P`Ec7wJl609|=6@7)h$rSHA3)X%oy|r_-~eDbB1FCKMQ{KA1)*}|YcB`}gsu27OlR@CJVuXf9|iIBC$bF?V| z$Q`ZWo>ZEL6}X&-{du&mgXjs*U7|ZeMDaaDJ4xP`NIZ1|@XMrh$zXhmEL)<+XUVHe z7U9z*Zm9-;P72}wGBRqZI;j>GQ9_7^cNSJ5>E4w~OL4-FL9Jt}LU#J7LSm1z@C`iu zj(q>P1|KHZAJ=kE#gX_YHsP`4jVDUE-a+!~6UJ;E4Ab3(-4B&T0Z=@exU5+ zwmT_BEuY;~loEmlYv0>{-;40sdf9ogqjqpcX#t0vk0$iMmbuuul@HEvYLlV1VDNh~9v5@6m>yKy` zch=mUzL&__lD765?Hz#^-sNz)?`A z8D6gl1O9weA+whY5y1a@09lon^jytzrEz5Z>gVt=a(T5nV~?l!KCAU8lAfMV7a&<^ zmU(TV*$MiL_UV<}m^kwG(@S{+D46w%;t(4zI(^w@wECPUKuCJbvI^!r*+WcgM&rK; zSu;54xLf;V525C!EKa-lvP~x#ty=myxwfVT;H&#>`RYY(22iiQsIyFJkU1LuU1stc z6=yV-nLubJ*=8HcbS;}&SpX1m#hu;`kKdcV_7B{Jr`axmL1fXPA&VX}PAb8ZP3 z{xU6D4d?}Ej*Dci8-Q<<>FWydbL53}3p4}$VMfWxewO|X3J1zI2`*w;C*>HqGjO=Wd5^ye4LPHd*j{Yn`evhIfB=J14DRX zy#_atYwHIxQFVhM>6$;RT|8aWxmBJ5QD*jrCky`$hFikTF;sAcnG*|mdOi>mGAwd) zH2w7mLi=}PL~{}U=MM<=gJu3FN!mCw#pN$|NX|&wa--fGEIXMijIcZm?FCJ1V+uY` zc5ZwUZztKCdH`TLX;VhrQh${d(PgHpsuh-%K({Yhv#AVk-+O$M8z+qQ83krrrfZZs zhR8Ubi^%Eca=2c;=ZK2S_K{3dq>c8O!HRteq}LqIBy1K2Zwol%JPIVUr&|U=&3>|g zXfytXWoA+I5r%9tfr5O~Ers`ymcj5IuuP&2{|*lIx{E(6L5O=kb?7(SG7kV&_;e|qp zmC2DW4vqfXr`#(QQngm$wzHMYeo+q+$~yQzg?#Yhlbpswx{1j!E`!CvM(UP>4$ISO z57SB!%mEL_!6Hw{26xBoRUJ?Ehz;PnFlNg{JeBO;G8lhPZf@z%sokV#>mac0J+@UX zyXxxd*h&@vob=w-7<`5t+}gL`9WWV%M0H&ph+kgkYu-LE`uBOf&W*u-+TQTI&~xU_ zQtlT|y1W#SYN!ql@|TA*x-U<}CrInd6=2{?dgXMiDL7FlYg>zDZ3XDIvzoYH$x#jS zu5wB1A5}@aT{`vO12!v;40yE`&m|wcs=>g1U)ACk()OwvzfWRcE5qx_sMqFd-T}0< ziwwSND1W&e-68 zqQxj^=om15vT&V$JuoHq^fZ~*pblT?=YVavoYx3x0L})v87iQl!-G%UbC5kxPBff~ zyXeylbJ%v2%k3!^bwehsnx<{pg_WQXV*_#^!-!jr3u4T-ow4o_w}Z8gdUX?qBhuw` z!Z}uZN4+~qUfr%C#_a_e>wL*(u8UNQ3@&H0UkQ#Wa#)Y?K=~=MXnPI}$E(|Crx*JQ zZ1u9R)5Z{6^w=tdZk8U92h`QfH&RnozWHl;7A+S~o+8ZO#PdcBp2 z{bbx*nxt!<3V{P?#4LE6Qv>b0@s+)6-_qdh{=SClnXvCn2-9<5)rq!qLK3JOnRGlz zK(#ILp^+L%zJFVjd(j)@SGx=tX&Y)Z^o+Zq=5tq93;>fk3S4N|7%^k{r6eg58_sh& z(&wEb*?FS`O(YB6$;NSH>pS^)5&80+9@s&=@1${I2_$((E&$?XJJLX5nY5!UX`|m* zhd^#;dbz|NVbMWD#*n5RdTy+Q{Ab74zyY`I%!}y>cvB~*TPY(y?d%5(DP`BFoEO}3 z;5D@-IZZuWAhg|C{C(tiWO|eca?;ym^DbuI_;^<#?ny51QcGb%TqNS%UOlX`yICKR zNYO+p2^C?`OCms~CYj=NLI{SH*yAk;4QhIeEP8ivbmcwedXj6qGhqJDzdI(a;GXn* z>GdS{y{7??VcvUV)K5z9*2#o!1_5J!m5WDFw1S*_uVPGB_aOeZ^LLl4dWLF1J=c}~ z+=W_P@?l78>dD*O&gnsi4QbuZsUYXD#l%J^sgDE@eqUKeN2}92TAgM|Z*TSP>NMH^ zY2EMF+k4yIgPkP&{V{1*?`a+D!QDKI-#37-)64H?^v!T7z{UV8(SOBO0tf?7|A2K5 z&QV$fnge6KKL&923>DY)!l@G2?)1({^%7}&Ujvg6_d#AxEVzy^C7VrQ7Tt76W{H88 zN&{?*+zSKP$;=Nn<9g!!pgT5^?8c$@Ib3PbJ0w?}PKB@@l)e;8DwLfCdpC-X31Ij? zGQeB0F~*)@menFaMm)|DK6J!D$HSReYZ`HDX>B*^IFvyjCPx|#+$;(Ct8rmcv_JYj zl!cCbcJ(tPyLuF1z}+sBc}*#B46km|{;#-0p- zkbCbLoNV+tY}nX*=H70PbCT!w4Ce}c$an)SKf+d#1fKc_ zQP*}5MhdZBN0cqcY-JSVWAzG%cRRvj(vDbmD8_Zf_#+(TP#?kCW3|jBEcFPZkOXo= zJ1`Lk4i;*<+S?9HMAFavd=n_-n&T zwoW^DaafS_X`TTNGp{#ifLGeV=EpNCz>TFuhy;XjhDzD>pHtDpk-;(GMgCvsLNe;3 zBt9>sM@52SHcutZztV9$IZh$|>;n=6^7Ydn4G$mT2?uB`le);ckJRD)JhGiE)myhAArECEJ!x(TM@hO0AoIMNH*Pk2%$fTcK;E>aaUw$`ADy>g5?7?09x*0 z-MM}0-V;T3U=k7G!S&E6NlC<``#;s z)gCOW0h~I?%S@M;XRdk(Kzin`$81n+fpnvX1DpUk3(zK{$J(lz?%+)bP!(7~*n3lr zxe4ADB0buiF37aq0gVP|Jj`OU5pW{Z~!%d6OqEw9+)rEO9(+N2kd zPSVhw7P`pomRyiaw1>6Jo(nkY$^b}UXi!B+jWC^tDJs(e%BrF(51ZtmekpXPtE{)2 zH+;Xj_5m(l0ez43-Ew-taLLwRUl%K_2}%AcFw)*~p7XWma)BxmDa2Z|Kx=X!#$md> zuaK3{g-QVWlodM06mX2G=zRgl!)jUz{Mj+<-j#1Be;$6vaLwz>QEErkLzUH zZaXW9`{-PQ-}iizYS^ny3UIrdBUG!H57l)z@?*h4C|8JwLtjO&lC{V5y0ajYBq3J| z=J{HwB^%Q1aJ;)(I^Az3DfWJMtO|2c0aEa37roR6j)dD2K_tHAJRD?Xe{&&_Nv#0D z=z_Awf|g&&l1~Tg?cTfjo(bi9_fEcl0xaL(Xizy+su%sj&wi1B<-dTS?ebsRYbR9U^d7U?&#kw-hR`0ksLeT9W;ry z;~B;4{b}^HFRZ2iuM%*~NE8yR%p-{d-wFlH?Mp5l*qn@@prpCNnqY6Xgqv$yu8^{? z^~S+FIOJ+h7Gj0)x0v}VmnuCdOW_b)S!jler64|+0_%GA>!o?ieX@7I(uSF(FWqt` z!{&(+zA~ayUut*NNX(mt@IvjO$*x52BfubzlEQDYHLv0IR43 z;C2=U10D!Vt(i18Kn8r4Ht@6les4f@#Eyx6M4&K0)Ky^8R>Yf2{>v$PwFrUsF@8_ z7-Geqsw!z)6prBmvB4v5)z3tF@O#@9XU?aQ0co2ObD=jZHF{eNq=E&pgHnp8su~y) z#&>ckwkaUTbq`cG-QVu|k_o3wCwDptK8a7_ zB=WkwH@J}gXfI6BhNv=SLGqcn%1=Z@D5*)Ou9YfcjD~uJGpsU3Lt(4 zb^HFg(~S#2xq|FyeGv~P15bAE@h~X&D!RfaMUi$eu1OUkQ-Sof4m27Al%3*3SsWlM z9_Pw{793Jl^b*;2GAG643n`!#ne;5oYiGN=hNx$qdIdj3j-4tSA^_$VZwIFdI1Iv1 zM?q);1X6Fy1)wVusBibSV}dIB>>)YGMHzIfH)Lo<6F{Qxr1}G~{4jM{I2fLuYGoeJ zct;)`vF?!p_K_|F76jzVMxQ z8+?k@EG!FUb)-1*=*K?1>u#Gr15c&05b>FQ=Ecs4SHTnWqR*p~{BcaaTFFEo1x*K_ zE}lx<@!*gjN8boW(L7HgP4mXk)<6m!3No+6&Q^B>sv$nmaJr zj`crrGHn{4K_kFz`op#x1Hwy))#xBH;5w}oTy7`9lodD$ZS%rAI+btE)mhu~)V$HOHw9Qic#SU?W3Ml$usGBD0;`*AlIHb$K3 z4Qkq&Glh}&yW8z{D%wOoJu{A55ku0?n)GQN)D{24d}^5U)NimJ(TlN7itWe|ww=ww zO=lB%@@#j!hwMI^7yqRT1N^C?Q(W>;2!PU+vn8N`>wnVbY<7(VhMeivF!QDLsc07XQX7Gsm&kt3lV;F#7wP%44h--2|2zWkBJcdH zkNhqe;%HM#tdz7OM7Ls;0jkVOpOQ+zZpG1vHvYYRfy!f1+ucB#lh|RYAheB?4NeKBtaL2I?lD zzB|w!E+9kCW%uxaWS2qz3jTSg4#rPtnVLQcb?U_$BiBKX2|*0G(ub?#*afs`9D zQu5omWT+=;>I9J1GeK9c2ZTZ0p~b2IL{Fy+0^0jv8Feu(;6OCj&`)8@^3aaI{O#cd z*y}9*Ye)R2j_^PJ2taIr{eb@c0crg;Bl^TWt@wqwf9)TxKA^4h!IDWM1Am(s{Zkuysg1?Sa}`ZA0=(Sr6}G9DehnAcO=$P2Cgcj z97$kCob4D47jt$yt^zQ>_54u$1^M&*YPhX2_rhYZ-krZNB>9J15@fEh^cg&U@bIyH z3SRW}x zXW%z7N{Sp1ULsHa@mOm0a~S!Z!+qB2jwQy0Oqd8mI-2h%QGZT}Y?;m(D2&`sw`Z$lI3h=G>X`Y@d9@&|T8f?llxn z9|ilG)BeXr_ErXOhxn24a_jFPZO&L+8?s)#N7PsJfTWaNselu4^_Bj(h@K1uw_!I_?aaXTq7jK14A_a?O1}$}E(C6T4Kn5KK zZrcCar&1)7Uj1CrwKp?-X8=-`L015%lR^8DA%Ev^VKHRk-$mf2^w!@7aHam{?>so^ zoqyLb#dzAaZd`I4dG6Z#;6hmT&wMT?j_mnoIGDol^}%KF0nn|$X2c9pGW+kg?Y2Bi z?}jug2f$`M_{MSXmkG5hE#2TP6)1$yc(>VV)mr+r_q>flxPq*?o&%s@)Ac+suAjTE zj@<`<&)pjyH%U0X#u`J*I7uAo(^iRZlGSZ}!Q6PPtvmjhw6zri+@Qaa!==WP;WwU2 zALx@bw!1e|lb+5w(79#90>on)K(cOj<05=y?9CnN&FuEdMk#=4Y4ii{T~9@?B66cg2FCG~LOOUdjJe&t_d*Xl_$EMnpm)c7 zQ|6A@jEA~Lq|>nnw}GIPPP=%e=rmX_n2%0p>;5MDZ%@THNSad}n+jewci-$GgPl|H zDe{)n02}HXrxxx5UUTLE_L<_!k8cJB6yP4_Xqe} z@|LG!Sqbb{WiuymW*Ig3kA|)(Dq;UBn{D9!RRadlOpg?dCR&>Ak?yJq<%Ea+G79$2NDefnjoK#Uav7{D&9wk9iOSpBE>u7hbs?u6s zwbr`4s-3vJ5*d|Nsom}>;v=e#Zr~iB%!#N%8*KIM?p5Ii_=e?>(oT!XG2oui z(B{nca$WIR3`S=_aav|q*ODIoQ6u^G!GboQ@v=4>Lvb7$lY3)NMwQ%6oSO$Y#Zmq1Ux7s>} z`d(tBgV>fAv^WLtd!ZCBl79siX5D;Y4<3yhMYw_iS4E@5moR=!9tQ2tx+xCeaC-7l z$aS|-54l4F94S7`;f2^Gp675v8iMR_^OUd(+dHj-Y+)@_jF#XG+#u#akj$EW3C;-) zn!emsirQyad_aPWU`dG^SXgjV{6vCv93LtECBc>WEwNAv?d>aCq}WorFc=ZS4H0!7 zYIfm~3Tp9SVSPC|nIoKEvC5UYsbMX3PWD~B$k%bkORY@rVki17@f#`DNcD7xOZ-QQ zyT&c^GD(V~N>J2zxXv_7%#-0!_=xzV3=ig1Uhy*-?w0Xc5UyDDKDcMwTDUstJmo^# z9_R5+tBR+uiqUeMmK5gh334E!+dT*OXgAJLvAP^$UpbyVXteK5EqFmI6X8ErZd<$C z#VO@GcDtmTqTA${r{%tFYm@bJ1V;HG*MLF7;9q{`g;7GdZu`YDn|uej*}KHQP(r%o#ajxoZ9*H_o@llXjv;tr>1a?`(|8?;$km1BiYddc}ALYf7v~lttcC~V;# za*H$pdNLylcf}TQa}+McP-hhG%f-0GuxLniip9~;&~su3I*QO?2o%X3O8>n-Vcq|4R@@_c8_wjWp;H8;oOl@Ui z>jKZVjYl)#D%npgHpjyW+cqA90zJgISezEw7?cUxx=$fND;CG%CHPzMgIJuD`2k$H z1NnNR9EJ=#;4*oAI5>bo$_Oph9TG3Z;;gho{&N?j;Jsr#+VsZy?Q6?#b2yB@;dF}{ zCC__z{JoczYYEGT-HX!;=|#C03DtqpIC;8{gC zobMjU{jWSX4|e^pc;ulj5SO+M2Nmu^*D!wDT23Di4JZ{0<8WH?lLrg_D|_uh9qkzq ztKu-vU&P^EDcJ$gFzZI{H-p>Hj{vh(&5VGdQHg8f@fcV~ zKgZ+g_=Y$z0cPn(ad85S*GuB{1UwW!!h$q$Y$E3I{VYR@_-rCh?H&#HH6?bwF16_e z0C~s5j|VYhQ}Af!j&l5y2yyh{wzYXeA7L~!+$x?*#0JB`V7;I-qb!Xwf^Ir z5X>}}uI&Q0{)4VMtG($T=T1?bgfqA}uh=IEKOiy4rQ-F?5`%as39Af4|A)Y(KqrBr z9Rx~41n@SoGzm|V{4VP#|4MRbl^##VWno6oB8Lo&>0*2e)+rL;u5TJ$D)vpmno{I> z0W7HI{r@^o1elQ`jV5?szGxIuL4RV#y5HcE%Mjs9aELs5bxmC4RqzJ+x4M=(YekZR z4Y*a@4=g%C;pNq%RfYcuG zVj3>QTg9|=SahqzigbLxk{)KVSEmG*>JxXR<6qNm29?8paP`A*CBkl8^1Q1g&Q>1Y znnBlz+cID*=Ol@TGjKQAu^@G7#I_8aX2=XOJSK&92j!H7c|inMEee3+Z3GiOQ*u+G zbaxdjp_vJypuz%d&h;v2$b;g?Dx9A%_{bJlHf|`Fozw{ixQv`k`-x5!&gP6kkyqoc z1A2S60JPp%VT1ol<~K7$MPm<^fT9|Hnz@oOAdIC-K?Y2w9_ZIy^X`L5;xlUOu`CW) zmn;v9u;ZKRF zC+3EqNrJo8$#5xEG-+|J(dg#u3IL$xYb7wazA_cX;DYaiUfEjPoqt*H9!vW8IW3OC zxJ=xp!)av?_}oq~2B6+{b}uc1zUN{0TvF(6FR#-AiUU+b@wXrjH({`WYTP+ilP*fI zsM5^;IIBdj4y#M^d`gRiUthW$U;>81tPEjav@DJ83c;AkU|;35GT!4n>}tD5efdTl zrN;*~6N3rcjKV+8o-Som{BV>N=Frj{cN`cHSZa=#mxcRt)sKEWCkww8(_87Q7uapW zPK7VeRvyxoli-db0zOy<;tMDa6}Oz@Tau~UyBx5mWcsf-um@Jd0W`S>?0^AYacK__ z(!LO{^}uO8YrK3Fj9kklo5UzP83wnVlIWXW=DK2pqPx6E%2%xC!c zkzz(~*ps@TIH)&%0G}0K?+t@8Rcz@EXZ2U2vo{>N--`MYoFBQ~UkQ+D3AE*LaZ(9R z(@5MBq_9_pu0(3+ia@&u+Q+UcCEh`uzlx*;PWD^kmnC>+rpABnaticV;vGIX;mnIo z5L0kQrM(31bE@59Whw54jpCA0tj?e2zuW5v{rj52w&uEI%H66RdvaZ|y!NiGUq+PkBC_^Ey6BhEl>ElWQrzT5|d)!*Uz0N9_q_B~VP*dOZ9b?2wz@jiGm z{!Gm7i}SfOzc{`x9zWtYFEaE6OI{yWQq`2EA{e0wFhXB?jBuAO0)flO51d{B)yf?0 zZ$gmB_8PqYvnKT_kP#{!eoAbh`k_=>W_Qlpt!a_wipkAG|8{3TD8h$ zK)`GeSeZgHo`g;YHM^4oKIRua{b2z=ASMmK`XOrrou-g_h4l2aXS-U88xrYL0XYDf zx14XfCPMF$Xn0^;Q#hm~(F^_@FniTl%c^pg;)Qt*?XxWPnz(EL&evb?C%UpUEa9BL zx{ifs{ng;RnnaKLw}ryb#qS4zSW_4r4rZAq_ zq1igs(BD0BFs?{I#NaJ@Xy0$*wt;X!eJy@75SPX61WYFY9J$l}{DY`A;p1G9U%X_( zz3_EWQ-(7V!XOvFigE7Fp?FWcuMGQfy*RWSr*Vm1aaK8K60l{!ZZKxt3HGALzBk(74eDm`NN6yxx+ziSuKJ*iS*gSoF3bxIz(mrg5c|u zNLPv=CaC3)K*nUBm?hw`c%!&Pz`d8r?A%o@Idjlx)q;g5_gGZN_i#CFXOSVvA-gJz zOB*D&4PP$UHY|VI_TBO?Y%we3Ylp88)^1qw^xE%Me6dzpFi#b;^4gvk$}gUh@G=L` zf-<93W}qd>b)M=My1{wXIU0Oc66wGGSoo+0LSdDtEdeLgO;RO@J%-?&391Y!YII4I z%j+9~;~c9`q#MNRLvVKb(iWw5`C{-_S}ft&Ra>NswaB2yI*(Xj#)+kGgBIqP76HBj zSqOp4w#=Mb;B@A;-&3?mA?J#gC?L+pY1%_Gr&_1iOb1H~IxjwHhJE?O$6uQ95DfBl zY$eXl`1Q~Ls4WU=i-Fn@SZ*s-W$WVVgU(iQR3+Ae;J2s}PXcY}`$}9fd;lDB>>FBA z0Y3L*H8uV1OakFD2qsWANq;+2_sh%(4sX_^=R>!_Sc7`NnqkdpbfpzEz;ETcl`B74 z_sL4}!J&8tt`Lt61xbH{=p2gm%aT3PdRY_h@^o#3OIp9Cik)eRbS~V{i-E~!w*P3b z`%CmPtrV6_&@HQn4FeKlBAp0%I3$BSYS41QKS0mHt#TRU`r9psTn#SC$o8Cr4ua$L z|Ij+iXoYtW>v2%rJ`6vV*$aTcpz}6>xwS3-y|krhtX3RwAAVkO%fn_`6wlrVoAR3I zzYmwj?>fNGDO;kYJT6qjHSI;yDccLIosk`coa4UPpLoAF2xq`H-PR3=pV{j$lnc`Dpa2EbZd}9oVppg9C7(9iA-Nxd~v@vchgf(1sZU|O~?y@tC9iwDA zM4UMmSKt}q&aoh9^cE%K0LXwsUB=;Q32Z29o0Y?u%g7H}-g?E^TYPyOE=~!JF_xex zZYdgZOR|vL23KsHr^Jin@Om|S*$x*5okx7B!#McB-X`}X5Pq(Lezkc#9>Xg5YdkI* zzX`xIQ?vvfe*q(o798g2h86@~Z>!)tbnWo#$qrDh9ex!GIXk#)vkk|7Ay~E@Tnxe) z+YT-k0Frk4==@IzgQn1z&bFNBz_;t~N&B=T ztpw1=&V2hj(!PRx4FCM9n&F?~g^7SULYVsizJQCw=t(#qXNd3-7i~PNwGMJu!Osf6 z+6eLCNq9TU9seMHYQPRivq23;CSQhuJ^|AO zO?iJZF3)FV*d#W(Cfu3C{L8KiIWU=6!OUNE&T!QOSlL{YK%W-XQvg?8FP2Whg(;7; zix3qcoZMrbeO+8W1yAI%1L7}Ja5~p5AiAaioB@mhiYB>29xO3H_lolbphmoqK&fb% z3RIoq%&AzP^ryewte!-d-Vsa|v%(|9zo&wBRV#X@Vs*}|epYn1e`Scoa`4PD+UoD9 zEqb^wo(_iDc)C_Bs{$!-u~<`u4Jp(7?NUz?b>1U|d@a6Jg|~*Q{fZE=HgQOGNSm2i z4JG%8>#K2JLy-@Bzd(CWfKRln09i31AQS4W45Ucii>zUL3xLm*i`S~LVOWDN8NRy} zrW^?vO}Xb)_|zIJ#`zK)Nz8T(UN7LK9=i6b0Ppm8YV+mTSl+H4hLFMSiFzml%rdZX z8WyKa!%Oq~`(&Ugw!zf^3}FIzvPgxAAl)R;z1~{Zh;X#mWTo)sudB|FMA>wl-6z2p z2j)vD_`)U7rC{Rny$)yqRNelO7|CfFd>130A|F(_>H0ld<1j4FnvS1J{}{d(*KUXh z#~--o+$pj32ADhpXLp-@5alR-VjoJ8+I51$ z5(`b4?A>8Kwsgi#2|l)viHPhFGZ4ky)^8r;F#TAdkK`3s_95M^w$msn{kK&&Cxgm)#{Wwx`|j zRZ$3A!NknMf5nZn0dM_I{9raHIIoM*RyZ`*i-lG^R59EAXA=UlEAmc77u|Yw*lLlfjX?eKO#qOCW48Pcyb>kIL8q z+5VMLkfdNwRe3P{pA0h873ac`fWqSQU|PibIoP-izGevSu=wgx%r!0iDAKBLvRE0U zqBNxr(KX48;dX@)92Ff*4AKhnhAYksUYSE~w!;@5WDxt=8@O2C4e|5m&oj&b*S3eC zC6fk^9zEFv-<5(C4DwtJ_%{WeU&F_4YMVJNYe`QJ04)#}#Cy1`syz~|Ot|9A1tjo_ zQzGKIxVXn^U&(&Ch110pO50-4W#^MV=IE$wX+Qo|ZNTcx99&K+vqEa z1@*%=G|70$Cdn=gUkFjr;owKcTyBemRJdCcM=Qle55Xjsh~h&yCteT!!9T)==~Q+4 zDa6Vik~v~O`07Fb4+77-4slh+Fpw0$KN}{X#FS~#m=T@3ugZE9j{p!!arz(U5kGHb z?~wL}a~`hMUxFX9a!^ST~X@u8PeWylXZ49vEPaM8N`vm#(O+L}oJ1K%Tn z6$4A|Rk&*0E@m;G?e@IictO5l*%o_E4C!tzEt;uST-Lg^d0YqtG99O-H3;)xyP*7)KLE>Olq?ngk&YSay{7EXy6@yA+RR(9KJ(juI%QT{*9-aIaM{q+c zpS0z1aLI8YQ7geE!6h*@wX}~`CO(W#S&){RnWJV%mR{F;huMDbGiddE zzrR0zuV20J-nsYOv!BoTtnUNcV|r~}O3b~23m3V9>_Bj>fdwpf?=~u%!_wln<8er_ zb*d!743K~GhZRG1(1tl|Sj1>;zgsdH>zdWO=;9of%Ev}h_@iui#FK$mm*xv<4V66# zOY1hOdX)7`x-THtZcVW!SMQRmrS!sk1M0uA-YWKQqr;Da>Dx}eM_G|!<5QCCQ@hcS z$JluOi=TEp#yY2N^H&CWW*+33bs4aHT7kx4P6T1!PM05JC0$knY#{w<*J}9v@{BbT zR>u`Lt5f{5@j;l>2LBqRs4L;nE+i>qXyW56Bkq3xnbkUZl7qi)%BUM+fCKyi+VnWf zjPKB*hwAUTDz_Y5y|qx+Anx^a1wE_)6E+R{-85uCKbStLq9M2pFDzZuQc{?&8$rgrhLrZHTZlkTpz8g_ZDV0 zwhhzdv_yn{~M?W=uismJ16s`a;@S#5U& z)cgIS%(EJ`uYxu#gL+qC8g8VrDlmf^X<-#;?nc^L#S-|97W$xy-JANj*1;9B z=V2x`d+51&?5-%F$5}pYY*qCwr8D!`18o@sPNgi##j`qNkw&7Ie)G_%`G{QLG-p10 zAa1Ykc7j4%n>ypBW_2^2nGbc?dla#Nl}2oHJDg^l0UtgH_vcakMA1;y4WUW%j+``s5lbc(@=_PQN z3zsga-?dDc6i~-{+Bl_+d3M?M4aiv5FZ9zwcDMdfEcy-9{RvhB#&!1-tRVUbly1TT zBg1lfL9M2cMQrN*KloCH%T?SWHyGp#>JBjCd5%Mx%s3KZPYwuse7uqZCq@hKbOcK9 zQV0zq;8EBh+9~ltCcOf#yZt{B%-U@xEGM2mU&QX}u)=q?*3>!ld%n|Fg2IOkt1~H! zVDPyYl&Zx~>DBCxw$JW8trgdp(vNE?5_8Co3+hET&8TLHBTDv*XM=17(~OWJYlq}J zzCztf!GHI{_jCQ=^kFFi)(k8~xkFPCV17*N+T8>{LdlFf7NdND_@5XXlmAffqsD5M zc4wLInz~1;s}uln^0dPcs_Rz01+W|gxRs8eC4)64%N5tuS1`l9%l~drMm%+{VTXnk z?@!D(DeNO|j#1vM7m=pzgdaX22DY{U@yxDo7!0m*M`0M8i4Cs4DB7z&4`q_*c}ccj z?a;%x^>_4s@5L-Fm4O|*t-2aNdFsPLeI>Gtgl9-J&037f@j0zr%trKtvw6Cd0en;x zw8A5GGc`z^LZKm#*I06R-39giz~d=(l{*V>{wx@SFg$siB9^d>2*=)5&f$W3iux{r z7;}WmmLT74G#|gxzVap%v&xbVtU|EEQRrm}EMMvMk+Y*v%@63{5|)tsw%6`pk=WH- zU}l=&NL?lh(We8xm98xT3;PC*Sc*Km(UhgEADj|iUWyH52>q}WW`thkS<3DSuY!@V zUqh36-A`ke!7g!(mM>$Q*i&SFk|jhP^bUfi{KD?;wkF6egP+6-xzuZ9*}F^)uJTx{IEgRlCnq@@|b?YhySBs%DDcfkuYSh3)pRHyVOIU(!g^gc{ z42J|6!FB-K*_Y^yl7l|{Yov~=wQ#F=dXeIvW*J2rT25#tNg$m?U5SuFm1O`a(Mv!8 zHytpF4fHv!ha|Spp~a&#^C(HyU$N?zXoE!Bof zKQ^bZL(QQK9)K|R3egl@&DzN_41`CULo=!qi>^q)6sG56odCfsG`NsT{saTUfq`wk zc__9zvEWvkP=xnwpRic`mXNFboK`Mbug)?{i0aH6v{NgQTu&Akp(c_m&*hpR@Z8RM zDlxiJtY`_YF{X_HXz;qPf#t6NQ27DXM^o2eJL*r%)<9XDPOq*3b2NuOTZ64Cp040w z{5SO}e*y=`CS~gygd18STKXbotz|2dUW5n5I4vtraz(nt$p98$y<0I675aKDwjjHO zeqYPb1!P#qrsvM{u}r}lE6YWO!nMdKhbn`yD@a!&Lm4DJu}G~~kEENnHmhIK)^)5L zgd+MG)-&O#-(Y4Hx*Pi+9b9dOX{Zc-k0vFX#yx{|GnQ(eVcBu%KDjEf_kp5nL)%7q zzC7EfX43v=SQq1(V0d+tYNRXAU_F0A5znHrUs2ApFlS!!(!ZW%(A^M_l5@ID`Z!x+ zQfmd{Z7Ja05v2xgwZ1qS(-87MJuHgwH{s9ld{*tLiQMyt!J5icKHTXhtARm zwb0Q@1oTEp$WDj>Opd}q9lCT~Q1uQ9F2GmJm|wT`8l?dt)naWmCzQ3Bl&t@lyqZlMP0Q~wp2J$B9!|njaYW>WO(FY zRP=w3%7)kojLL!WTo7h-Prks`QEg0H6EJ}u0tS047e9KekC*8x#X56E^I zmAw;EaZt!ZWxt`gjcgAaMqh12vsY8|MohkY$gl~M?_uh>iH%R#;cp{HC_TM-&dMs5 zE~aq%jehXduWdroZ|RFote+_?2wp3jdGT-RcONb=Q|$Bb&bdSbpJzEmF)fze%#zc< z!Mt;9SK1P>E=FphQbuDNc&X^F>_kUC>}6)%jrA1~%0W*Bz$i9ymXQ#2a`dZV^v?5O z&F`So$dApWs29L|JWXp}z*L$;ue|`jCJ)_s0kqvlX)j`H$fUt9vZDB7EqiynDwk;o zr8=>bAC;>jl*6?7MOFX`dHO~8NX@3A%`khfqPd%4K*^@JHnXH@leDp@aCU>7ai=ZB zoQUB!LIoq&CX6tpkI`gPD7sk8fZx>jTTJO&Q}S%Tsk>U_T5*r}@F3b=@tgWui@BD` zV-PG_qdf?xkZ8r$B4vtLvBInESw14rF8C?$C6*F*&JCsSt+jU~-MICFI+e!1#0DE* z1{0cZYolDDw_ZZ4{-7h`@-?|%g1O&JJ-0A((&oTk@SOl+ukDu}4WNaxfY2dED``}| z1>Mu1mTzI1_szn&1uq>x?oLLKXp{HuR0x~(tD=+n3!smJb)9gBNL8;h-* zZ`!FnX-+G)rbI*2I{9Tb1}yu&moemn$gqu-Mm_6k4Ud&kp^s?dHfE0dm-hjP(o=C> zLO?y?FGde~iMFvW@smJ=Z}+tIW&}=!gET*L|joH^2yVr z`pgNxsha0E^$(AInyFr|+@aa=_M8k9ds&=mThM}qc?d6RofP~5}r27Rr+E(8ytTThs)%n1rK;FK<+eQzWCK2 z$owjMnGK-NUWH=0Z7V%6+^+w{^f1(ZBe5Oe{^ah*Cex@aFukamNg4xZaq~ch3ZGkt;5RS*vdcXQ8O?;D?(o;QlCy^j-eSqdArR^E zFlrlU@>{6>3flA*%Qm*fQwyF>ps(LzePXP>wVoS_JS(r(4kb<-WjMvXjXmWu^?sY> zCLP0?0`>f>w@R;nG&^EzlX^cbd>by3tEusAmKpa`eMWF^FoDzlDCJW!zQeM! zD%^VUx$bsnmtJ2yJ0723^8<|@Yd{1j`oQ>(dk0QCIS8Qt-^43tCnNDrYJ7*i!hWT> zJ6V?~$X?L*71$#4&Z}eTot>aoyXnMEmJ{<7IM}3yP*9r!TNDtRrcr_ud+K{M&^qP!xiwL6Km-{IwQVrPsUx? z6u+Q?U2Jlc1T6Hzt8LjRq+3tBcd_odIGN#p_LtJ@KL&fKz3-pSVpQxDx0{_o z@7~zW%nAR+Nj-3wlR=t2x{Uh~M42f^!C@okU67m}G~`_nrXT#lF8qtDD7}7Zb_etd zScP}l2K^KM)7n@%xPv8!?VKHr=Pe$(YY&?Ncj7npuo3a+y@#}pYr&#{Inyz*9);^~ z)O+A(2@1C!wtkolhhfbKQGTYP_t*e%6E*K)Dh;L0@4=Ay4xM?AWhE{9KUR(PYAn`G z6Sfrd`;aI$(L?XEEo>qA-e+ojIn}q43LNDsj5&xzm^%&j~^3}6G5koYoqaG5~uj&&t@B>zo_89;+ z{yAUvq{pI0C2rxPoUByRs~>=Ld`=K@RhN*v|Gci9(Nuba6v&@Ju-I3`cEHVTl&W-(Su=%DtkRA>RD@1w0?V5UFw|(mI z-RrgfCWPhjjAA1QBUeaz-X-S4Y5 z{PBaZbTH))`ubzGBI8wGwZbIRegTrCw@Fpe@B@w3Map3~2u8AWYT!yJ%{{=(*(bFM z=esE)>Vhld-Igj7>_ZWd?IIdNv3gB%qH8-QX{54=4jy2=jd!@iN?a+)N+AUfu=wz= zwWCc|@Z2>y)Zrj>QJK{DAV&FK+HervrT|3@cz-F8kc2+NgX|VSGq;s++7VD)Q*bSG zxAw>o@Y`HNs@Kcu5@geW%64Ajw1V$CJ8P*x4*YBD& zviMiEgEq9ZqGQ;=_DY)oE%=mm>QK?L)}txXu5b%GIY_D2EvWdYA^A51B|ry0 zW!=o%1NJ$u%sD@&Q^m|6GT^WM+bjR|9{@g+?#6Q!xToktFvtGpw>Z~pcQFATyA;<5 zRQ_iga){;La}%c$MJoHe8a%cytLJ?^fCQrOZQ7;9GnHIvn|76pu|8_XSwjJarW>uI zkLO$x{Twu|qb*;0#?}Xd{h$YJ{fxdk#7fNh{>u6d+6bwQ%UB}YR;0C8a{YP1Cl+u( zdaU4{pRwLN%1_fiWACv9GJnnz2A_bQ4*>ScH7yaTfF12$uzy={&>IB!h$IR(?b(Va zn5TfE2`#>?9`@>s!}8anuT1qq^!L!h&#|H^2}mLXV#dLYCiLE|UvlL>>iY$o!!FWW zU$Bg%YaX#kzrc8%Qx771zwqiH@M#(-ee)NrXWLwSd!ZAgQouIro1m%de$L# zjH^K5Y_Zm0YIXH7U=AF_DHg24dUbYL9RhbEu|%uB1Y7VDZTXVLN4*ey8wP){NSGK8 z;?1IYZUprzVYjm3*ttWI&D>x@eK28T(3`2X{&xiFjXom@fvb_qq+qIWxTD=^<`)<9 zyCrxJ$xe5EOnCY_&($lfRdC+=z7M_?eNeGS_$5W*`#~Pva9iXELDV+D6+T(14NU5^ z)^k&_zcziddC?H-5IUb$Qw$mF1KQdb#<>CsNGUtTe8!wybvN z#l|#tJT@~NF}RV+Dw^{(8#v&1O>aBjBw5ZuKYz2u)g**0rKa#|BGQd2ovc%x|) zx>u+GQ*G%Zh2O>Ng&_^?mG9~D*Fn)L?HkrbU+W2|cTnj!EWTeoj3UBQT6|{OW3t7h z7hWC7RP`-97cs^`->`)ES>W2jK-w6N zJQ9N`hU*JTI?OVUAr--w1Mu=2&(!5}2~^;SWmQF;`#8#XRhVG6F8C|dn3xVnFl6M5&J4sa+3Lm*)Pggf4# zQ)UM+L*aiM0lEZG0(ZVM7P)}x6dRQ8Om<9yNJm{CFo17ua*DaY7 zlZvsww}?H_db2+EbW`h_kMM@)@&mO^?N`5C>zM&wl?Mm@P28u z=?6BK$7E3KkL&~XHXZ(vrRiJqzVai~7CkBY7#OrZ)b|+sjD=I+7#?~k^*Bp2Rtm1h z$(1G=d>q2Z6I68^GVXMWIe`xQh`Qi1ZZwEnO|_VS2P+O%Gbk-~1PNJpjEb0H1;Hs8 zp$vc*jWs>A#F}zey@C{C`bXgON3n!*k#^NTW~8w=Ldm4fCs=aE++YGp%Da_aII@ev z>j-2gGD*Vzc=80;voYj5!AeS=@}8GnkL^hAGw8Ejel^DzD#bMYm-c8)%jkz z)~d*oT-`=CDBlA@0M8}Blp^3F)FoIXN%4G;m>;3+q%}VUb9MfNsWN~Xe`0G`2$h|L z1I1A~d=iShSwO8B*WicIgZ<3v+2geDXQYXzVW-&p*&n$r&L6b3CfB@@%G$!P2HfKW zT4rhAC}zt#5WMa{w(_etsmm`Y;CmYO3-+JhH0u|zLhI=8FA(mtDdRLW;EUxY7x8Jic)+wCTLjuWq3cE|%Oq%{}>HLGtX6B<6=JANp0$tyY2_ zH{AXRVu-N9!WF-tTiP{7LgD!_ZE~^9wCmdBhb#8Ce)NoA#O1esl#2D_Q)kgB7i9Nr zia3MGY@z{YP}e(Y;u&~QxHNk44C~PDm%Tc@(Hhh(Dmt92Wj3Ex|J11A3`^yazf+kT&ptCr#%BK6yvHRGM^v*droR;~xrDJ20!bC+v{m{YQp3~uzTHNQejo8CZeu$%!;2Wz{Y_v}ysAIY4yQFq83G)s7%x&N z`T`_}%YhFnt13mxUufV3mNB3$R+$h=ZfjeW8lj7`I1__I+7Io%j&l?fF+$7SXDS17 zyKEfI(9jugeUMMLTwuvv-V6v_GNF(1ss}vlH5+7#2+NEgMm0%s-rxJus-I>wyBj~bvR9I#;Vv!E1S_zGwH2nL<3((q9+;|`Y)aun^{rJEdN-S znD>e48}kq_4?9ri?`(SCS%@HzG7_0KcQ!tDnmZA$;H|}UM=^d6*)Kwx`<~`s z#Nf_#UqC-3qaTtQb;vx6-nxj{+K(D9vUoW4H6c;b7XdL3?{agCvGGD>EJD*o=X+rk zGXDXhm`MeHur6`eG=uA}DGkBFqdrZG{$N?Xt37{!P_{P~mTCGDjFU&*K_~x!Z@_RM^@KyirT-KA+9vAzC+lr!3n093m>nPc6B^Yq zbns6WmvK^ycAeb?O#^CmP6O~E4BZ%Y-}K6}yY#`j&Lj0tj7DEdx&%LyD*>@Myy|N{ zrAbf_oC1ij&33L3bisFSt5eua!sObD*5%mQ8|9jvVz#xHJ*pgN6a4Z{Z-^@rcOLaz zaACGKP_Uh1;Tx6f0T=RY-_U00-RS)#@X#C8GpQ=kZodYs0{Zw8`mHUUzQhuu{|h~8 zD!OAhEHXyX*2|#Um#E8SmJ`3FMTfQsf(Z0C_zQ}br&9T4mXNXp=L-wANe}UNG^$&p z+1b=e(I~%{>MpZH!)3tQ8R1#^@n!aa(Q@nSPbfoyDf~Zy7*~kv!Y+^c28~uQ)SYRH z0{+5B>%_%H`xG`Xd!$cvL_q$sLZE+nR1H244M936=#VhRMcQ=5f2c1}#ucz=7wNGp zXxBHi;R-gwebjgbHrtJqd=(9PoC>Z&x%UuNU1fWsLR->jzN(#|q%$hghmq-meTHP4j>EVZ!i0hdFCu2;=l!()I_sa*?XT3|?h~nn zxREk40j^HX*Rh80qnH~kH)o2^h;SUEayl5kYY-0O$_a!fNm96V+f_-Hbm7)8IDiiB z%cX-|tbd}a zo9Lx~(UzNRGt4FfR5m&74jlUwIxDo;rTTpV^^1U{7=s&Yg5rk1tCtR{P&CES2^G5W zd+B414bJH6ZtK!r93(KGLrob!HZ#W4F$X-6cZ~eD`oc)bs2rdyH`K{~n(t=WeWyS( zgR>QJn&b7oq9wz@zlkV@H@)H3!mEcEvkN3&L=~S5w~FU*4Q{>CDK`qAPdD7C_H0US z!DS2;v_R+fkb9ff_U<$A{GQ)}Wjm7I5icX?hZa^k-RwT2Uesnn=&}d$+CO#?uAkqZ zQIF%aWhm*DjlMJL&zfDY3kGI~pqoAWz$PshT`jnlHa2L0p_bnVo6|WJaAMN$A4iT#`1n=QgqJVmk&iJruo+Q-= zmZ6;D{cKFa^MM1JsqR2CzxP11eq+8p)E?^!sB5Uk593!y+UJM0VgO|Z&>N97EC9AY zjMfBTM7T=(0<33fwLhRrKDr)Yo!RUSX*{#b7$9dXa;F1)PF*1shd1ApfST!N>AE-Y#ZG+D;~topV8I7eh4{j} z;ULdsx(!V{o4b7!%ee4FDPSB^kNR>hG;Py47c$2N&a<*#@CdcGq%>(RHP!cH(_T!M zoaO*jkdf$+RRCUu%c>j)R`tC2Y8^#~@MK_YbP2()QW_J&2j2CT*HEl;K(!3!!|vDt zsH2V!sjIuurM`}ZSg~K^Y1$J|;~+MSGDj4jR<8w0uYX=9+fJ*O0`z?d?=Lde@l8PV zcumL4@7s<@dT)*RPLLz1qYLf}hGK>?YNr7QqLFpvE~7)rR#Aq_^LH68^*b!hXw6g~ zS$uGMlGCL&f+aHT*Exn`ZWd9wo+ki;W|^Mn8cVMSX2)zj3m2gMdM@HxZ|Kn^2c?Db zB-EpCD9?%#r&r&u{URz4@zEInRpz1h; z%Z{3bJ8BPHGnf*UA8BA1TK-?UFN|lKQ@!$}JZI>}nq;AW?x+>p4mOo4MaC9XGwhlq zZ>FtKio-VbSs2fSx8ehDJLprlpVoSlkWbX7ZykLt=8FSd;|*lmTDq+&*UX7u7~CR0({GQb6t8mhUN`O zK&vFHQ>O1CcyDmP`bgf-_|6KDb^L9nl1N^VFzSwqNv>e2dFZ&hTUozCTO-kNo2WjL zXU+W6oj0i%9d{tPAUWn@I1|7`R}g1&NOWIVOH;7(kfoTk@x^;?NHcW~LxUubO^@4p zMhyh&944pG*xhUr-iCg70oK_!I=6z2sDaS4)e%)3Rwn)}E~|5V_HZPPj^c43js3gP z!%@5knDb3hd>ll;Yf(Hi$yYByMG0TE35hVNJPY_BsrajW8bUTvufpV=ZKZB z6owwT2!^%D90J9_i8eenzMZE(*1A~l5&+a#FutUbBBFVpMLUBogF4%!VpuTJ^^O=@ z>Gk3n>>@Me4>D=SfgxQozelue-cF6#cNhNqIAUh)J2gYzONH}~hjyzvGI8)+Jd3bD zJb2FW@NTn??1Z1y&KoU@W_)i=8C$gT;*-%+e!d$>lwa*akZ$((M}FTe0amhHV)(aK z>c1$xuT6iYyL4LpBpA-R87HESY7Ah#h-eoaWviuw^U}kpfy0~K7aSLMJ75WVZEBc( zhhu}*T|QVl;o1tEIPkmUpkueL$h2Cb*OR=dMA;hMy%aYa1F#OyUSPf9Mc zYlGIq)Y+B|b=7?^)actco>u432oui?H8w~ty^AVMyc2XgTTHx2*Z%_y=5Ho$&;A_; zV@KPj5y0g4>QAWZEtr^JL3vXVq$nXuk!C`~X9(0E0d*!d#_+U` zXJ$wjtrEwdao){5-Ib0!M49UkmF$gYrZ2V~)TBDs3~C$8JMl9!sDCU^=lE@p zL#jHhu7|EpEV9z;B@<>~cK7wk(_x7YAk~3b=th>i^@ChbIh>dSH=cVe#+Hb64D)6z zPYQ)mdk~VP#PLC9*9`crW$@a2iry&XN36Ar3)zX-PLH_iRx-;y(C_r7nmC@s&&{A0 z`%Ab&Xta| zvMtZ)!rT!y{<>twb{g9}joXZ=GSt(byTwX@J9q{{+TFUj$p}cz7N0;Jxdl0mq@!XttV8(%}O6Sh$(`*e;t{jF0dElwHG=n6W`$Ogb0L_W# zxx-dz5w`HxS+LM6e-%2~owqM6C-i$!s0D=z$h3EYpgH28s1KmZ{iaEoVO{Xg(mnKN zJWn=^@QcJdD7qbprp~d>_LOahP3n3_gMC__)35$PecSQwcg1*W>jyd>Pr12kz_l%|E8&o4P@aTx$YKXgL&F96`#ZDJ>)U3>BC`fs zoy5)Qa=DZVO0L-5nUn41;_dYu1}#8HdCsEB_;NKGaPN-XB;X?L69QaaBtPy2FG zWXV$%Usr@z8_hMd!mw+Mhs`~qr8V8xZjmA=I4A|+duHTNw-lb9{Rr}@Lq1jB!DxeI ziE5}b|Dta7h!!2Hkzx51MqmS?=BrXLwo~ZU6#gn?o>Cn7n%v(jU3t#nnh&Q}w!kj3OgsoIO zr>m)axVbZc1;e2t%aj6YJ8i5}xSl-h4?*l0-I*x_|Z&K3I=1p2Po*#Qi5JX95-%C`Y#iEIdgms?~;=SbA16F%&NVxlQJjd$;7 zlw80nG)Z;%w~Zu&Qp8Fw{F^A%;oo*rFO5aM1?Pu%v7+7r+>9MhVS`7|PJ5c4#=GP^ z9(1BZm=sO{kIW2nF;IMg1M-b;Qp&Hpj9vdYB5Za8SRP`sLg`2v&&?`Eog(mo0lGr5 zJzRwmyS3dM-F_!3DOkZI%9eT7BJ=;1_@n=q#IDJ(iNl$Zy8`uw#>B%tW>R8*-YNW__q{nWuN& z4T!Z{BhWD&T_IppuBs!0qb2mF42Ql8-%lt;{%z*H-q&@81j;PaV@}AlIs@BbT}QHrcCG4K?QRuDuWln z4{dY?2yZ^k&EPLb9P%2Z35}mO%TfhpcI15$(tJWo9h;T!ip;tLh(jULSP-|*X--F; zRgzaOSvF~0;@Cwu_?Zh<3b7L!Vj4M+(nFOe0tQ#0Nu=$GYRf z8M7}Ni*8#?=Q?7`9Z7~vRONlj$>eFq)D{lQZ$Pc0F`4|KMRGa9JtGDmO$2)zXfkwq z5d)WmG4*<7kVTxxpp5ez(uP+jK?5q6pHdI`&E;VWtsTN16D)p7hZ#~-<|kcV9Q|*nMML5P{^AiJn`3Et; z3sa$Y~qd&=0VL`_*kZ07kUd%1AOGN3QMYOzl~u)8my zmg;M3s_Uz2W}Q-Nyf}YD8%M)B^Q>Ou`s=QgNgQa;OSQ=r`Qb~oho$_;rP>rJICDWc zUTXm$hgN1X4AotkCN*OVqV1h|r=%vJe1s20B&>Wl9FqNzHAXqb5gsa?@65|#XBewx zNlT~qsGOA|cH~nClAhd!4@29XU9e?cZaK6o$|a88@~dY6^6gi-2Xj~#f;ntKU!0*E zT_9K9MQL66MD{B!>B_rDUDIS|At+imG%cDAcID$z9ooIvC#t9G9L4ymUK_Og?-JWn zpB&yr$V-!Q_+4xPy_~}bvvJg%!)L;|d0aO>0&xPbcH_%?8v;imWBAm^G1F=*VqIdZ zuEdIa#IvfG-7)Dxh9S&#ueK`Mr%v|VY!YvMfVP{M%Lg0(>u>$EFFA9u%n#C6xjfbQ z#;vFA>2fX~Vq9|TClE99c>JQKmQ}sR+3b!(&61(cv8umM{n3-}Omh7T1+SHA3-4@% z*G)yATSYdsv{r$4>)m({Kp})i2^NJ-el-M+?^60WTL}E+AMka$m45GE=~MrY^a(8% z=Q!KZSZzJ(zZpIztxSmzcqHfZKm%4$M0d#BVU*Jyv$c*M=*}}Ub&ZI}1#=}SSHVWL zN|0i65a;#ig@~wQh-`kXJAW3^^nf1tzLv)K;Js6a1zZ#Ii&-ZDF!4E{eWdCD%vm_Z zSMsRk?N6_xFj4~cs5(J;q0_u>O${sr&QTFK!o{XI<9nf36p>(iU} zO+2-d3#D_Bh}|rgw&U<-$#h4mK8c>{%{vXaGa7b%ONYh=*LrP*lnB#QE%>U14N9e~ zERYiOl!`VoQ&Rm^Rd6|oshZXL{t~#KrCKdr?#&CP^wvVs@>Z2y8!6>2wbWKDtH7tg zUa4>)x;(>gpXyON`@7Xbw32N_J65#Z@n;A4HQKmEIv!>dfkMSaHM{m8unb}yo|(k6 z^if4Ty?Ph#A{~!|kC5TO9!*c{?%)Z%WfqF)BcIyUr|d3I$zJiA7HOKgLUI+mUV~-X ztG?)-lwO^fTRW{*#3xaq>BP}ynNHrpGZt0z!_6TXNkdyQS6}EQB@XKWOUAEW`-HLZ zv=fbvZ&;5GvZfr^6@ufLpmTR6xzJfL=0SiCGlgV}XF9Dsn#r!mCAl?p72AGO9@-lz zh2_b>%B)T)YBI=56Alob#ibeuehQpXMij5yIf@qcfx>47?d}7bvW)_LKx7q4%g5|1 zrGk9S-UgbP&wIuRK;#I(ds$OlOP&w%fhTBBKF^4@Viz^pSc6YJy5FZhMosyAbb{El zLeLvna^S%}_)#MqHqX8@XgeKXQ zDlsWV2|I)8s(85VJ=71XxL0X)Kc1ZN&o^Cs+!ni|&1;97!%RiRy4MWPg>Tq;u#CR$ z$NR=@XgSo}ft_lO%?K+x)GTMnjdn`t&-*PJ)Y4|H6>>=QMz0#`d9c?ZEpKO=jrNJf zFp%~_DDBZ^0~4`oQpV5f)fPu}M~z21FzwD36c-&#IE1&cn-Vt~+ZSVt*r;uvn6`5i z%s9%Ld$rnVVekJLvd36ViQ_F$poM4JF9jPPY&6tpz3)N~DA1+l=dIisNDna^V3>Qg zWhVel@}x{G<52uAX{m5d1ve)tKYM_p4roY^dJwR99(4gl58!=MEa;!?dTXT>2jz?f z6U`-|A#s3t0m{kt0^XyK*uTZwlHl9mFC5di87YM;sQAKCesG?vs_fcg$u;Zt*XQW) z0N$s|7oc`an(|ZVo_6V{TqThvroKi{O>yPy)4sr)WX!zHx(E}q+6 zFo&Y-;$YcwP>e1##Q#s}a``9ozJwNdvGnCEnf|MCA=1^eYDVGCP@{$b|) zJdZlxeIZz4D*^35!v^xcPJPep#g^7XgMvj$rmd}fIH0gn9u z*7>^^{#g$xUG(5dIyI0d#dJVi#exRWPBAhb^#B>HyukR1*3l7*Q=G@rXe;kBey-aA zi6;}C2_^)U$-Z3~ljzz{(Y37u@xPV%|2iBG(n%}NiFcG+t3-cVgPFJ1vLB@u@TBM` zwESStwARr~g9|Vk7FtpOYM|091-$3~ubJRiKcVPC-Y2`Y_WXx}zl!#&FJcGTAcUkL zt4gYEqcw~5XLSb6EQG#eEUhkt7XKSxh%L?~)1E?}mTdM)&X9^6hm@l>{@W$s9NvWm zMqC@|av>ibErN^}HehZ+q7ku|rA0hdcM?t+R8hq9Ft@fA@tzsx@~0LQ1QnSD)dwrh z$^vHXez3w^9=?!OPPoPxt1y#V#B=+db7QRM{jC1vyG={jEm|VE(p&)G)TA5F&04W* zYmIcVKsq}u+$`PT6^+Z}31%uA1S$tp*C0MH9_wSFeL)$>q5aXi1+p?ws(Un>&JE(3 zFX)(q7`fsvk`m&eR4>JDKOmpE3CS3Me3ZGayfYUBBWFI;Nl zoqK#WqjxS^I529AH@~W66 zqe0|cQH$Tz@4@+A{Q7D}m}sM^q6&9_K?%JQB}vL99Pkr-Iv-DG1$6++TT|C)`nuyy z;vPl?JL+dC=8phsnu<9f3#q9XTU9z`mGJB+0ZAtM8e~q%p@&NNL+0sPU&qj@bfuaP zoz+w|_1cq$rdgfKX<>TRlxr|o&&s8f_%eEBi(uL=OatgnYKz)JaYK1FJX;5dO9M?2 zmwmKuDDR1wwaP@JxGP z6d%|-)+cmS9i;|r@*Z`6i_BXO31x5;x_7@&N_K@pOc>0C(htf>+ex)QeK(4a;|p@A z^Js33ZpP_!La`wn?P8>2MS{?R-kNqF(j zxCBEc6et`Zd)!`vsOpL#-_W0w%zQX7&QR37yhF zQ}5-;IS&HAqZ))@iq@*6jBcnl|D>)7U^YvGs&yjb4_dxpvrTtY@FCD%9v*`!_%f+ucuveJPaRt74ZQj=cZoLR*olAfG3b(&|KeLk)cAco zDWVFfMzD2*S-li~+r8;~9OcDtj}4p=C#^&yB# zTs;o^h>PA3m$~%SIQ|1mq%HUJMO}0rdzl0^k6R72$dg(Hszk}HT0HitwY%%4R_->> zkTT15yVb2!@&I2Bma*{xo)wlI^m5Lg``m-PSNt50!)}os%gi(EQ;n%osw4d;bsd#F z$h-5KEwtc47(jj^dXOImZ$5g_J{a!vF@#~o#$l4*eF%<7PaNYcAj3IFM= zt=>t7;*)BFTVE`2t|IeKs{cjUH^#Qug!@DF8*he4!n;KPz=t}X}G(`gK%Pj8h5_bjSt}pbBAvS64P}I_DJFDK&0`(Yx z*toJOc(ABW^uKl*G)K^9#d&ntS)!-np?)rv19g{_A5X-x{XF?R_XOJ7NkOBMLg^;v?XrRZ`3P4QMq_Njh>wVV*3UioWSGQ&SzKD^dr+m z-Z>&nd=E@2nBPzfdI}K=~rinZw@+se2Xtcn;>ljAuCh?IF%qLIcJqPv#R*f*d zcTG2M{aNkjO#ud=ze$+hQ-BTdk-PP6Zh8{lcKyfOskX_oqHd#OlXzC#4u609mzrc1 zXBk6*UH20ly<;Y$Rc}(}WM0%K)f`9r7D5YrMm-Ic zCA98H_n_b36p!mz+A^6hj9(d4lStBo8FD&Ky(vDgY9Ab+?hixrr>8Lw^Df<+_Jb33UvB(|PgtO=5F+bPKctNu{{hJsuA9BJh`qh`Ldd!8B2^f z-Qt;`>kJl37V^X2;dzpj{WxGOj)q7ZJ4&)Sf=RW##9owwC3HsJs)dw<<}eyRg(r`X z_O}}uFXvU9hm!+>1yY57SLyZkbMM6I!#}H^wEW*N!*|*u@McfT-!Q`kfEhlae(LL( z`l!7(P7YHFIszZyC-uSyFVcxA{2s3OsGEa#=DIMt-@%`Py8OI@5A6OS6yb*e$!XeS zEM_Z==<-$G$l~hSx*LlM0)1ISGkna9CE>;BRj}u#{V&p(sXWVUfHK#B#FM=)bp`lr zLxVj<-_YuxXh45d(&ni=d7^bE!i{#yIAQ#R`nxxJMD%c}Q|qsD-nPJ4vN+aL#Ddm6~(>t2`RZm8g7+b`1;UjW zces+^E_6X@qMr74EDo*sRsGoW3&5_Az^CM2E=L4?;k6U^*w6^VAH~snuzsvkN^o*i$P|7|Zy77!U1A9YcNfJu<&LJlK5y(b&0XA_K$WRY@ zb{5a3&BQ|4QgLMP8=XojWr7|fcUFtC?k zks$zv<}U;_`&e{iANpn?PlqS!<%P&@1f@NJ>;js|t~;_zq|zsN�#ZGDHhjoo_n_ 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 Vk(hC1gF8nqR&_ME^x3ph{{Rx|1%m(p diff --git a/bundles/mesh/symdefs.g b/bundles/mesh/symdefs.g index 436c64ee3..d34122cbc 100644 --- a/bundles/mesh/symdefs.g +++ b/bundles/mesh/symdefs.g @@ -23,307 +23,304 @@ big_endian_read_16 = 0x00008331; big_endian_read_32 = 0x00008339; big_endian_store_16 = 0x0000834d; big_endian_store_32 = 0x00008359; -ble_gatts_find_chr = 0x00008a85; -ble_gatts_find_svc = 0x00008b1d; -bt_dh_key_gen = 0x00008e6d; -bt_encrypt_be = 0x00008e95; -bt_hex = 0x00008ebd; -bt_le_adv_start = 0x00008f1d; -bt_le_adv_stop = 0x00009045; -bt_mesh_init = 0x0000b7a9; -bt_mesh_input_number = 0x0000b809; -bt_mesh_input_string = 0x0000b87d; -bt_mesh_is_provisioned = 0x0000b8f9; -bt_mesh_model_elem = 0x0000bdb9; -bt_mesh_model_msg_init = 0x0000bf8d; -bt_mesh_model_publish = 0x0000c025; -bt_mesh_model_send = 0x0000c469; -bt_mesh_prov_disable = 0x0000e611; -bt_mesh_prov_enable = 0x0000e649; -bt_mesh_provision = 0x0000e805; -bt_mesh_reset = 0x0000efc9; -bt_pub_key_gen = 0x0000fa5d; -bt_pub_key_get = 0x0000fa8d; -bt_rand = 0x0000faa1; -btstack_push_user_msg = 0x0000fd1d; -char_for_nibble = 0x000102c7; -eTaskConfirmSleepModeStatus = 0x00011765; -gap_add_dev_to_periodic_list = 0x00013ac1; -gap_add_whitelist = 0x00013ad9; -gap_aes_encrypt = 0x00013aed; -gap_clr_adv_set = 0x00013b15; -gap_clr_periodic_adv_list = 0x00013b25; -gap_create_connection_cancel = 0x00013b51; -gap_disconnect = 0x00013b61; -gap_ext_create_connection = 0x00013bf5; -gap_get_connection_parameter_range = 0x00013cb9; -gap_periodic_adv_create_sync = 0x00013d51; -gap_periodic_adv_create_sync_cancel = 0x00013d75; -gap_periodic_adv_term_sync = 0x00013d85; -gap_read_periodic_adv_list_size = 0x00013e91; -gap_read_phy = 0x00013ea1; -gap_remove_whitelist = 0x00013eb5; -gap_rmv_adv_set = 0x00013f41; -gap_rmv_dev_from_periodic_list = 0x00013f55; -gap_set_adv_set_random_addr = 0x00013f95; -gap_set_connection_parameter_range = 0x00013fe1; -gap_set_def_phy = 0x00013ff9; -gap_set_ext_adv_data = 0x00014011; -gap_set_ext_adv_enable = 0x00014029; -gap_set_ext_adv_para = 0x000140a5; -gap_set_ext_scan_enable = 0x00014171; -gap_set_ext_scan_para = 0x00014189; -gap_set_ext_scan_response_data = 0x00014231; -gap_set_host_channel_classification = 0x00014249; -gap_set_periodic_adv_data = 0x0001425d; -gap_set_periodic_adv_enable = 0x000142d1; -gap_set_periodic_adv_para = 0x000142e5; -gap_set_phy = 0x000142fd; -gap_set_random_device_address = 0x00014319; -gap_start_ccm = 0x0001437d; -gap_update_connection_parameters = 0x000143b1; -gatt_client_cancel_write = 0x00014869; -gatt_client_deserialize_characteristic = 0x0001488f; -gatt_client_deserialize_characteristic_descriptor = 0x000148c7; -gatt_client_deserialize_service = 0x000148d5; -gatt_client_discover_characteristic_descriptors = 0x00014901; -gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x00014943; -gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x00014993; -gatt_client_discover_characteristics_for_service = 0x000149e3; -gatt_client_discover_characteristics_for_service_by_uuid128 = 0x00014a1b; -gatt_client_discover_characteristics_for_service_by_uuid16 = 0x00014a29; -gatt_client_discover_primary_services = 0x00014a37; -gatt_client_discover_primary_services_by_uuid128 = 0x00014a69; -gatt_client_discover_primary_services_by_uuid16 = 0x00014aad; -gatt_client_execute_write = 0x00014ae9; -gatt_client_find_included_services_for_service = 0x00014b0f; -gatt_client_get_mtu = 0x00014b3f; -gatt_client_is_ready = 0x00014be9; -gatt_client_listen_for_characteristic_value_updates = 0x00014bff; -gatt_client_prepare_write = 0x00014c25; -gatt_client_pts_suppress_mtu_exchange = 0x00014c61; -gatt_client_read_characteristic_descriptor = 0x00014c6d; -gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x00014c73; -gatt_client_read_long_characteristic_descriptor = 0x00014c9d; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x00014ca5; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00014cab; -gatt_client_read_long_value_of_characteristic = 0x00014cd9; -gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00014ce1; -gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00014ce7; -gatt_client_read_multiple_characteristic_values = 0x00014d15; -gatt_client_read_value_of_characteristic = 0x00014d45; -gatt_client_read_value_of_characteristic_using_value_handle = 0x00014d4b; -gatt_client_read_value_of_characteristics_by_uuid128 = 0x00014d79; -gatt_client_read_value_of_characteristics_by_uuid16 = 0x00014dc5; -gatt_client_register_handler = 0x00014e11; -gatt_client_reliable_write_long_value_of_characteristic = 0x00014e1d; -gatt_client_signed_write_without_response = 0x00015249; -gatt_client_write_characteristic_descriptor = 0x0001530d; -gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x0001531b; -gatt_client_write_client_characteristic_configuration = 0x00015355; -gatt_client_write_long_characteristic_descriptor = 0x000153a7; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x000153b9; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x000153c9; -gatt_client_write_long_value_of_characteristic = 0x00015405; -gatt_client_write_long_value_of_characteristic_with_offset = 0x00015415; -gatt_client_write_value_of_characteristic = 0x00015451; -gatt_client_write_value_of_characteristic_without_response = 0x00015487; -hci_add_event_handler = 0x00018f89; -hci_power_control = 0x000197c5; -hci_register_acl_packet_handler = 0x000199c5; -k_delayed_work_add_arg = 0x0001ae91; -k_delayed_work_cancel = 0x0001ae95; -k_delayed_work_init = 0x0001aeab; -k_delayed_work_remaining_get = 0x0001aec5; -k_delayed_work_submit = 0x0001aeeb; -k_fifo_is_empty = 0x0001af07; -k_sleep = 0x0001af2f; -k_uptime_get = 0x0001af3d; -k_uptime_get_32 = 0x0001af51; -k_work_add_arg = 0x0001af63; -k_work_init = 0x0001af67; -k_work_submit = 0x0001af81; -kv_commit = 0x0001b221; -kv_get = 0x0001b27d; -kv_init = 0x0001b295; -kv_put = 0x0001b2e5; -kv_remove = 0x0001b35d; -kv_remove_all = 0x0001b399; -kv_value_append = 0x0001b45d; -kv_value_modified = 0x0001b4c1; -kv_value_trunc = 0x0001b4c5; -kv_visit = 0x0001b515; -l2cap_can_send_fixed_channel_packet_now = 0x0001b589; -l2cap_init = 0x0001b8e1; -l2cap_max_le_mtu = 0x0001b925; -l2cap_register_fixed_channel = 0x0001b9a9; -l2cap_request_can_send_fix_channel_now_event = 0x0001b9c5; -l2cap_send_connectionless = 0x0001bb6d; -l2cap_send_connectionless3 = 0x0001bbfd; -l2cap_send_signaling_le = 0x0001bce9; -le_adv_status_reset = 0x0001bd25; -mesh_platform_config = 0x0002a695; -mesh_set_dev_name = 0x0002a925; -mesh_setup = 0x0002a931; -net_buf_add_zeros = 0x0002d99d; -net_buf_get = 0x0002d9cb; -net_buf_put = 0x0002d9db; -net_buf_ref = 0x0002d9f9; -net_buf_reserve = 0x0002da09; -net_buf_simple_add = 0x0002da1b; -net_buf_simple_add_be16 = 0x0002da1f; -net_buf_simple_add_be32 = 0x0002da35; -net_buf_simple_add_le16 = 0x0002da47; -net_buf_simple_add_le32 = 0x0002da53; -net_buf_simple_add_u8 = 0x0002da5f; -net_buf_simple_pull = 0x0002dabb; -net_buf_simple_pull_be16 = 0x0002dac7; -net_buf_simple_pull_be32 = 0x0002daef; -net_buf_simple_pull_le16 = 0x0002db17; -net_buf_simple_pull_le32 = 0x0002db3f; -net_buf_simple_pull_u8 = 0x0002db67; -net_buf_simple_push = 0x0002db87; -net_buf_simple_push_be16 = 0x0002dbab; -net_buf_simple_push_le16 = 0x0002dbdf; -net_buf_simple_push_u8 = 0x0002dc13; -net_buf_slist_get = 0x0002dc7d; -net_buf_slist_init = 0x0002dca5; -net_buf_slist_is_empty = 0x0002dcad; -net_buf_slist_merge_slist = 0x0002dcb9; -net_buf_slist_peek_head = 0x0002dcd5; -net_buf_slist_peek_next = 0x0002dcdf; -net_buf_slist_put = 0x0002dce9; -net_buf_slist_remove = 0x0002dcf9; -net_buf_unref = 0x0002dd33; -nibble_for_char = 0x0002edcd; -npl_freertos_callout_init = 0x0002f45d; -npl_freertos_callout_remaining_ticks = 0x0002f499; -npl_freertos_callout_reset = 0x0002f4b1; -npl_freertos_eventq_get = 0x0002f54d; -npl_freertos_eventq_put = 0x0002f5a1; -npl_freertos_sem_init = 0x0002f5f9; -npl_freertos_sem_pend = 0x0002f615; -npl_freertos_sem_release = 0x0002f669; -npl_freertos_time_ms_to_ticks = 0x0002f6b9; -os_mbuf_adj = 0x0002f7e7; -os_mbuf_append = 0x0002f87f; -os_mbuf_appendfrom = 0x0002f917; -os_mbuf_cmpf = 0x0002f96d; -os_mbuf_cmpm = 0x0002f9cd; -os_mbuf_concat = 0x0002fa8b; -os_mbuf_copydata = 0x0002fac7; -os_mbuf_copyinto = 0x0002fb1f; -os_mbuf_dup = 0x0002fb9d; -os_mbuf_extend = 0x0002fc0d; -os_mbuf_free = 0x0002fc5d; -os_mbuf_free_chain = 0x0002fc75; -os_mbuf_get = 0x0002fc8b; -os_mbuf_get_pkthdr = 0x0002fcb7; -os_mbuf_off = 0x0002fce7; -os_mbuf_pool_init = 0x0002fd05; -os_mbuf_prepend = 0x0002fd0f; -os_mbuf_prepend_pullup = 0x0002fd91; -os_mbuf_pullup = 0x0002fda9; -os_mbuf_trim_front = 0x0002fe75; -os_mqueue_get = 0x0002ff95; -os_mqueue_init = 0x0002ffbb; -os_mqueue_put = 0x0002ffcd; -os_msys_count = 0x00030005; -os_msys_get = 0x00030021; -os_msys_get_pkthdr = 0x00030039; -os_msys_num_free = 0x00030099; -os_msys_register = 0x000300b5; -os_msys_reset = 0x000300f1; -platform_config = 0x000303e5; -platform_get_heap_status = 0x00030411; -platform_get_version = 0x00030429; -platform_printf = 0x00030431; -platform_raise_assertion = 0x00030445; -platform_reset = 0x00030459; -platform_set_evt_callback = 0x0003048d; -platform_set_irq_callback = 0x000304a1; -platform_set_rf_clk_source = 0x000304d9; -platform_set_rf_init_data = 0x000304e5; -platform_set_rf_power_mapping = 0x000304f1; -platform_shutdown = 0x000304fd; -platform_switch_app = 0x00030501; -printf_hexdump = 0x000314c9; -pvPortMalloc = 0x00034699; -pvTaskIncrementMutexHeldCount = 0x0003477d; -pvTimerGetTimerID = 0x00034795; -pxPortInitialiseStack = 0x000347c1; -reverse_128 = 0x00034f35; -reverse_24 = 0x00034f3b; -reverse_48 = 0x00034f41; -reverse_56 = 0x00034f47; -reverse_64 = 0x00034f4d; -reverse_bd_addr = 0x00034f53; -reverse_bytes = 0x00034f59; -settings_bytes_from_str = 0x00037545; -settings_str_from_bytes = 0x00037557; -sm_add_event_handler = 0x000376ed; -sm_address_resolution_lookup = 0x00037839; -sm_authenticated = 0x00037913; -sm_authorization_decline = 0x00037929; -sm_authorization_grant = 0x00037949; -sm_authorization_state = 0x00037969; -sm_bonding_decline = 0x00037985; -sm_config = 0x00037e7d; -sm_encryption_key_size = 0x00037f7d; -sm_just_works_confirm = 0x000388e9; -sm_le_device_key = 0x00038c19; -sm_passkey_input = 0x00038d09; -sm_private_random_address_generation_get = 0x000390d9; -sm_private_random_address_generation_get_mode = 0x000390e1; -sm_private_random_address_generation_set_mode = 0x000390ed; -sm_private_random_address_generation_set_update_period = 0x00039115; -sm_register_oob_data_callback = 0x0003914d; -sm_request_pairing = 0x00039159; -sm_send_security_request = 0x00039ce5; -sm_set_accepted_stk_generation_methods = 0x00039d0d; -sm_set_authentication_requirements = 0x00039d19; -sm_set_encryption_key_size_range = 0x00039d25; -sscanf_bd_addr = 0x0003a0d5; -sysSetPublicDeviceAddr = 0x0003b4b1; -uuid128_to_str = 0x0003d691; -uuid_add_bluetooth_prefix = 0x0003d6e9; -uuid_has_bluetooth_prefix = 0x0003d709; -vPortFree = 0x0003d851; -vQueueWaitForMessageRestricted = 0x0003da21; -vTaskDelay = 0x0003da69; -vTaskInternalSetTimeOutState = 0x0003dab5; -vTaskMissedYield = 0x0003dac5; -vTaskPlaceOnEventList = 0x0003dad1; -vTaskPlaceOnEventListRestricted = 0x0003db09; -vTaskPriorityDisinheritAfterTimeout = 0x0003db49; -vTaskStartScheduler = 0x0003dbf5; -vTaskStepTick = 0x0003dc81; -vTaskSuspendAll = 0x0003dcb1; -vTaskSwitchContext = 0x0003dcc1; -xPortStartScheduler = 0x0003e145; -xQueueCreateCountingSemaphore = 0x0003e201; -xQueueGenericCreate = 0x0003e23d; -xQueueGenericCreateStatic = 0x0003e289; -xQueueGenericReset = 0x0003e2f1; -xQueueGenericSend = 0x0003e37d; -xQueueGenericSendFromISR = 0x0003e4e5; -xQueueGiveFromISR = 0x0003e5a5; -xQueueIsQueueEmptyFromISR = 0x0003e649; -xQueueReceive = 0x0003e66d; -xQueueReceiveFromISR = 0x0003e799; -xQueueSemaphoreTake = 0x0003e82d; -xTaskCheckForTimeOut = 0x0003e995; -xTaskCreate = 0x0003ea05; -xTaskCreateStatic = 0x0003ea61; -xTaskGetSchedulerState = 0x0003ead1; -xTaskGetTickCount = 0x0003eaed; -xTaskGetTickCountFromISR = 0x0003eaf9; -xTaskIncrementTick = 0x0003eb09; -xTaskPriorityDisinherit = 0x0003ebd5; -xTaskPriorityInherit = 0x0003ec69; -xTaskRemoveFromEventList = 0x0003ecfd; -xTaskResumeAll = 0x0003ed7d; -xTimerCreate = 0x0003ee45; -xTimerCreateTimerTask = 0x0003ee79; -xTimerGenericCommand = 0x0003eee5; -xTimerGetExpiryTime = 0x0003ef55; +ble_gatts_find_chr = 0x00008a99; +ble_gatts_find_svc = 0x00008b31; +bt_dh_key_gen = 0x00008e81; +bt_encrypt_be = 0x00008ea9; +bt_hex = 0x00008ed1; +bt_le_adv_start = 0x00008f31; +bt_le_adv_stop = 0x00009059; +bt_mesh_init = 0x0000b7bd; +bt_mesh_input_number = 0x0000b81d; +bt_mesh_input_string = 0x0000b891; +bt_mesh_is_provisioned = 0x0000b90d; +bt_mesh_model_elem = 0x0000bdcd; +bt_mesh_model_msg_init = 0x0000bfa1; +bt_mesh_model_publish = 0x0000c039; +bt_mesh_model_send = 0x0000c47d; +bt_mesh_prov_disable = 0x0000e625; +bt_mesh_prov_enable = 0x0000e65d; +bt_mesh_provision = 0x0000e819; +bt_mesh_reset = 0x0000efdd; +bt_pub_key_gen = 0x0000fa71; +bt_pub_key_get = 0x0000faa1; +bt_rand = 0x0000fab5; +btstack_push_user_msg = 0x0000fd31; +char_for_nibble = 0x000102db; +eTaskConfirmSleepModeStatus = 0x00011779; +gap_add_dev_to_periodic_list = 0x00013ad5; +gap_add_whitelist = 0x00013aed; +gap_aes_encrypt = 0x00013b01; +gap_clr_adv_set = 0x00013b29; +gap_clr_periodic_adv_list = 0x00013b39; +gap_create_connection_cancel = 0x00013b65; +gap_disconnect = 0x00013b75; +gap_ext_create_connection = 0x00013c09; +gap_get_connection_parameter_range = 0x00013ccd; +gap_periodic_adv_create_sync = 0x00013d65; +gap_periodic_adv_create_sync_cancel = 0x00013d89; +gap_periodic_adv_term_sync = 0x00013d99; +gap_read_periodic_adv_list_size = 0x00013ea5; +gap_read_phy = 0x00013eb5; +gap_remove_whitelist = 0x00013ec9; +gap_rmv_adv_set = 0x00013f55; +gap_rmv_dev_from_periodic_list = 0x00013f69; +gap_set_adv_set_random_addr = 0x00013fa9; +gap_set_connection_parameter_range = 0x00013ff5; +gap_set_def_phy = 0x0001400d; +gap_set_ext_adv_data = 0x00014025; +gap_set_ext_adv_enable = 0x0001403d; +gap_set_ext_adv_para = 0x000140b9; +gap_set_ext_scan_enable = 0x00014185; +gap_set_ext_scan_para = 0x0001419d; +gap_set_ext_scan_response_data = 0x00014245; +gap_set_host_channel_classification = 0x0001425d; +gap_set_periodic_adv_data = 0x00014271; +gap_set_periodic_adv_enable = 0x000142e5; +gap_set_periodic_adv_para = 0x000142f9; +gap_set_phy = 0x00014311; +gap_set_random_device_address = 0x0001432d; +gap_start_ccm = 0x00014391; +gap_update_connection_parameters = 0x000143c5; +gatt_client_cancel_write = 0x0001487d; +gatt_client_deserialize_characteristic = 0x000148a3; +gatt_client_deserialize_characteristic_descriptor = 0x000148db; +gatt_client_deserialize_service = 0x000148e9; +gatt_client_discover_characteristic_descriptors = 0x00014915; +gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x00014957; +gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x000149a7; +gatt_client_discover_characteristics_for_service = 0x000149f7; +gatt_client_discover_characteristics_for_service_by_uuid128 = 0x00014a2f; +gatt_client_discover_characteristics_for_service_by_uuid16 = 0x00014a3d; +gatt_client_discover_primary_services = 0x00014a4b; +gatt_client_discover_primary_services_by_uuid128 = 0x00014a7d; +gatt_client_discover_primary_services_by_uuid16 = 0x00014ac1; +gatt_client_execute_write = 0x00014afd; +gatt_client_find_included_services_for_service = 0x00014b23; +gatt_client_get_mtu = 0x00014b53; +gatt_client_is_ready = 0x00014bfd; +gatt_client_listen_for_characteristic_value_updates = 0x00014c13; +gatt_client_prepare_write = 0x00014c39; +gatt_client_pts_suppress_mtu_exchange = 0x00014c75; +gatt_client_read_characteristic_descriptor = 0x00014c81; +gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x00014c87; +gatt_client_read_long_characteristic_descriptor = 0x00014cb1; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x00014cb9; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00014cbf; +gatt_client_read_long_value_of_characteristic = 0x00014ced; +gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00014cf5; +gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00014cfb; +gatt_client_read_multiple_characteristic_values = 0x00014d29; +gatt_client_read_value_of_characteristic = 0x00014d59; +gatt_client_read_value_of_characteristic_using_value_handle = 0x00014d5f; +gatt_client_read_value_of_characteristics_by_uuid128 = 0x00014d8d; +gatt_client_read_value_of_characteristics_by_uuid16 = 0x00014dd9; +gatt_client_register_handler = 0x00014e25; +gatt_client_reliable_write_long_value_of_characteristic = 0x00014e31; +gatt_client_signed_write_without_response = 0x0001525d; +gatt_client_write_characteristic_descriptor = 0x00015321; +gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x0001532f; +gatt_client_write_client_characteristic_configuration = 0x00015369; +gatt_client_write_long_characteristic_descriptor = 0x000153bb; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x000153cd; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x000153dd; +gatt_client_write_long_value_of_characteristic = 0x00015419; +gatt_client_write_long_value_of_characteristic_with_offset = 0x00015429; +gatt_client_write_value_of_characteristic = 0x00015465; +gatt_client_write_value_of_characteristic_without_response = 0x0001549b; +hci_add_event_handler = 0x00018f9d; +hci_power_control = 0x000197d9; +hci_register_acl_packet_handler = 0x000199d9; +k_delayed_work_add_arg = 0x0001ae4d; +k_delayed_work_cancel = 0x0001ae51; +k_delayed_work_init = 0x0001ae67; +k_delayed_work_remaining_get = 0x0001ae81; +k_delayed_work_submit = 0x0001aea7; +k_fifo_is_empty = 0x0001aec3; +k_sleep = 0x0001aeeb; +k_uptime_get = 0x0001aef9; +k_uptime_get_32 = 0x0001af0d; +k_work_add_arg = 0x0001af1f; +k_work_init = 0x0001af23; +k_work_submit = 0x0001af3d; +kv_commit = 0x0001b1dd; +kv_get = 0x0001b239; +kv_init = 0x0001b251; +kv_put = 0x0001b2a1; +kv_remove = 0x0001b319; +kv_remove_all = 0x0001b355; +kv_value_append = 0x0001b419; +kv_value_modified = 0x0001b47d; +kv_value_trunc = 0x0001b481; +kv_visit = 0x0001b4d1; +l2cap_can_send_fixed_channel_packet_now = 0x0001b545; +l2cap_init = 0x0001b89d; +l2cap_max_le_mtu = 0x0001b8e1; +l2cap_register_fixed_channel = 0x0001b965; +l2cap_request_can_send_fix_channel_now_event = 0x0001b981; +l2cap_send_connectionless = 0x0001bb29; +l2cap_send_connectionless3 = 0x0001bbb9; +l2cap_send_signaling_le = 0x0001bca5; +le_adv_status_reset = 0x0001bce1; +mesh_platform_config = 0x0002a639; +mesh_set_dev_name = 0x0002a8c9; +mesh_setup = 0x0002a8d5; +net_buf_add_zeros = 0x0002d945; +net_buf_get = 0x0002d973; +net_buf_put = 0x0002d983; +net_buf_ref = 0x0002d9a1; +net_buf_reserve = 0x0002d9b1; +net_buf_simple_add = 0x0002d9c3; +net_buf_simple_add_be16 = 0x0002d9c7; +net_buf_simple_add_be32 = 0x0002d9dd; +net_buf_simple_add_le16 = 0x0002d9ef; +net_buf_simple_add_le32 = 0x0002d9fb; +net_buf_simple_add_u8 = 0x0002da07; +net_buf_simple_pull = 0x0002da63; +net_buf_simple_pull_be16 = 0x0002da6f; +net_buf_simple_pull_be32 = 0x0002da97; +net_buf_simple_pull_le16 = 0x0002dabf; +net_buf_simple_pull_le32 = 0x0002dae7; +net_buf_simple_pull_u8 = 0x0002db0f; +net_buf_simple_push = 0x0002db2f; +net_buf_simple_push_be16 = 0x0002db53; +net_buf_simple_push_le16 = 0x0002db87; +net_buf_simple_push_u8 = 0x0002dbbb; +net_buf_slist_get = 0x0002dc25; +net_buf_slist_init = 0x0002dc4d; +net_buf_slist_is_empty = 0x0002dc55; +net_buf_slist_merge_slist = 0x0002dc61; +net_buf_slist_peek_head = 0x0002dc7d; +net_buf_slist_peek_next = 0x0002dc87; +net_buf_slist_put = 0x0002dc91; +net_buf_slist_remove = 0x0002dca1; +net_buf_unref = 0x0002dcdb; +nibble_for_char = 0x0002ed75; +npl_freertos_callout_init = 0x0002f405; +npl_freertos_callout_remaining_ticks = 0x0002f441; +npl_freertos_callout_reset = 0x0002f459; +npl_freertos_eventq_get = 0x0002f4f5; +npl_freertos_eventq_put = 0x0002f549; +npl_freertos_sem_init = 0x0002f5a1; +npl_freertos_sem_pend = 0x0002f5bd; +npl_freertos_sem_release = 0x0002f611; +npl_freertos_time_ms_to_ticks = 0x0002f661; +os_mbuf_adj = 0x0002f78f; +os_mbuf_append = 0x0002f827; +os_mbuf_appendfrom = 0x0002f8bf; +os_mbuf_cmpf = 0x0002f915; +os_mbuf_cmpm = 0x0002f975; +os_mbuf_concat = 0x0002fa33; +os_mbuf_copydata = 0x0002fa6f; +os_mbuf_copyinto = 0x0002fac7; +os_mbuf_dup = 0x0002fb45; +os_mbuf_extend = 0x0002fbb5; +os_mbuf_free = 0x0002fc05; +os_mbuf_free_chain = 0x0002fc1d; +os_mbuf_get = 0x0002fc33; +os_mbuf_get_pkthdr = 0x0002fc5f; +os_mbuf_off = 0x0002fc8f; +os_mbuf_pool_init = 0x0002fcad; +os_mbuf_prepend = 0x0002fcb7; +os_mbuf_prepend_pullup = 0x0002fd39; +os_mbuf_pullup = 0x0002fd51; +os_mbuf_trim_front = 0x0002fe1d; +os_mqueue_get = 0x0002ff3d; +os_mqueue_init = 0x0002ff63; +os_mqueue_put = 0x0002ff75; +os_msys_count = 0x0002ffad; +os_msys_get = 0x0002ffc9; +os_msys_get_pkthdr = 0x0002ffe1; +os_msys_num_free = 0x00030041; +os_msys_register = 0x0003005d; +os_msys_reset = 0x00030099; +platform_config = 0x0003038d; +platform_get_version = 0x000303b9; +platform_printf = 0x000303c1; +platform_raise_assertion = 0x000303d5; +platform_set_evt_callback = 0x00030465; +platform_set_irq_callback = 0x00030479; +platform_set_rf_clk_source = 0x000304bd; +platform_set_rf_init_data = 0x000304c9; +platform_set_rf_power_mapping = 0x000304d5; +platform_shutdown = 0x000304e1; +printf_hexdump = 0x0003149d; +pvPortMalloc = 0x00034611; +pvTaskIncrementMutexHeldCount = 0x000346f5; +pvTimerGetTimerID = 0x0003470d; +pxPortInitialiseStack = 0x00034739; +reverse_128 = 0x00034ead; +reverse_24 = 0x00034eb3; +reverse_48 = 0x00034eb9; +reverse_56 = 0x00034ebf; +reverse_64 = 0x00034ec5; +reverse_bd_addr = 0x00034ecb; +reverse_bytes = 0x00034ed1; +settings_bytes_from_str = 0x000374bd; +settings_str_from_bytes = 0x000374cf; +sm_add_event_handler = 0x00037665; +sm_address_resolution_lookup = 0x000377b1; +sm_authenticated = 0x0003788b; +sm_authorization_decline = 0x000378a1; +sm_authorization_grant = 0x000378c1; +sm_authorization_state = 0x000378e1; +sm_bonding_decline = 0x000378fd; +sm_config = 0x00037df5; +sm_encryption_key_size = 0x00037ef5; +sm_just_works_confirm = 0x00038861; +sm_le_device_key = 0x00038b91; +sm_passkey_input = 0x00038c81; +sm_private_random_address_generation_get = 0x00039051; +sm_private_random_address_generation_get_mode = 0x00039059; +sm_private_random_address_generation_set_mode = 0x00039065; +sm_private_random_address_generation_set_update_period = 0x0003908d; +sm_register_oob_data_callback = 0x000390c5; +sm_request_pairing = 0x000390d1; +sm_send_security_request = 0x00039c5d; +sm_set_accepted_stk_generation_methods = 0x00039c85; +sm_set_authentication_requirements = 0x00039c91; +sm_set_encryption_key_size_range = 0x00039c9d; +sscanf_bd_addr = 0x0003a04d; +sysSetPublicDeviceAddr = 0x0003b429; +uuid128_to_str = 0x0003d609; +uuid_add_bluetooth_prefix = 0x0003d661; +uuid_has_bluetooth_prefix = 0x0003d681; +vPortFree = 0x0003d7c9; +vQueueWaitForMessageRestricted = 0x0003d999; +vTaskDelay = 0x0003d9e1; +vTaskInternalSetTimeOutState = 0x0003da2d; +vTaskMissedYield = 0x0003da3d; +vTaskPlaceOnEventList = 0x0003da49; +vTaskPlaceOnEventListRestricted = 0x0003da81; +vTaskPriorityDisinheritAfterTimeout = 0x0003dac1; +vTaskStartScheduler = 0x0003db6d; +vTaskStepTick = 0x0003dbf9; +vTaskSuspendAll = 0x0003dc29; +vTaskSwitchContext = 0x0003dc39; +xPortStartScheduler = 0x0003e0bd; +xQueueCreateCountingSemaphore = 0x0003e179; +xQueueGenericCreate = 0x0003e1b5; +xQueueGenericCreateStatic = 0x0003e201; +xQueueGenericReset = 0x0003e269; +xQueueGenericSend = 0x0003e2f5; +xQueueGenericSendFromISR = 0x0003e45d; +xQueueGiveFromISR = 0x0003e51d; +xQueueIsQueueEmptyFromISR = 0x0003e5c1; +xQueueReceive = 0x0003e5e5; +xQueueReceiveFromISR = 0x0003e711; +xQueueSemaphoreTake = 0x0003e7a5; +xTaskCheckForTimeOut = 0x0003e90d; +xTaskCreate = 0x0003e97d; +xTaskCreateStatic = 0x0003e9d9; +xTaskGetSchedulerState = 0x0003ea49; +xTaskGetTickCount = 0x0003ea65; +xTaskGetTickCountFromISR = 0x0003ea71; +xTaskIncrementTick = 0x0003ea81; +xTaskPriorityDisinherit = 0x0003eb4d; +xTaskPriorityInherit = 0x0003ebe1; +xTaskRemoveFromEventList = 0x0003ec75; +xTaskResumeAll = 0x0003ecf5; +xTimerCreate = 0x0003edbd; +xTimerCreateTimerTask = 0x0003edf1; +xTimerGenericCommand = 0x0003ee5d; +xTimerGetExpiryTime = 0x0003eecd; diff --git a/bundles/mesh/symdefs.i b/bundles/mesh/symdefs.i index 48cc090c9..86699cba0 100644 --- a/bundles/mesh/symdefs.i +++ b/bundles/mesh/symdefs.i @@ -23,307 +23,304 @@ --define_symbol big_endian_read_32=0x00008339 --define_symbol big_endian_store_16=0x0000834d --define_symbol big_endian_store_32=0x00008359 ---define_symbol ble_gatts_find_chr=0x00008a85 ---define_symbol ble_gatts_find_svc=0x00008b1d ---define_symbol bt_dh_key_gen=0x00008e6d ---define_symbol bt_encrypt_be=0x00008e95 ---define_symbol bt_hex=0x00008ebd ---define_symbol bt_le_adv_start=0x00008f1d ---define_symbol bt_le_adv_stop=0x00009045 ---define_symbol bt_mesh_init=0x0000b7a9 ---define_symbol bt_mesh_input_number=0x0000b809 ---define_symbol bt_mesh_input_string=0x0000b87d ---define_symbol bt_mesh_is_provisioned=0x0000b8f9 ---define_symbol bt_mesh_model_elem=0x0000bdb9 ---define_symbol bt_mesh_model_msg_init=0x0000bf8d ---define_symbol bt_mesh_model_publish=0x0000c025 ---define_symbol bt_mesh_model_send=0x0000c469 ---define_symbol bt_mesh_prov_disable=0x0000e611 ---define_symbol bt_mesh_prov_enable=0x0000e649 ---define_symbol bt_mesh_provision=0x0000e805 ---define_symbol bt_mesh_reset=0x0000efc9 ---define_symbol bt_pub_key_gen=0x0000fa5d ---define_symbol bt_pub_key_get=0x0000fa8d ---define_symbol bt_rand=0x0000faa1 ---define_symbol btstack_push_user_msg=0x0000fd1d ---define_symbol char_for_nibble=0x000102c7 ---define_symbol eTaskConfirmSleepModeStatus=0x00011765 ---define_symbol gap_add_dev_to_periodic_list=0x00013ac1 ---define_symbol gap_add_whitelist=0x00013ad9 ---define_symbol gap_aes_encrypt=0x00013aed ---define_symbol gap_clr_adv_set=0x00013b15 ---define_symbol gap_clr_periodic_adv_list=0x00013b25 ---define_symbol gap_create_connection_cancel=0x00013b51 ---define_symbol gap_disconnect=0x00013b61 ---define_symbol gap_ext_create_connection=0x00013bf5 ---define_symbol gap_get_connection_parameter_range=0x00013cb9 ---define_symbol gap_periodic_adv_create_sync=0x00013d51 ---define_symbol gap_periodic_adv_create_sync_cancel=0x00013d75 ---define_symbol gap_periodic_adv_term_sync=0x00013d85 ---define_symbol gap_read_periodic_adv_list_size=0x00013e91 ---define_symbol gap_read_phy=0x00013ea1 ---define_symbol gap_remove_whitelist=0x00013eb5 ---define_symbol gap_rmv_adv_set=0x00013f41 ---define_symbol gap_rmv_dev_from_periodic_list=0x00013f55 ---define_symbol gap_set_adv_set_random_addr=0x00013f95 ---define_symbol gap_set_connection_parameter_range=0x00013fe1 ---define_symbol gap_set_def_phy=0x00013ff9 ---define_symbol gap_set_ext_adv_data=0x00014011 ---define_symbol gap_set_ext_adv_enable=0x00014029 ---define_symbol gap_set_ext_adv_para=0x000140a5 ---define_symbol gap_set_ext_scan_enable=0x00014171 ---define_symbol gap_set_ext_scan_para=0x00014189 ---define_symbol gap_set_ext_scan_response_data=0x00014231 ---define_symbol gap_set_host_channel_classification=0x00014249 ---define_symbol gap_set_periodic_adv_data=0x0001425d ---define_symbol gap_set_periodic_adv_enable=0x000142d1 ---define_symbol gap_set_periodic_adv_para=0x000142e5 ---define_symbol gap_set_phy=0x000142fd ---define_symbol gap_set_random_device_address=0x00014319 ---define_symbol gap_start_ccm=0x0001437d ---define_symbol gap_update_connection_parameters=0x000143b1 ---define_symbol gatt_client_cancel_write=0x00014869 ---define_symbol gatt_client_deserialize_characteristic=0x0001488f ---define_symbol gatt_client_deserialize_characteristic_descriptor=0x000148c7 ---define_symbol gatt_client_deserialize_service=0x000148d5 ---define_symbol gatt_client_discover_characteristic_descriptors=0x00014901 ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00014943 ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00014993 ---define_symbol gatt_client_discover_characteristics_for_service=0x000149e3 ---define_symbol gatt_client_discover_characteristics_for_service_by_uuid128=0x00014a1b ---define_symbol gatt_client_discover_characteristics_for_service_by_uuid16=0x00014a29 ---define_symbol gatt_client_discover_primary_services=0x00014a37 ---define_symbol gatt_client_discover_primary_services_by_uuid128=0x00014a69 ---define_symbol gatt_client_discover_primary_services_by_uuid16=0x00014aad ---define_symbol gatt_client_execute_write=0x00014ae9 ---define_symbol gatt_client_find_included_services_for_service=0x00014b0f ---define_symbol gatt_client_get_mtu=0x00014b3f ---define_symbol gatt_client_is_ready=0x00014be9 ---define_symbol gatt_client_listen_for_characteristic_value_updates=0x00014bff ---define_symbol gatt_client_prepare_write=0x00014c25 ---define_symbol gatt_client_pts_suppress_mtu_exchange=0x00014c61 ---define_symbol gatt_client_read_characteristic_descriptor=0x00014c6d ---define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00014c73 ---define_symbol gatt_client_read_long_characteristic_descriptor=0x00014c9d ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00014ca5 ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00014cab ---define_symbol gatt_client_read_long_value_of_characteristic=0x00014cd9 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00014ce1 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00014ce7 ---define_symbol gatt_client_read_multiple_characteristic_values=0x00014d15 ---define_symbol gatt_client_read_value_of_characteristic=0x00014d45 ---define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x00014d4b ---define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00014d79 ---define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00014dc5 ---define_symbol gatt_client_register_handler=0x00014e11 ---define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x00014e1d ---define_symbol gatt_client_signed_write_without_response=0x00015249 ---define_symbol gatt_client_write_characteristic_descriptor=0x0001530d ---define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0001531b ---define_symbol gatt_client_write_client_characteristic_configuration=0x00015355 ---define_symbol gatt_client_write_long_characteristic_descriptor=0x000153a7 ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000153b9 ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000153c9 ---define_symbol gatt_client_write_long_value_of_characteristic=0x00015405 ---define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00015415 ---define_symbol gatt_client_write_value_of_characteristic=0x00015451 ---define_symbol gatt_client_write_value_of_characteristic_without_response=0x00015487 ---define_symbol hci_add_event_handler=0x00018f89 ---define_symbol hci_power_control=0x000197c5 ---define_symbol hci_register_acl_packet_handler=0x000199c5 ---define_symbol k_delayed_work_add_arg=0x0001ae91 ---define_symbol k_delayed_work_cancel=0x0001ae95 ---define_symbol k_delayed_work_init=0x0001aeab ---define_symbol k_delayed_work_remaining_get=0x0001aec5 ---define_symbol k_delayed_work_submit=0x0001aeeb ---define_symbol k_fifo_is_empty=0x0001af07 ---define_symbol k_sleep=0x0001af2f ---define_symbol k_uptime_get=0x0001af3d ---define_symbol k_uptime_get_32=0x0001af51 ---define_symbol k_work_add_arg=0x0001af63 ---define_symbol k_work_init=0x0001af67 ---define_symbol k_work_submit=0x0001af81 ---define_symbol kv_commit=0x0001b221 ---define_symbol kv_get=0x0001b27d ---define_symbol kv_init=0x0001b295 ---define_symbol kv_put=0x0001b2e5 ---define_symbol kv_remove=0x0001b35d ---define_symbol kv_remove_all=0x0001b399 ---define_symbol kv_value_append=0x0001b45d ---define_symbol kv_value_modified=0x0001b4c1 ---define_symbol kv_value_trunc=0x0001b4c5 ---define_symbol kv_visit=0x0001b515 ---define_symbol l2cap_can_send_fixed_channel_packet_now=0x0001b589 ---define_symbol l2cap_init=0x0001b8e1 ---define_symbol l2cap_max_le_mtu=0x0001b925 ---define_symbol l2cap_register_fixed_channel=0x0001b9a9 ---define_symbol l2cap_request_can_send_fix_channel_now_event=0x0001b9c5 ---define_symbol l2cap_send_connectionless=0x0001bb6d ---define_symbol l2cap_send_connectionless3=0x0001bbfd ---define_symbol l2cap_send_signaling_le=0x0001bce9 ---define_symbol le_adv_status_reset=0x0001bd25 ---define_symbol mesh_platform_config=0x0002a695 ---define_symbol mesh_set_dev_name=0x0002a925 ---define_symbol mesh_setup=0x0002a931 ---define_symbol net_buf_add_zeros=0x0002d99d ---define_symbol net_buf_get=0x0002d9cb ---define_symbol net_buf_put=0x0002d9db ---define_symbol net_buf_ref=0x0002d9f9 ---define_symbol net_buf_reserve=0x0002da09 ---define_symbol net_buf_simple_add=0x0002da1b ---define_symbol net_buf_simple_add_be16=0x0002da1f ---define_symbol net_buf_simple_add_be32=0x0002da35 ---define_symbol net_buf_simple_add_le16=0x0002da47 ---define_symbol net_buf_simple_add_le32=0x0002da53 ---define_symbol net_buf_simple_add_u8=0x0002da5f ---define_symbol net_buf_simple_pull=0x0002dabb ---define_symbol net_buf_simple_pull_be16=0x0002dac7 ---define_symbol net_buf_simple_pull_be32=0x0002daef ---define_symbol net_buf_simple_pull_le16=0x0002db17 ---define_symbol net_buf_simple_pull_le32=0x0002db3f ---define_symbol net_buf_simple_pull_u8=0x0002db67 ---define_symbol net_buf_simple_push=0x0002db87 ---define_symbol net_buf_simple_push_be16=0x0002dbab ---define_symbol net_buf_simple_push_le16=0x0002dbdf ---define_symbol net_buf_simple_push_u8=0x0002dc13 ---define_symbol net_buf_slist_get=0x0002dc7d ---define_symbol net_buf_slist_init=0x0002dca5 ---define_symbol net_buf_slist_is_empty=0x0002dcad ---define_symbol net_buf_slist_merge_slist=0x0002dcb9 ---define_symbol net_buf_slist_peek_head=0x0002dcd5 ---define_symbol net_buf_slist_peek_next=0x0002dcdf ---define_symbol net_buf_slist_put=0x0002dce9 ---define_symbol net_buf_slist_remove=0x0002dcf9 ---define_symbol net_buf_unref=0x0002dd33 ---define_symbol nibble_for_char=0x0002edcd ---define_symbol npl_freertos_callout_init=0x0002f45d ---define_symbol npl_freertos_callout_remaining_ticks=0x0002f499 ---define_symbol npl_freertos_callout_reset=0x0002f4b1 ---define_symbol npl_freertos_eventq_get=0x0002f54d ---define_symbol npl_freertos_eventq_put=0x0002f5a1 ---define_symbol npl_freertos_sem_init=0x0002f5f9 ---define_symbol npl_freertos_sem_pend=0x0002f615 ---define_symbol npl_freertos_sem_release=0x0002f669 ---define_symbol npl_freertos_time_ms_to_ticks=0x0002f6b9 ---define_symbol os_mbuf_adj=0x0002f7e7 ---define_symbol os_mbuf_append=0x0002f87f ---define_symbol os_mbuf_appendfrom=0x0002f917 ---define_symbol os_mbuf_cmpf=0x0002f96d ---define_symbol os_mbuf_cmpm=0x0002f9cd ---define_symbol os_mbuf_concat=0x0002fa8b ---define_symbol os_mbuf_copydata=0x0002fac7 ---define_symbol os_mbuf_copyinto=0x0002fb1f ---define_symbol os_mbuf_dup=0x0002fb9d ---define_symbol os_mbuf_extend=0x0002fc0d ---define_symbol os_mbuf_free=0x0002fc5d ---define_symbol os_mbuf_free_chain=0x0002fc75 ---define_symbol os_mbuf_get=0x0002fc8b ---define_symbol os_mbuf_get_pkthdr=0x0002fcb7 ---define_symbol os_mbuf_off=0x0002fce7 ---define_symbol os_mbuf_pool_init=0x0002fd05 ---define_symbol os_mbuf_prepend=0x0002fd0f ---define_symbol os_mbuf_prepend_pullup=0x0002fd91 ---define_symbol os_mbuf_pullup=0x0002fda9 ---define_symbol os_mbuf_trim_front=0x0002fe75 ---define_symbol os_mqueue_get=0x0002ff95 ---define_symbol os_mqueue_init=0x0002ffbb ---define_symbol os_mqueue_put=0x0002ffcd ---define_symbol os_msys_count=0x00030005 ---define_symbol os_msys_get=0x00030021 ---define_symbol os_msys_get_pkthdr=0x00030039 ---define_symbol os_msys_num_free=0x00030099 ---define_symbol os_msys_register=0x000300b5 ---define_symbol os_msys_reset=0x000300f1 ---define_symbol platform_config=0x000303e5 ---define_symbol platform_get_heap_status=0x00030411 ---define_symbol platform_get_version=0x00030429 ---define_symbol platform_printf=0x00030431 ---define_symbol platform_raise_assertion=0x00030445 ---define_symbol platform_reset=0x00030459 ---define_symbol platform_set_evt_callback=0x0003048d ---define_symbol platform_set_irq_callback=0x000304a1 ---define_symbol platform_set_rf_clk_source=0x000304d9 ---define_symbol platform_set_rf_init_data=0x000304e5 ---define_symbol platform_set_rf_power_mapping=0x000304f1 ---define_symbol platform_shutdown=0x000304fd ---define_symbol platform_switch_app=0x00030501 ---define_symbol printf_hexdump=0x000314c9 ---define_symbol pvPortMalloc=0x00034699 ---define_symbol pvTaskIncrementMutexHeldCount=0x0003477d ---define_symbol pvTimerGetTimerID=0x00034795 ---define_symbol pxPortInitialiseStack=0x000347c1 ---define_symbol reverse_128=0x00034f35 ---define_symbol reverse_24=0x00034f3b ---define_symbol reverse_48=0x00034f41 ---define_symbol reverse_56=0x00034f47 ---define_symbol reverse_64=0x00034f4d ---define_symbol reverse_bd_addr=0x00034f53 ---define_symbol reverse_bytes=0x00034f59 ---define_symbol settings_bytes_from_str=0x00037545 ---define_symbol settings_str_from_bytes=0x00037557 ---define_symbol sm_add_event_handler=0x000376ed ---define_symbol sm_address_resolution_lookup=0x00037839 ---define_symbol sm_authenticated=0x00037913 ---define_symbol sm_authorization_decline=0x00037929 ---define_symbol sm_authorization_grant=0x00037949 ---define_symbol sm_authorization_state=0x00037969 ---define_symbol sm_bonding_decline=0x00037985 ---define_symbol sm_config=0x00037e7d ---define_symbol sm_encryption_key_size=0x00037f7d ---define_symbol sm_just_works_confirm=0x000388e9 ---define_symbol sm_le_device_key=0x00038c19 ---define_symbol sm_passkey_input=0x00038d09 ---define_symbol sm_private_random_address_generation_get=0x000390d9 ---define_symbol sm_private_random_address_generation_get_mode=0x000390e1 ---define_symbol sm_private_random_address_generation_set_mode=0x000390ed ---define_symbol sm_private_random_address_generation_set_update_period=0x00039115 ---define_symbol sm_register_oob_data_callback=0x0003914d ---define_symbol sm_request_pairing=0x00039159 ---define_symbol sm_send_security_request=0x00039ce5 ---define_symbol sm_set_accepted_stk_generation_methods=0x00039d0d ---define_symbol sm_set_authentication_requirements=0x00039d19 ---define_symbol sm_set_encryption_key_size_range=0x00039d25 ---define_symbol sscanf_bd_addr=0x0003a0d5 ---define_symbol sysSetPublicDeviceAddr=0x0003b4b1 ---define_symbol uuid128_to_str=0x0003d691 ---define_symbol uuid_add_bluetooth_prefix=0x0003d6e9 ---define_symbol uuid_has_bluetooth_prefix=0x0003d709 ---define_symbol vPortFree=0x0003d851 ---define_symbol vQueueWaitForMessageRestricted=0x0003da21 ---define_symbol vTaskDelay=0x0003da69 ---define_symbol vTaskInternalSetTimeOutState=0x0003dab5 ---define_symbol vTaskMissedYield=0x0003dac5 ---define_symbol vTaskPlaceOnEventList=0x0003dad1 ---define_symbol vTaskPlaceOnEventListRestricted=0x0003db09 ---define_symbol vTaskPriorityDisinheritAfterTimeout=0x0003db49 ---define_symbol vTaskStartScheduler=0x0003dbf5 ---define_symbol vTaskStepTick=0x0003dc81 ---define_symbol vTaskSuspendAll=0x0003dcb1 ---define_symbol vTaskSwitchContext=0x0003dcc1 ---define_symbol xPortStartScheduler=0x0003e145 ---define_symbol xQueueCreateCountingSemaphore=0x0003e201 ---define_symbol xQueueGenericCreate=0x0003e23d ---define_symbol xQueueGenericCreateStatic=0x0003e289 ---define_symbol xQueueGenericReset=0x0003e2f1 ---define_symbol xQueueGenericSend=0x0003e37d ---define_symbol xQueueGenericSendFromISR=0x0003e4e5 ---define_symbol xQueueGiveFromISR=0x0003e5a5 ---define_symbol xQueueIsQueueEmptyFromISR=0x0003e649 ---define_symbol xQueueReceive=0x0003e66d ---define_symbol xQueueReceiveFromISR=0x0003e799 ---define_symbol xQueueSemaphoreTake=0x0003e82d ---define_symbol xTaskCheckForTimeOut=0x0003e995 ---define_symbol xTaskCreate=0x0003ea05 ---define_symbol xTaskCreateStatic=0x0003ea61 ---define_symbol xTaskGetSchedulerState=0x0003ead1 ---define_symbol xTaskGetTickCount=0x0003eaed ---define_symbol xTaskGetTickCountFromISR=0x0003eaf9 ---define_symbol xTaskIncrementTick=0x0003eb09 ---define_symbol xTaskPriorityDisinherit=0x0003ebd5 ---define_symbol xTaskPriorityInherit=0x0003ec69 ---define_symbol xTaskRemoveFromEventList=0x0003ecfd ---define_symbol xTaskResumeAll=0x0003ed7d ---define_symbol xTimerCreate=0x0003ee45 ---define_symbol xTimerCreateTimerTask=0x0003ee79 ---define_symbol xTimerGenericCommand=0x0003eee5 ---define_symbol xTimerGetExpiryTime=0x0003ef55 +--define_symbol ble_gatts_find_chr=0x00008a99 +--define_symbol ble_gatts_find_svc=0x00008b31 +--define_symbol bt_dh_key_gen=0x00008e81 +--define_symbol bt_encrypt_be=0x00008ea9 +--define_symbol bt_hex=0x00008ed1 +--define_symbol bt_le_adv_start=0x00008f31 +--define_symbol bt_le_adv_stop=0x00009059 +--define_symbol bt_mesh_init=0x0000b7bd +--define_symbol bt_mesh_input_number=0x0000b81d +--define_symbol bt_mesh_input_string=0x0000b891 +--define_symbol bt_mesh_is_provisioned=0x0000b90d +--define_symbol bt_mesh_model_elem=0x0000bdcd +--define_symbol bt_mesh_model_msg_init=0x0000bfa1 +--define_symbol bt_mesh_model_publish=0x0000c039 +--define_symbol bt_mesh_model_send=0x0000c47d +--define_symbol bt_mesh_prov_disable=0x0000e625 +--define_symbol bt_mesh_prov_enable=0x0000e65d +--define_symbol bt_mesh_provision=0x0000e819 +--define_symbol bt_mesh_reset=0x0000efdd +--define_symbol bt_pub_key_gen=0x0000fa71 +--define_symbol bt_pub_key_get=0x0000faa1 +--define_symbol bt_rand=0x0000fab5 +--define_symbol btstack_push_user_msg=0x0000fd31 +--define_symbol char_for_nibble=0x000102db +--define_symbol eTaskConfirmSleepModeStatus=0x00011779 +--define_symbol gap_add_dev_to_periodic_list=0x00013ad5 +--define_symbol gap_add_whitelist=0x00013aed +--define_symbol gap_aes_encrypt=0x00013b01 +--define_symbol gap_clr_adv_set=0x00013b29 +--define_symbol gap_clr_periodic_adv_list=0x00013b39 +--define_symbol gap_create_connection_cancel=0x00013b65 +--define_symbol gap_disconnect=0x00013b75 +--define_symbol gap_ext_create_connection=0x00013c09 +--define_symbol gap_get_connection_parameter_range=0x00013ccd +--define_symbol gap_periodic_adv_create_sync=0x00013d65 +--define_symbol gap_periodic_adv_create_sync_cancel=0x00013d89 +--define_symbol gap_periodic_adv_term_sync=0x00013d99 +--define_symbol gap_read_periodic_adv_list_size=0x00013ea5 +--define_symbol gap_read_phy=0x00013eb5 +--define_symbol gap_remove_whitelist=0x00013ec9 +--define_symbol gap_rmv_adv_set=0x00013f55 +--define_symbol gap_rmv_dev_from_periodic_list=0x00013f69 +--define_symbol gap_set_adv_set_random_addr=0x00013fa9 +--define_symbol gap_set_connection_parameter_range=0x00013ff5 +--define_symbol gap_set_def_phy=0x0001400d +--define_symbol gap_set_ext_adv_data=0x00014025 +--define_symbol gap_set_ext_adv_enable=0x0001403d +--define_symbol gap_set_ext_adv_para=0x000140b9 +--define_symbol gap_set_ext_scan_enable=0x00014185 +--define_symbol gap_set_ext_scan_para=0x0001419d +--define_symbol gap_set_ext_scan_response_data=0x00014245 +--define_symbol gap_set_host_channel_classification=0x0001425d +--define_symbol gap_set_periodic_adv_data=0x00014271 +--define_symbol gap_set_periodic_adv_enable=0x000142e5 +--define_symbol gap_set_periodic_adv_para=0x000142f9 +--define_symbol gap_set_phy=0x00014311 +--define_symbol gap_set_random_device_address=0x0001432d +--define_symbol gap_start_ccm=0x00014391 +--define_symbol gap_update_connection_parameters=0x000143c5 +--define_symbol gatt_client_cancel_write=0x0001487d +--define_symbol gatt_client_deserialize_characteristic=0x000148a3 +--define_symbol gatt_client_deserialize_characteristic_descriptor=0x000148db +--define_symbol gatt_client_deserialize_service=0x000148e9 +--define_symbol gatt_client_discover_characteristic_descriptors=0x00014915 +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00014957 +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x000149a7 +--define_symbol gatt_client_discover_characteristics_for_service=0x000149f7 +--define_symbol gatt_client_discover_characteristics_for_service_by_uuid128=0x00014a2f +--define_symbol gatt_client_discover_characteristics_for_service_by_uuid16=0x00014a3d +--define_symbol gatt_client_discover_primary_services=0x00014a4b +--define_symbol gatt_client_discover_primary_services_by_uuid128=0x00014a7d +--define_symbol gatt_client_discover_primary_services_by_uuid16=0x00014ac1 +--define_symbol gatt_client_execute_write=0x00014afd +--define_symbol gatt_client_find_included_services_for_service=0x00014b23 +--define_symbol gatt_client_get_mtu=0x00014b53 +--define_symbol gatt_client_is_ready=0x00014bfd +--define_symbol gatt_client_listen_for_characteristic_value_updates=0x00014c13 +--define_symbol gatt_client_prepare_write=0x00014c39 +--define_symbol gatt_client_pts_suppress_mtu_exchange=0x00014c75 +--define_symbol gatt_client_read_characteristic_descriptor=0x00014c81 +--define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00014c87 +--define_symbol gatt_client_read_long_characteristic_descriptor=0x00014cb1 +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00014cb9 +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00014cbf +--define_symbol gatt_client_read_long_value_of_characteristic=0x00014ced +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00014cf5 +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00014cfb +--define_symbol gatt_client_read_multiple_characteristic_values=0x00014d29 +--define_symbol gatt_client_read_value_of_characteristic=0x00014d59 +--define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x00014d5f +--define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00014d8d +--define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00014dd9 +--define_symbol gatt_client_register_handler=0x00014e25 +--define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x00014e31 +--define_symbol gatt_client_signed_write_without_response=0x0001525d +--define_symbol gatt_client_write_characteristic_descriptor=0x00015321 +--define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0001532f +--define_symbol gatt_client_write_client_characteristic_configuration=0x00015369 +--define_symbol gatt_client_write_long_characteristic_descriptor=0x000153bb +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000153cd +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000153dd +--define_symbol gatt_client_write_long_value_of_characteristic=0x00015419 +--define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00015429 +--define_symbol gatt_client_write_value_of_characteristic=0x00015465 +--define_symbol gatt_client_write_value_of_characteristic_without_response=0x0001549b +--define_symbol hci_add_event_handler=0x00018f9d +--define_symbol hci_power_control=0x000197d9 +--define_symbol hci_register_acl_packet_handler=0x000199d9 +--define_symbol k_delayed_work_add_arg=0x0001ae4d +--define_symbol k_delayed_work_cancel=0x0001ae51 +--define_symbol k_delayed_work_init=0x0001ae67 +--define_symbol k_delayed_work_remaining_get=0x0001ae81 +--define_symbol k_delayed_work_submit=0x0001aea7 +--define_symbol k_fifo_is_empty=0x0001aec3 +--define_symbol k_sleep=0x0001aeeb +--define_symbol k_uptime_get=0x0001aef9 +--define_symbol k_uptime_get_32=0x0001af0d +--define_symbol k_work_add_arg=0x0001af1f +--define_symbol k_work_init=0x0001af23 +--define_symbol k_work_submit=0x0001af3d +--define_symbol kv_commit=0x0001b1dd +--define_symbol kv_get=0x0001b239 +--define_symbol kv_init=0x0001b251 +--define_symbol kv_put=0x0001b2a1 +--define_symbol kv_remove=0x0001b319 +--define_symbol kv_remove_all=0x0001b355 +--define_symbol kv_value_append=0x0001b419 +--define_symbol kv_value_modified=0x0001b47d +--define_symbol kv_value_trunc=0x0001b481 +--define_symbol kv_visit=0x0001b4d1 +--define_symbol l2cap_can_send_fixed_channel_packet_now=0x0001b545 +--define_symbol l2cap_init=0x0001b89d +--define_symbol l2cap_max_le_mtu=0x0001b8e1 +--define_symbol l2cap_register_fixed_channel=0x0001b965 +--define_symbol l2cap_request_can_send_fix_channel_now_event=0x0001b981 +--define_symbol l2cap_send_connectionless=0x0001bb29 +--define_symbol l2cap_send_connectionless3=0x0001bbb9 +--define_symbol l2cap_send_signaling_le=0x0001bca5 +--define_symbol le_adv_status_reset=0x0001bce1 +--define_symbol mesh_platform_config=0x0002a639 +--define_symbol mesh_set_dev_name=0x0002a8c9 +--define_symbol mesh_setup=0x0002a8d5 +--define_symbol net_buf_add_zeros=0x0002d945 +--define_symbol net_buf_get=0x0002d973 +--define_symbol net_buf_put=0x0002d983 +--define_symbol net_buf_ref=0x0002d9a1 +--define_symbol net_buf_reserve=0x0002d9b1 +--define_symbol net_buf_simple_add=0x0002d9c3 +--define_symbol net_buf_simple_add_be16=0x0002d9c7 +--define_symbol net_buf_simple_add_be32=0x0002d9dd +--define_symbol net_buf_simple_add_le16=0x0002d9ef +--define_symbol net_buf_simple_add_le32=0x0002d9fb +--define_symbol net_buf_simple_add_u8=0x0002da07 +--define_symbol net_buf_simple_pull=0x0002da63 +--define_symbol net_buf_simple_pull_be16=0x0002da6f +--define_symbol net_buf_simple_pull_be32=0x0002da97 +--define_symbol net_buf_simple_pull_le16=0x0002dabf +--define_symbol net_buf_simple_pull_le32=0x0002dae7 +--define_symbol net_buf_simple_pull_u8=0x0002db0f +--define_symbol net_buf_simple_push=0x0002db2f +--define_symbol net_buf_simple_push_be16=0x0002db53 +--define_symbol net_buf_simple_push_le16=0x0002db87 +--define_symbol net_buf_simple_push_u8=0x0002dbbb +--define_symbol net_buf_slist_get=0x0002dc25 +--define_symbol net_buf_slist_init=0x0002dc4d +--define_symbol net_buf_slist_is_empty=0x0002dc55 +--define_symbol net_buf_slist_merge_slist=0x0002dc61 +--define_symbol net_buf_slist_peek_head=0x0002dc7d +--define_symbol net_buf_slist_peek_next=0x0002dc87 +--define_symbol net_buf_slist_put=0x0002dc91 +--define_symbol net_buf_slist_remove=0x0002dca1 +--define_symbol net_buf_unref=0x0002dcdb +--define_symbol nibble_for_char=0x0002ed75 +--define_symbol npl_freertos_callout_init=0x0002f405 +--define_symbol npl_freertos_callout_remaining_ticks=0x0002f441 +--define_symbol npl_freertos_callout_reset=0x0002f459 +--define_symbol npl_freertos_eventq_get=0x0002f4f5 +--define_symbol npl_freertos_eventq_put=0x0002f549 +--define_symbol npl_freertos_sem_init=0x0002f5a1 +--define_symbol npl_freertos_sem_pend=0x0002f5bd +--define_symbol npl_freertos_sem_release=0x0002f611 +--define_symbol npl_freertos_time_ms_to_ticks=0x0002f661 +--define_symbol os_mbuf_adj=0x0002f78f +--define_symbol os_mbuf_append=0x0002f827 +--define_symbol os_mbuf_appendfrom=0x0002f8bf +--define_symbol os_mbuf_cmpf=0x0002f915 +--define_symbol os_mbuf_cmpm=0x0002f975 +--define_symbol os_mbuf_concat=0x0002fa33 +--define_symbol os_mbuf_copydata=0x0002fa6f +--define_symbol os_mbuf_copyinto=0x0002fac7 +--define_symbol os_mbuf_dup=0x0002fb45 +--define_symbol os_mbuf_extend=0x0002fbb5 +--define_symbol os_mbuf_free=0x0002fc05 +--define_symbol os_mbuf_free_chain=0x0002fc1d +--define_symbol os_mbuf_get=0x0002fc33 +--define_symbol os_mbuf_get_pkthdr=0x0002fc5f +--define_symbol os_mbuf_off=0x0002fc8f +--define_symbol os_mbuf_pool_init=0x0002fcad +--define_symbol os_mbuf_prepend=0x0002fcb7 +--define_symbol os_mbuf_prepend_pullup=0x0002fd39 +--define_symbol os_mbuf_pullup=0x0002fd51 +--define_symbol os_mbuf_trim_front=0x0002fe1d +--define_symbol os_mqueue_get=0x0002ff3d +--define_symbol os_mqueue_init=0x0002ff63 +--define_symbol os_mqueue_put=0x0002ff75 +--define_symbol os_msys_count=0x0002ffad +--define_symbol os_msys_get=0x0002ffc9 +--define_symbol os_msys_get_pkthdr=0x0002ffe1 +--define_symbol os_msys_num_free=0x00030041 +--define_symbol os_msys_register=0x0003005d +--define_symbol os_msys_reset=0x00030099 +--define_symbol platform_config=0x0003038d +--define_symbol platform_get_version=0x000303b9 +--define_symbol platform_printf=0x000303c1 +--define_symbol platform_raise_assertion=0x000303d5 +--define_symbol platform_set_evt_callback=0x00030465 +--define_symbol platform_set_irq_callback=0x00030479 +--define_symbol platform_set_rf_clk_source=0x000304bd +--define_symbol platform_set_rf_init_data=0x000304c9 +--define_symbol platform_set_rf_power_mapping=0x000304d5 +--define_symbol platform_shutdown=0x000304e1 +--define_symbol printf_hexdump=0x0003149d +--define_symbol pvPortMalloc=0x00034611 +--define_symbol pvTaskIncrementMutexHeldCount=0x000346f5 +--define_symbol pvTimerGetTimerID=0x0003470d +--define_symbol pxPortInitialiseStack=0x00034739 +--define_symbol reverse_128=0x00034ead +--define_symbol reverse_24=0x00034eb3 +--define_symbol reverse_48=0x00034eb9 +--define_symbol reverse_56=0x00034ebf +--define_symbol reverse_64=0x00034ec5 +--define_symbol reverse_bd_addr=0x00034ecb +--define_symbol reverse_bytes=0x00034ed1 +--define_symbol settings_bytes_from_str=0x000374bd +--define_symbol settings_str_from_bytes=0x000374cf +--define_symbol sm_add_event_handler=0x00037665 +--define_symbol sm_address_resolution_lookup=0x000377b1 +--define_symbol sm_authenticated=0x0003788b +--define_symbol sm_authorization_decline=0x000378a1 +--define_symbol sm_authorization_grant=0x000378c1 +--define_symbol sm_authorization_state=0x000378e1 +--define_symbol sm_bonding_decline=0x000378fd +--define_symbol sm_config=0x00037df5 +--define_symbol sm_encryption_key_size=0x00037ef5 +--define_symbol sm_just_works_confirm=0x00038861 +--define_symbol sm_le_device_key=0x00038b91 +--define_symbol sm_passkey_input=0x00038c81 +--define_symbol sm_private_random_address_generation_get=0x00039051 +--define_symbol sm_private_random_address_generation_get_mode=0x00039059 +--define_symbol sm_private_random_address_generation_set_mode=0x00039065 +--define_symbol sm_private_random_address_generation_set_update_period=0x0003908d +--define_symbol sm_register_oob_data_callback=0x000390c5 +--define_symbol sm_request_pairing=0x000390d1 +--define_symbol sm_send_security_request=0x00039c5d +--define_symbol sm_set_accepted_stk_generation_methods=0x00039c85 +--define_symbol sm_set_authentication_requirements=0x00039c91 +--define_symbol sm_set_encryption_key_size_range=0x00039c9d +--define_symbol sscanf_bd_addr=0x0003a04d +--define_symbol sysSetPublicDeviceAddr=0x0003b429 +--define_symbol uuid128_to_str=0x0003d609 +--define_symbol uuid_add_bluetooth_prefix=0x0003d661 +--define_symbol uuid_has_bluetooth_prefix=0x0003d681 +--define_symbol vPortFree=0x0003d7c9 +--define_symbol vQueueWaitForMessageRestricted=0x0003d999 +--define_symbol vTaskDelay=0x0003d9e1 +--define_symbol vTaskInternalSetTimeOutState=0x0003da2d +--define_symbol vTaskMissedYield=0x0003da3d +--define_symbol vTaskPlaceOnEventList=0x0003da49 +--define_symbol vTaskPlaceOnEventListRestricted=0x0003da81 +--define_symbol vTaskPriorityDisinheritAfterTimeout=0x0003dac1 +--define_symbol vTaskStartScheduler=0x0003db6d +--define_symbol vTaskStepTick=0x0003dbf9 +--define_symbol vTaskSuspendAll=0x0003dc29 +--define_symbol vTaskSwitchContext=0x0003dc39 +--define_symbol xPortStartScheduler=0x0003e0bd +--define_symbol xQueueCreateCountingSemaphore=0x0003e179 +--define_symbol xQueueGenericCreate=0x0003e1b5 +--define_symbol xQueueGenericCreateStatic=0x0003e201 +--define_symbol xQueueGenericReset=0x0003e269 +--define_symbol xQueueGenericSend=0x0003e2f5 +--define_symbol xQueueGenericSendFromISR=0x0003e45d +--define_symbol xQueueGiveFromISR=0x0003e51d +--define_symbol xQueueIsQueueEmptyFromISR=0x0003e5c1 +--define_symbol xQueueReceive=0x0003e5e5 +--define_symbol xQueueReceiveFromISR=0x0003e711 +--define_symbol xQueueSemaphoreTake=0x0003e7a5 +--define_symbol xTaskCheckForTimeOut=0x0003e90d +--define_symbol xTaskCreate=0x0003e97d +--define_symbol xTaskCreateStatic=0x0003e9d9 +--define_symbol xTaskGetSchedulerState=0x0003ea49 +--define_symbol xTaskGetTickCount=0x0003ea65 +--define_symbol xTaskGetTickCountFromISR=0x0003ea71 +--define_symbol xTaskIncrementTick=0x0003ea81 +--define_symbol xTaskPriorityDisinherit=0x0003eb4d +--define_symbol xTaskPriorityInherit=0x0003ebe1 +--define_symbol xTaskRemoveFromEventList=0x0003ec75 +--define_symbol xTaskResumeAll=0x0003ecf5 +--define_symbol xTimerCreate=0x0003edbd +--define_symbol xTimerCreateTimerTask=0x0003edf1 +--define_symbol xTimerGenericCommand=0x0003ee5d +--define_symbol xTimerGetExpiryTime=0x0003eecd diff --git a/bundles/mesh/symdefs.m b/bundles/mesh/symdefs.m index 910af3197..a4043192c 100644 --- a/bundles/mesh/symdefs.m +++ b/bundles/mesh/symdefs.m @@ -24,307 +24,304 @@ 0x00008339 T big_endian_read_32 0x0000834d T big_endian_store_16 0x00008359 T big_endian_store_32 -0x00008a85 T ble_gatts_find_chr -0x00008b1d T ble_gatts_find_svc -0x00008e6d T bt_dh_key_gen -0x00008e95 T bt_encrypt_be -0x00008ebd T bt_hex -0x00008f1d T bt_le_adv_start -0x00009045 T bt_le_adv_stop -0x0000b7a9 T bt_mesh_init -0x0000b809 T bt_mesh_input_number -0x0000b87d T bt_mesh_input_string -0x0000b8f9 T bt_mesh_is_provisioned -0x0000bdb9 T bt_mesh_model_elem -0x0000bf8d T bt_mesh_model_msg_init -0x0000c025 T bt_mesh_model_publish -0x0000c469 T bt_mesh_model_send -0x0000e611 T bt_mesh_prov_disable -0x0000e649 T bt_mesh_prov_enable -0x0000e805 T bt_mesh_provision -0x0000efc9 T bt_mesh_reset -0x0000fa5d T bt_pub_key_gen -0x0000fa8d T bt_pub_key_get -0x0000faa1 T bt_rand -0x0000fd1d T btstack_push_user_msg -0x000102c7 T char_for_nibble -0x00011765 T eTaskConfirmSleepModeStatus -0x00013ac1 T gap_add_dev_to_periodic_list -0x00013ad9 T gap_add_whitelist -0x00013aed T gap_aes_encrypt -0x00013b15 T gap_clr_adv_set -0x00013b25 T gap_clr_periodic_adv_list -0x00013b51 T gap_create_connection_cancel -0x00013b61 T gap_disconnect -0x00013bf5 T gap_ext_create_connection -0x00013cb9 T gap_get_connection_parameter_range -0x00013d51 T gap_periodic_adv_create_sync -0x00013d75 T gap_periodic_adv_create_sync_cancel -0x00013d85 T gap_periodic_adv_term_sync -0x00013e91 T gap_read_periodic_adv_list_size -0x00013ea1 T gap_read_phy -0x00013eb5 T gap_remove_whitelist -0x00013f41 T gap_rmv_adv_set -0x00013f55 T gap_rmv_dev_from_periodic_list -0x00013f95 T gap_set_adv_set_random_addr -0x00013fe1 T gap_set_connection_parameter_range -0x00013ff9 T gap_set_def_phy -0x00014011 T gap_set_ext_adv_data -0x00014029 T gap_set_ext_adv_enable -0x000140a5 T gap_set_ext_adv_para -0x00014171 T gap_set_ext_scan_enable -0x00014189 T gap_set_ext_scan_para -0x00014231 T gap_set_ext_scan_response_data -0x00014249 T gap_set_host_channel_classification -0x0001425d T gap_set_periodic_adv_data -0x000142d1 T gap_set_periodic_adv_enable -0x000142e5 T gap_set_periodic_adv_para -0x000142fd T gap_set_phy -0x00014319 T gap_set_random_device_address -0x0001437d T gap_start_ccm -0x000143b1 T gap_update_connection_parameters -0x00014869 T gatt_client_cancel_write -0x0001488f T gatt_client_deserialize_characteristic -0x000148c7 T gatt_client_deserialize_characteristic_descriptor -0x000148d5 T gatt_client_deserialize_service -0x00014901 T gatt_client_discover_characteristic_descriptors -0x00014943 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x00014993 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x000149e3 T gatt_client_discover_characteristics_for_service -0x00014a1b T gatt_client_discover_characteristics_for_service_by_uuid128 -0x00014a29 T gatt_client_discover_characteristics_for_service_by_uuid16 -0x00014a37 T gatt_client_discover_primary_services -0x00014a69 T gatt_client_discover_primary_services_by_uuid128 -0x00014aad T gatt_client_discover_primary_services_by_uuid16 -0x00014ae9 T gatt_client_execute_write -0x00014b0f T gatt_client_find_included_services_for_service -0x00014b3f T gatt_client_get_mtu -0x00014be9 T gatt_client_is_ready -0x00014bff T gatt_client_listen_for_characteristic_value_updates -0x00014c25 T gatt_client_prepare_write -0x00014c61 T gatt_client_pts_suppress_mtu_exchange -0x00014c6d T gatt_client_read_characteristic_descriptor -0x00014c73 T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x00014c9d T gatt_client_read_long_characteristic_descriptor -0x00014ca5 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x00014cab T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00014cd9 T gatt_client_read_long_value_of_characteristic -0x00014ce1 T gatt_client_read_long_value_of_characteristic_using_value_handle -0x00014ce7 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x00014d15 T gatt_client_read_multiple_characteristic_values -0x00014d45 T gatt_client_read_value_of_characteristic -0x00014d4b T gatt_client_read_value_of_characteristic_using_value_handle -0x00014d79 T gatt_client_read_value_of_characteristics_by_uuid128 -0x00014dc5 T gatt_client_read_value_of_characteristics_by_uuid16 -0x00014e11 T gatt_client_register_handler -0x00014e1d T gatt_client_reliable_write_long_value_of_characteristic -0x00015249 T gatt_client_signed_write_without_response -0x0001530d T gatt_client_write_characteristic_descriptor -0x0001531b T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x00015355 T gatt_client_write_client_characteristic_configuration -0x000153a7 T gatt_client_write_long_characteristic_descriptor -0x000153b9 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x000153c9 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00015405 T gatt_client_write_long_value_of_characteristic -0x00015415 T gatt_client_write_long_value_of_characteristic_with_offset -0x00015451 T gatt_client_write_value_of_characteristic -0x00015487 T gatt_client_write_value_of_characteristic_without_response -0x00018f89 T hci_add_event_handler -0x000197c5 T hci_power_control -0x000199c5 T hci_register_acl_packet_handler -0x0001ae91 T k_delayed_work_add_arg -0x0001ae95 T k_delayed_work_cancel -0x0001aeab T k_delayed_work_init -0x0001aec5 T k_delayed_work_remaining_get -0x0001aeeb T k_delayed_work_submit -0x0001af07 T k_fifo_is_empty -0x0001af2f T k_sleep -0x0001af3d T k_uptime_get -0x0001af51 T k_uptime_get_32 -0x0001af63 T k_work_add_arg -0x0001af67 T k_work_init -0x0001af81 T k_work_submit -0x0001b221 T kv_commit -0x0001b27d T kv_get -0x0001b295 T kv_init -0x0001b2e5 T kv_put -0x0001b35d T kv_remove -0x0001b399 T kv_remove_all -0x0001b45d T kv_value_append -0x0001b4c1 T kv_value_modified -0x0001b4c5 T kv_value_trunc -0x0001b515 T kv_visit -0x0001b589 T l2cap_can_send_fixed_channel_packet_now -0x0001b8e1 T l2cap_init -0x0001b925 T l2cap_max_le_mtu -0x0001b9a9 T l2cap_register_fixed_channel -0x0001b9c5 T l2cap_request_can_send_fix_channel_now_event -0x0001bb6d T l2cap_send_connectionless -0x0001bbfd T l2cap_send_connectionless3 -0x0001bce9 T l2cap_send_signaling_le -0x0001bd25 T le_adv_status_reset -0x0002a695 T mesh_platform_config -0x0002a925 T mesh_set_dev_name -0x0002a931 T mesh_setup -0x0002d99d T net_buf_add_zeros -0x0002d9cb T net_buf_get -0x0002d9db T net_buf_put -0x0002d9f9 T net_buf_ref -0x0002da09 T net_buf_reserve -0x0002da1b T net_buf_simple_add -0x0002da1f T net_buf_simple_add_be16 -0x0002da35 T net_buf_simple_add_be32 -0x0002da47 T net_buf_simple_add_le16 -0x0002da53 T net_buf_simple_add_le32 -0x0002da5f T net_buf_simple_add_u8 -0x0002dabb T net_buf_simple_pull -0x0002dac7 T net_buf_simple_pull_be16 -0x0002daef T net_buf_simple_pull_be32 -0x0002db17 T net_buf_simple_pull_le16 -0x0002db3f T net_buf_simple_pull_le32 -0x0002db67 T net_buf_simple_pull_u8 -0x0002db87 T net_buf_simple_push -0x0002dbab T net_buf_simple_push_be16 -0x0002dbdf T net_buf_simple_push_le16 -0x0002dc13 T net_buf_simple_push_u8 -0x0002dc7d T net_buf_slist_get -0x0002dca5 T net_buf_slist_init -0x0002dcad T net_buf_slist_is_empty -0x0002dcb9 T net_buf_slist_merge_slist -0x0002dcd5 T net_buf_slist_peek_head -0x0002dcdf T net_buf_slist_peek_next -0x0002dce9 T net_buf_slist_put -0x0002dcf9 T net_buf_slist_remove -0x0002dd33 T net_buf_unref -0x0002edcd T nibble_for_char -0x0002f45d T npl_freertos_callout_init -0x0002f499 T npl_freertos_callout_remaining_ticks -0x0002f4b1 T npl_freertos_callout_reset -0x0002f54d T npl_freertos_eventq_get -0x0002f5a1 T npl_freertos_eventq_put -0x0002f5f9 T npl_freertos_sem_init -0x0002f615 T npl_freertos_sem_pend -0x0002f669 T npl_freertos_sem_release -0x0002f6b9 T npl_freertos_time_ms_to_ticks -0x0002f7e7 T os_mbuf_adj -0x0002f87f T os_mbuf_append -0x0002f917 T os_mbuf_appendfrom -0x0002f96d T os_mbuf_cmpf -0x0002f9cd T os_mbuf_cmpm -0x0002fa8b T os_mbuf_concat -0x0002fac7 T os_mbuf_copydata -0x0002fb1f T os_mbuf_copyinto -0x0002fb9d T os_mbuf_dup -0x0002fc0d T os_mbuf_extend -0x0002fc5d T os_mbuf_free -0x0002fc75 T os_mbuf_free_chain -0x0002fc8b T os_mbuf_get -0x0002fcb7 T os_mbuf_get_pkthdr -0x0002fce7 T os_mbuf_off -0x0002fd05 T os_mbuf_pool_init -0x0002fd0f T os_mbuf_prepend -0x0002fd91 T os_mbuf_prepend_pullup -0x0002fda9 T os_mbuf_pullup -0x0002fe75 T os_mbuf_trim_front -0x0002ff95 T os_mqueue_get -0x0002ffbb T os_mqueue_init -0x0002ffcd T os_mqueue_put -0x00030005 T os_msys_count -0x00030021 T os_msys_get -0x00030039 T os_msys_get_pkthdr -0x00030099 T os_msys_num_free -0x000300b5 T os_msys_register -0x000300f1 T os_msys_reset -0x000303e5 T platform_config -0x00030411 T platform_get_heap_status -0x00030429 T platform_get_version -0x00030431 T platform_printf -0x00030445 T platform_raise_assertion -0x00030459 T platform_reset -0x0003048d T platform_set_evt_callback -0x000304a1 T platform_set_irq_callback -0x000304d9 T platform_set_rf_clk_source -0x000304e5 T platform_set_rf_init_data -0x000304f1 T platform_set_rf_power_mapping -0x000304fd T platform_shutdown -0x00030501 T platform_switch_app -0x000314c9 T printf_hexdump -0x00034699 T pvPortMalloc -0x0003477d T pvTaskIncrementMutexHeldCount -0x00034795 T pvTimerGetTimerID -0x000347c1 T pxPortInitialiseStack -0x00034f35 T reverse_128 -0x00034f3b T reverse_24 -0x00034f41 T reverse_48 -0x00034f47 T reverse_56 -0x00034f4d T reverse_64 -0x00034f53 T reverse_bd_addr -0x00034f59 T reverse_bytes -0x00037545 T settings_bytes_from_str -0x00037557 T settings_str_from_bytes -0x000376ed T sm_add_event_handler -0x00037839 T sm_address_resolution_lookup -0x00037913 T sm_authenticated -0x00037929 T sm_authorization_decline -0x00037949 T sm_authorization_grant -0x00037969 T sm_authorization_state -0x00037985 T sm_bonding_decline -0x00037e7d T sm_config -0x00037f7d T sm_encryption_key_size -0x000388e9 T sm_just_works_confirm -0x00038c19 T sm_le_device_key -0x00038d09 T sm_passkey_input -0x000390d9 T sm_private_random_address_generation_get -0x000390e1 T sm_private_random_address_generation_get_mode -0x000390ed T sm_private_random_address_generation_set_mode -0x00039115 T sm_private_random_address_generation_set_update_period -0x0003914d T sm_register_oob_data_callback -0x00039159 T sm_request_pairing -0x00039ce5 T sm_send_security_request -0x00039d0d T sm_set_accepted_stk_generation_methods -0x00039d19 T sm_set_authentication_requirements -0x00039d25 T sm_set_encryption_key_size_range -0x0003a0d5 T sscanf_bd_addr -0x0003b4b1 T sysSetPublicDeviceAddr -0x0003d691 T uuid128_to_str -0x0003d6e9 T uuid_add_bluetooth_prefix -0x0003d709 T uuid_has_bluetooth_prefix -0x0003d851 T vPortFree -0x0003da21 T vQueueWaitForMessageRestricted -0x0003da69 T vTaskDelay -0x0003dab5 T vTaskInternalSetTimeOutState -0x0003dac5 T vTaskMissedYield -0x0003dad1 T vTaskPlaceOnEventList -0x0003db09 T vTaskPlaceOnEventListRestricted -0x0003db49 T vTaskPriorityDisinheritAfterTimeout -0x0003dbf5 T vTaskStartScheduler -0x0003dc81 T vTaskStepTick -0x0003dcb1 T vTaskSuspendAll -0x0003dcc1 T vTaskSwitchContext -0x0003e145 T xPortStartScheduler -0x0003e201 T xQueueCreateCountingSemaphore -0x0003e23d T xQueueGenericCreate -0x0003e289 T xQueueGenericCreateStatic -0x0003e2f1 T xQueueGenericReset -0x0003e37d T xQueueGenericSend -0x0003e4e5 T xQueueGenericSendFromISR -0x0003e5a5 T xQueueGiveFromISR -0x0003e649 T xQueueIsQueueEmptyFromISR -0x0003e66d T xQueueReceive -0x0003e799 T xQueueReceiveFromISR -0x0003e82d T xQueueSemaphoreTake -0x0003e995 T xTaskCheckForTimeOut -0x0003ea05 T xTaskCreate -0x0003ea61 T xTaskCreateStatic -0x0003ead1 T xTaskGetSchedulerState -0x0003eaed T xTaskGetTickCount -0x0003eaf9 T xTaskGetTickCountFromISR -0x0003eb09 T xTaskIncrementTick -0x0003ebd5 T xTaskPriorityDisinherit -0x0003ec69 T xTaskPriorityInherit -0x0003ecfd T xTaskRemoveFromEventList -0x0003ed7d T xTaskResumeAll -0x0003ee45 T xTimerCreate -0x0003ee79 T xTimerCreateTimerTask -0x0003eee5 T xTimerGenericCommand -0x0003ef55 T xTimerGetExpiryTime +0x00008a99 T ble_gatts_find_chr +0x00008b31 T ble_gatts_find_svc +0x00008e81 T bt_dh_key_gen +0x00008ea9 T bt_encrypt_be +0x00008ed1 T bt_hex +0x00008f31 T bt_le_adv_start +0x00009059 T bt_le_adv_stop +0x0000b7bd T bt_mesh_init +0x0000b81d T bt_mesh_input_number +0x0000b891 T bt_mesh_input_string +0x0000b90d T bt_mesh_is_provisioned +0x0000bdcd T bt_mesh_model_elem +0x0000bfa1 T bt_mesh_model_msg_init +0x0000c039 T bt_mesh_model_publish +0x0000c47d T bt_mesh_model_send +0x0000e625 T bt_mesh_prov_disable +0x0000e65d T bt_mesh_prov_enable +0x0000e819 T bt_mesh_provision +0x0000efdd T bt_mesh_reset +0x0000fa71 T bt_pub_key_gen +0x0000faa1 T bt_pub_key_get +0x0000fab5 T bt_rand +0x0000fd31 T btstack_push_user_msg +0x000102db T char_for_nibble +0x00011779 T eTaskConfirmSleepModeStatus +0x00013ad5 T gap_add_dev_to_periodic_list +0x00013aed T gap_add_whitelist +0x00013b01 T gap_aes_encrypt +0x00013b29 T gap_clr_adv_set +0x00013b39 T gap_clr_periodic_adv_list +0x00013b65 T gap_create_connection_cancel +0x00013b75 T gap_disconnect +0x00013c09 T gap_ext_create_connection +0x00013ccd T gap_get_connection_parameter_range +0x00013d65 T gap_periodic_adv_create_sync +0x00013d89 T gap_periodic_adv_create_sync_cancel +0x00013d99 T gap_periodic_adv_term_sync +0x00013ea5 T gap_read_periodic_adv_list_size +0x00013eb5 T gap_read_phy +0x00013ec9 T gap_remove_whitelist +0x00013f55 T gap_rmv_adv_set +0x00013f69 T gap_rmv_dev_from_periodic_list +0x00013fa9 T gap_set_adv_set_random_addr +0x00013ff5 T gap_set_connection_parameter_range +0x0001400d T gap_set_def_phy +0x00014025 T gap_set_ext_adv_data +0x0001403d T gap_set_ext_adv_enable +0x000140b9 T gap_set_ext_adv_para +0x00014185 T gap_set_ext_scan_enable +0x0001419d T gap_set_ext_scan_para +0x00014245 T gap_set_ext_scan_response_data +0x0001425d T gap_set_host_channel_classification +0x00014271 T gap_set_periodic_adv_data +0x000142e5 T gap_set_periodic_adv_enable +0x000142f9 T gap_set_periodic_adv_para +0x00014311 T gap_set_phy +0x0001432d T gap_set_random_device_address +0x00014391 T gap_start_ccm +0x000143c5 T gap_update_connection_parameters +0x0001487d T gatt_client_cancel_write +0x000148a3 T gatt_client_deserialize_characteristic +0x000148db T gatt_client_deserialize_characteristic_descriptor +0x000148e9 T gatt_client_deserialize_service +0x00014915 T gatt_client_discover_characteristic_descriptors +0x00014957 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 +0x000149a7 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 +0x000149f7 T gatt_client_discover_characteristics_for_service +0x00014a2f T gatt_client_discover_characteristics_for_service_by_uuid128 +0x00014a3d T gatt_client_discover_characteristics_for_service_by_uuid16 +0x00014a4b T gatt_client_discover_primary_services +0x00014a7d T gatt_client_discover_primary_services_by_uuid128 +0x00014ac1 T gatt_client_discover_primary_services_by_uuid16 +0x00014afd T gatt_client_execute_write +0x00014b23 T gatt_client_find_included_services_for_service +0x00014b53 T gatt_client_get_mtu +0x00014bfd T gatt_client_is_ready +0x00014c13 T gatt_client_listen_for_characteristic_value_updates +0x00014c39 T gatt_client_prepare_write +0x00014c75 T gatt_client_pts_suppress_mtu_exchange +0x00014c81 T gatt_client_read_characteristic_descriptor +0x00014c87 T gatt_client_read_characteristic_descriptor_using_descriptor_handle +0x00014cb1 T gatt_client_read_long_characteristic_descriptor +0x00014cb9 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle +0x00014cbf T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00014ced T gatt_client_read_long_value_of_characteristic +0x00014cf5 T gatt_client_read_long_value_of_characteristic_using_value_handle +0x00014cfb T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset +0x00014d29 T gatt_client_read_multiple_characteristic_values +0x00014d59 T gatt_client_read_value_of_characteristic +0x00014d5f T gatt_client_read_value_of_characteristic_using_value_handle +0x00014d8d T gatt_client_read_value_of_characteristics_by_uuid128 +0x00014dd9 T gatt_client_read_value_of_characteristics_by_uuid16 +0x00014e25 T gatt_client_register_handler +0x00014e31 T gatt_client_reliable_write_long_value_of_characteristic +0x0001525d T gatt_client_signed_write_without_response +0x00015321 T gatt_client_write_characteristic_descriptor +0x0001532f T gatt_client_write_characteristic_descriptor_using_descriptor_handle +0x00015369 T gatt_client_write_client_characteristic_configuration +0x000153bb T gatt_client_write_long_characteristic_descriptor +0x000153cd T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle +0x000153dd T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00015419 T gatt_client_write_long_value_of_characteristic +0x00015429 T gatt_client_write_long_value_of_characteristic_with_offset +0x00015465 T gatt_client_write_value_of_characteristic +0x0001549b T gatt_client_write_value_of_characteristic_without_response +0x00018f9d T hci_add_event_handler +0x000197d9 T hci_power_control +0x000199d9 T hci_register_acl_packet_handler +0x0001ae4d T k_delayed_work_add_arg +0x0001ae51 T k_delayed_work_cancel +0x0001ae67 T k_delayed_work_init +0x0001ae81 T k_delayed_work_remaining_get +0x0001aea7 T k_delayed_work_submit +0x0001aec3 T k_fifo_is_empty +0x0001aeeb T k_sleep +0x0001aef9 T k_uptime_get +0x0001af0d T k_uptime_get_32 +0x0001af1f T k_work_add_arg +0x0001af23 T k_work_init +0x0001af3d T k_work_submit +0x0001b1dd T kv_commit +0x0001b239 T kv_get +0x0001b251 T kv_init +0x0001b2a1 T kv_put +0x0001b319 T kv_remove +0x0001b355 T kv_remove_all +0x0001b419 T kv_value_append +0x0001b47d T kv_value_modified +0x0001b481 T kv_value_trunc +0x0001b4d1 T kv_visit +0x0001b545 T l2cap_can_send_fixed_channel_packet_now +0x0001b89d T l2cap_init +0x0001b8e1 T l2cap_max_le_mtu +0x0001b965 T l2cap_register_fixed_channel +0x0001b981 T l2cap_request_can_send_fix_channel_now_event +0x0001bb29 T l2cap_send_connectionless +0x0001bbb9 T l2cap_send_connectionless3 +0x0001bca5 T l2cap_send_signaling_le +0x0001bce1 T le_adv_status_reset +0x0002a639 T mesh_platform_config +0x0002a8c9 T mesh_set_dev_name +0x0002a8d5 T mesh_setup +0x0002d945 T net_buf_add_zeros +0x0002d973 T net_buf_get +0x0002d983 T net_buf_put +0x0002d9a1 T net_buf_ref +0x0002d9b1 T net_buf_reserve +0x0002d9c3 T net_buf_simple_add +0x0002d9c7 T net_buf_simple_add_be16 +0x0002d9dd T net_buf_simple_add_be32 +0x0002d9ef T net_buf_simple_add_le16 +0x0002d9fb T net_buf_simple_add_le32 +0x0002da07 T net_buf_simple_add_u8 +0x0002da63 T net_buf_simple_pull +0x0002da6f T net_buf_simple_pull_be16 +0x0002da97 T net_buf_simple_pull_be32 +0x0002dabf T net_buf_simple_pull_le16 +0x0002dae7 T net_buf_simple_pull_le32 +0x0002db0f T net_buf_simple_pull_u8 +0x0002db2f T net_buf_simple_push +0x0002db53 T net_buf_simple_push_be16 +0x0002db87 T net_buf_simple_push_le16 +0x0002dbbb T net_buf_simple_push_u8 +0x0002dc25 T net_buf_slist_get +0x0002dc4d T net_buf_slist_init +0x0002dc55 T net_buf_slist_is_empty +0x0002dc61 T net_buf_slist_merge_slist +0x0002dc7d T net_buf_slist_peek_head +0x0002dc87 T net_buf_slist_peek_next +0x0002dc91 T net_buf_slist_put +0x0002dca1 T net_buf_slist_remove +0x0002dcdb T net_buf_unref +0x0002ed75 T nibble_for_char +0x0002f405 T npl_freertos_callout_init +0x0002f441 T npl_freertos_callout_remaining_ticks +0x0002f459 T npl_freertos_callout_reset +0x0002f4f5 T npl_freertos_eventq_get +0x0002f549 T npl_freertos_eventq_put +0x0002f5a1 T npl_freertos_sem_init +0x0002f5bd T npl_freertos_sem_pend +0x0002f611 T npl_freertos_sem_release +0x0002f661 T npl_freertos_time_ms_to_ticks +0x0002f78f T os_mbuf_adj +0x0002f827 T os_mbuf_append +0x0002f8bf T os_mbuf_appendfrom +0x0002f915 T os_mbuf_cmpf +0x0002f975 T os_mbuf_cmpm +0x0002fa33 T os_mbuf_concat +0x0002fa6f T os_mbuf_copydata +0x0002fac7 T os_mbuf_copyinto +0x0002fb45 T os_mbuf_dup +0x0002fbb5 T os_mbuf_extend +0x0002fc05 T os_mbuf_free +0x0002fc1d T os_mbuf_free_chain +0x0002fc33 T os_mbuf_get +0x0002fc5f T os_mbuf_get_pkthdr +0x0002fc8f T os_mbuf_off +0x0002fcad T os_mbuf_pool_init +0x0002fcb7 T os_mbuf_prepend +0x0002fd39 T os_mbuf_prepend_pullup +0x0002fd51 T os_mbuf_pullup +0x0002fe1d T os_mbuf_trim_front +0x0002ff3d T os_mqueue_get +0x0002ff63 T os_mqueue_init +0x0002ff75 T os_mqueue_put +0x0002ffad T os_msys_count +0x0002ffc9 T os_msys_get +0x0002ffe1 T os_msys_get_pkthdr +0x00030041 T os_msys_num_free +0x0003005d T os_msys_register +0x00030099 T os_msys_reset +0x0003038d T platform_config +0x000303b9 T platform_get_version +0x000303c1 T platform_printf +0x000303d5 T platform_raise_assertion +0x00030465 T platform_set_evt_callback +0x00030479 T platform_set_irq_callback +0x000304bd T platform_set_rf_clk_source +0x000304c9 T platform_set_rf_init_data +0x000304d5 T platform_set_rf_power_mapping +0x000304e1 T platform_shutdown +0x0003149d T printf_hexdump +0x00034611 T pvPortMalloc +0x000346f5 T pvTaskIncrementMutexHeldCount +0x0003470d T pvTimerGetTimerID +0x00034739 T pxPortInitialiseStack +0x00034ead T reverse_128 +0x00034eb3 T reverse_24 +0x00034eb9 T reverse_48 +0x00034ebf T reverse_56 +0x00034ec5 T reverse_64 +0x00034ecb T reverse_bd_addr +0x00034ed1 T reverse_bytes +0x000374bd T settings_bytes_from_str +0x000374cf T settings_str_from_bytes +0x00037665 T sm_add_event_handler +0x000377b1 T sm_address_resolution_lookup +0x0003788b T sm_authenticated +0x000378a1 T sm_authorization_decline +0x000378c1 T sm_authorization_grant +0x000378e1 T sm_authorization_state +0x000378fd T sm_bonding_decline +0x00037df5 T sm_config +0x00037ef5 T sm_encryption_key_size +0x00038861 T sm_just_works_confirm +0x00038b91 T sm_le_device_key +0x00038c81 T sm_passkey_input +0x00039051 T sm_private_random_address_generation_get +0x00039059 T sm_private_random_address_generation_get_mode +0x00039065 T sm_private_random_address_generation_set_mode +0x0003908d T sm_private_random_address_generation_set_update_period +0x000390c5 T sm_register_oob_data_callback +0x000390d1 T sm_request_pairing +0x00039c5d T sm_send_security_request +0x00039c85 T sm_set_accepted_stk_generation_methods +0x00039c91 T sm_set_authentication_requirements +0x00039c9d T sm_set_encryption_key_size_range +0x0003a04d T sscanf_bd_addr +0x0003b429 T sysSetPublicDeviceAddr +0x0003d609 T uuid128_to_str +0x0003d661 T uuid_add_bluetooth_prefix +0x0003d681 T uuid_has_bluetooth_prefix +0x0003d7c9 T vPortFree +0x0003d999 T vQueueWaitForMessageRestricted +0x0003d9e1 T vTaskDelay +0x0003da2d T vTaskInternalSetTimeOutState +0x0003da3d T vTaskMissedYield +0x0003da49 T vTaskPlaceOnEventList +0x0003da81 T vTaskPlaceOnEventListRestricted +0x0003dac1 T vTaskPriorityDisinheritAfterTimeout +0x0003db6d T vTaskStartScheduler +0x0003dbf9 T vTaskStepTick +0x0003dc29 T vTaskSuspendAll +0x0003dc39 T vTaskSwitchContext +0x0003e0bd T xPortStartScheduler +0x0003e179 T xQueueCreateCountingSemaphore +0x0003e1b5 T xQueueGenericCreate +0x0003e201 T xQueueGenericCreateStatic +0x0003e269 T xQueueGenericReset +0x0003e2f5 T xQueueGenericSend +0x0003e45d T xQueueGenericSendFromISR +0x0003e51d T xQueueGiveFromISR +0x0003e5c1 T xQueueIsQueueEmptyFromISR +0x0003e5e5 T xQueueReceive +0x0003e711 T xQueueReceiveFromISR +0x0003e7a5 T xQueueSemaphoreTake +0x0003e90d T xTaskCheckForTimeOut +0x0003e97d T xTaskCreate +0x0003e9d9 T xTaskCreateStatic +0x0003ea49 T xTaskGetSchedulerState +0x0003ea65 T xTaskGetTickCount +0x0003ea71 T xTaskGetTickCountFromISR +0x0003ea81 T xTaskIncrementTick +0x0003eb4d T xTaskPriorityDisinherit +0x0003ebe1 T xTaskPriorityInherit +0x0003ec75 T xTaskRemoveFromEventList +0x0003ecf5 T xTaskResumeAll +0x0003edbd T xTimerCreate +0x0003edf1 T xTimerCreateTimerTask +0x0003ee5d T xTimerGenericCommand +0x0003eecd T xTimerGetExpiryTime diff --git a/bundles/mesh/symdefs.s b/bundles/mesh/symdefs.s index 237055eec..7d960eaf7 100644 --- a/bundles/mesh/symdefs.s +++ b/bundles/mesh/symdefs.s @@ -23,307 +23,304 @@ --defsym:big_endian_read_32=0x00008339 --defsym:big_endian_store_16=0x0000834d --defsym:big_endian_store_32=0x00008359 ---defsym:ble_gatts_find_chr=0x00008a85 ---defsym:ble_gatts_find_svc=0x00008b1d ---defsym:bt_dh_key_gen=0x00008e6d ---defsym:bt_encrypt_be=0x00008e95 ---defsym:bt_hex=0x00008ebd ---defsym:bt_le_adv_start=0x00008f1d ---defsym:bt_le_adv_stop=0x00009045 ---defsym:bt_mesh_init=0x0000b7a9 ---defsym:bt_mesh_input_number=0x0000b809 ---defsym:bt_mesh_input_string=0x0000b87d ---defsym:bt_mesh_is_provisioned=0x0000b8f9 ---defsym:bt_mesh_model_elem=0x0000bdb9 ---defsym:bt_mesh_model_msg_init=0x0000bf8d ---defsym:bt_mesh_model_publish=0x0000c025 ---defsym:bt_mesh_model_send=0x0000c469 ---defsym:bt_mesh_prov_disable=0x0000e611 ---defsym:bt_mesh_prov_enable=0x0000e649 ---defsym:bt_mesh_provision=0x0000e805 ---defsym:bt_mesh_reset=0x0000efc9 ---defsym:bt_pub_key_gen=0x0000fa5d ---defsym:bt_pub_key_get=0x0000fa8d ---defsym:bt_rand=0x0000faa1 ---defsym:btstack_push_user_msg=0x0000fd1d ---defsym:char_for_nibble=0x000102c7 ---defsym:eTaskConfirmSleepModeStatus=0x00011765 ---defsym:gap_add_dev_to_periodic_list=0x00013ac1 ---defsym:gap_add_whitelist=0x00013ad9 ---defsym:gap_aes_encrypt=0x00013aed ---defsym:gap_clr_adv_set=0x00013b15 ---defsym:gap_clr_periodic_adv_list=0x00013b25 ---defsym:gap_create_connection_cancel=0x00013b51 ---defsym:gap_disconnect=0x00013b61 ---defsym:gap_ext_create_connection=0x00013bf5 ---defsym:gap_get_connection_parameter_range=0x00013cb9 ---defsym:gap_periodic_adv_create_sync=0x00013d51 ---defsym:gap_periodic_adv_create_sync_cancel=0x00013d75 ---defsym:gap_periodic_adv_term_sync=0x00013d85 ---defsym:gap_read_periodic_adv_list_size=0x00013e91 ---defsym:gap_read_phy=0x00013ea1 ---defsym:gap_remove_whitelist=0x00013eb5 ---defsym:gap_rmv_adv_set=0x00013f41 ---defsym:gap_rmv_dev_from_periodic_list=0x00013f55 ---defsym:gap_set_adv_set_random_addr=0x00013f95 ---defsym:gap_set_connection_parameter_range=0x00013fe1 ---defsym:gap_set_def_phy=0x00013ff9 ---defsym:gap_set_ext_adv_data=0x00014011 ---defsym:gap_set_ext_adv_enable=0x00014029 ---defsym:gap_set_ext_adv_para=0x000140a5 ---defsym:gap_set_ext_scan_enable=0x00014171 ---defsym:gap_set_ext_scan_para=0x00014189 ---defsym:gap_set_ext_scan_response_data=0x00014231 ---defsym:gap_set_host_channel_classification=0x00014249 ---defsym:gap_set_periodic_adv_data=0x0001425d ---defsym:gap_set_periodic_adv_enable=0x000142d1 ---defsym:gap_set_periodic_adv_para=0x000142e5 ---defsym:gap_set_phy=0x000142fd ---defsym:gap_set_random_device_address=0x00014319 ---defsym:gap_start_ccm=0x0001437d ---defsym:gap_update_connection_parameters=0x000143b1 ---defsym:gatt_client_cancel_write=0x00014869 ---defsym:gatt_client_deserialize_characteristic=0x0001488f ---defsym:gatt_client_deserialize_characteristic_descriptor=0x000148c7 ---defsym:gatt_client_deserialize_service=0x000148d5 ---defsym:gatt_client_discover_characteristic_descriptors=0x00014901 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00014943 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00014993 ---defsym:gatt_client_discover_characteristics_for_service=0x000149e3 ---defsym:gatt_client_discover_characteristics_for_service_by_uuid128=0x00014a1b ---defsym:gatt_client_discover_characteristics_for_service_by_uuid16=0x00014a29 ---defsym:gatt_client_discover_primary_services=0x00014a37 ---defsym:gatt_client_discover_primary_services_by_uuid128=0x00014a69 ---defsym:gatt_client_discover_primary_services_by_uuid16=0x00014aad ---defsym:gatt_client_execute_write=0x00014ae9 ---defsym:gatt_client_find_included_services_for_service=0x00014b0f ---defsym:gatt_client_get_mtu=0x00014b3f ---defsym:gatt_client_is_ready=0x00014be9 ---defsym:gatt_client_listen_for_characteristic_value_updates=0x00014bff ---defsym:gatt_client_prepare_write=0x00014c25 ---defsym:gatt_client_pts_suppress_mtu_exchange=0x00014c61 ---defsym:gatt_client_read_characteristic_descriptor=0x00014c6d ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00014c73 ---defsym:gatt_client_read_long_characteristic_descriptor=0x00014c9d ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00014ca5 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00014cab ---defsym:gatt_client_read_long_value_of_characteristic=0x00014cd9 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00014ce1 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00014ce7 ---defsym:gatt_client_read_multiple_characteristic_values=0x00014d15 ---defsym:gatt_client_read_value_of_characteristic=0x00014d45 ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00014d4b ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00014d79 ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00014dc5 ---defsym:gatt_client_register_handler=0x00014e11 ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00014e1d ---defsym:gatt_client_signed_write_without_response=0x00015249 ---defsym:gatt_client_write_characteristic_descriptor=0x0001530d ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0001531b ---defsym:gatt_client_write_client_characteristic_configuration=0x00015355 ---defsym:gatt_client_write_long_characteristic_descriptor=0x000153a7 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000153b9 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000153c9 ---defsym:gatt_client_write_long_value_of_characteristic=0x00015405 ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00015415 ---defsym:gatt_client_write_value_of_characteristic=0x00015451 ---defsym:gatt_client_write_value_of_characteristic_without_response=0x00015487 ---defsym:hci_add_event_handler=0x00018f89 ---defsym:hci_power_control=0x000197c5 ---defsym:hci_register_acl_packet_handler=0x000199c5 ---defsym:k_delayed_work_add_arg=0x0001ae91 ---defsym:k_delayed_work_cancel=0x0001ae95 ---defsym:k_delayed_work_init=0x0001aeab ---defsym:k_delayed_work_remaining_get=0x0001aec5 ---defsym:k_delayed_work_submit=0x0001aeeb ---defsym:k_fifo_is_empty=0x0001af07 ---defsym:k_sleep=0x0001af2f ---defsym:k_uptime_get=0x0001af3d ---defsym:k_uptime_get_32=0x0001af51 ---defsym:k_work_add_arg=0x0001af63 ---defsym:k_work_init=0x0001af67 ---defsym:k_work_submit=0x0001af81 ---defsym:kv_commit=0x0001b221 ---defsym:kv_get=0x0001b27d ---defsym:kv_init=0x0001b295 ---defsym:kv_put=0x0001b2e5 ---defsym:kv_remove=0x0001b35d ---defsym:kv_remove_all=0x0001b399 ---defsym:kv_value_append=0x0001b45d ---defsym:kv_value_modified=0x0001b4c1 ---defsym:kv_value_trunc=0x0001b4c5 ---defsym:kv_visit=0x0001b515 ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0001b589 ---defsym:l2cap_init=0x0001b8e1 ---defsym:l2cap_max_le_mtu=0x0001b925 ---defsym:l2cap_register_fixed_channel=0x0001b9a9 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0001b9c5 ---defsym:l2cap_send_connectionless=0x0001bb6d ---defsym:l2cap_send_connectionless3=0x0001bbfd ---defsym:l2cap_send_signaling_le=0x0001bce9 ---defsym:le_adv_status_reset=0x0001bd25 ---defsym:mesh_platform_config=0x0002a695 ---defsym:mesh_set_dev_name=0x0002a925 ---defsym:mesh_setup=0x0002a931 ---defsym:net_buf_add_zeros=0x0002d99d ---defsym:net_buf_get=0x0002d9cb ---defsym:net_buf_put=0x0002d9db ---defsym:net_buf_ref=0x0002d9f9 ---defsym:net_buf_reserve=0x0002da09 ---defsym:net_buf_simple_add=0x0002da1b ---defsym:net_buf_simple_add_be16=0x0002da1f ---defsym:net_buf_simple_add_be32=0x0002da35 ---defsym:net_buf_simple_add_le16=0x0002da47 ---defsym:net_buf_simple_add_le32=0x0002da53 ---defsym:net_buf_simple_add_u8=0x0002da5f ---defsym:net_buf_simple_pull=0x0002dabb ---defsym:net_buf_simple_pull_be16=0x0002dac7 ---defsym:net_buf_simple_pull_be32=0x0002daef ---defsym:net_buf_simple_pull_le16=0x0002db17 ---defsym:net_buf_simple_pull_le32=0x0002db3f ---defsym:net_buf_simple_pull_u8=0x0002db67 ---defsym:net_buf_simple_push=0x0002db87 ---defsym:net_buf_simple_push_be16=0x0002dbab ---defsym:net_buf_simple_push_le16=0x0002dbdf ---defsym:net_buf_simple_push_u8=0x0002dc13 ---defsym:net_buf_slist_get=0x0002dc7d ---defsym:net_buf_slist_init=0x0002dca5 ---defsym:net_buf_slist_is_empty=0x0002dcad ---defsym:net_buf_slist_merge_slist=0x0002dcb9 ---defsym:net_buf_slist_peek_head=0x0002dcd5 ---defsym:net_buf_slist_peek_next=0x0002dcdf ---defsym:net_buf_slist_put=0x0002dce9 ---defsym:net_buf_slist_remove=0x0002dcf9 ---defsym:net_buf_unref=0x0002dd33 ---defsym:nibble_for_char=0x0002edcd ---defsym:npl_freertos_callout_init=0x0002f45d ---defsym:npl_freertos_callout_remaining_ticks=0x0002f499 ---defsym:npl_freertos_callout_reset=0x0002f4b1 ---defsym:npl_freertos_eventq_get=0x0002f54d ---defsym:npl_freertos_eventq_put=0x0002f5a1 ---defsym:npl_freertos_sem_init=0x0002f5f9 ---defsym:npl_freertos_sem_pend=0x0002f615 ---defsym:npl_freertos_sem_release=0x0002f669 ---defsym:npl_freertos_time_ms_to_ticks=0x0002f6b9 ---defsym:os_mbuf_adj=0x0002f7e7 ---defsym:os_mbuf_append=0x0002f87f ---defsym:os_mbuf_appendfrom=0x0002f917 ---defsym:os_mbuf_cmpf=0x0002f96d ---defsym:os_mbuf_cmpm=0x0002f9cd ---defsym:os_mbuf_concat=0x0002fa8b ---defsym:os_mbuf_copydata=0x0002fac7 ---defsym:os_mbuf_copyinto=0x0002fb1f ---defsym:os_mbuf_dup=0x0002fb9d ---defsym:os_mbuf_extend=0x0002fc0d ---defsym:os_mbuf_free=0x0002fc5d ---defsym:os_mbuf_free_chain=0x0002fc75 ---defsym:os_mbuf_get=0x0002fc8b ---defsym:os_mbuf_get_pkthdr=0x0002fcb7 ---defsym:os_mbuf_off=0x0002fce7 ---defsym:os_mbuf_pool_init=0x0002fd05 ---defsym:os_mbuf_prepend=0x0002fd0f ---defsym:os_mbuf_prepend_pullup=0x0002fd91 ---defsym:os_mbuf_pullup=0x0002fda9 ---defsym:os_mbuf_trim_front=0x0002fe75 ---defsym:os_mqueue_get=0x0002ff95 ---defsym:os_mqueue_init=0x0002ffbb ---defsym:os_mqueue_put=0x0002ffcd ---defsym:os_msys_count=0x00030005 ---defsym:os_msys_get=0x00030021 ---defsym:os_msys_get_pkthdr=0x00030039 ---defsym:os_msys_num_free=0x00030099 ---defsym:os_msys_register=0x000300b5 ---defsym:os_msys_reset=0x000300f1 ---defsym:platform_config=0x000303e5 ---defsym:platform_get_heap_status=0x00030411 ---defsym:platform_get_version=0x00030429 ---defsym:platform_printf=0x00030431 ---defsym:platform_raise_assertion=0x00030445 ---defsym:platform_reset=0x00030459 ---defsym:platform_set_evt_callback=0x0003048d ---defsym:platform_set_irq_callback=0x000304a1 ---defsym:platform_set_rf_clk_source=0x000304d9 ---defsym:platform_set_rf_init_data=0x000304e5 ---defsym:platform_set_rf_power_mapping=0x000304f1 ---defsym:platform_shutdown=0x000304fd ---defsym:platform_switch_app=0x00030501 ---defsym:printf_hexdump=0x000314c9 ---defsym:pvPortMalloc=0x00034699 ---defsym:pvTaskIncrementMutexHeldCount=0x0003477d ---defsym:pvTimerGetTimerID=0x00034795 ---defsym:pxPortInitialiseStack=0x000347c1 ---defsym:reverse_128=0x00034f35 ---defsym:reverse_24=0x00034f3b ---defsym:reverse_48=0x00034f41 ---defsym:reverse_56=0x00034f47 ---defsym:reverse_64=0x00034f4d ---defsym:reverse_bd_addr=0x00034f53 ---defsym:reverse_bytes=0x00034f59 ---defsym:settings_bytes_from_str=0x00037545 ---defsym:settings_str_from_bytes=0x00037557 ---defsym:sm_add_event_handler=0x000376ed ---defsym:sm_address_resolution_lookup=0x00037839 ---defsym:sm_authenticated=0x00037913 ---defsym:sm_authorization_decline=0x00037929 ---defsym:sm_authorization_grant=0x00037949 ---defsym:sm_authorization_state=0x00037969 ---defsym:sm_bonding_decline=0x00037985 ---defsym:sm_config=0x00037e7d ---defsym:sm_encryption_key_size=0x00037f7d ---defsym:sm_just_works_confirm=0x000388e9 ---defsym:sm_le_device_key=0x00038c19 ---defsym:sm_passkey_input=0x00038d09 ---defsym:sm_private_random_address_generation_get=0x000390d9 ---defsym:sm_private_random_address_generation_get_mode=0x000390e1 ---defsym:sm_private_random_address_generation_set_mode=0x000390ed ---defsym:sm_private_random_address_generation_set_update_period=0x00039115 ---defsym:sm_register_oob_data_callback=0x0003914d ---defsym:sm_request_pairing=0x00039159 ---defsym:sm_send_security_request=0x00039ce5 ---defsym:sm_set_accepted_stk_generation_methods=0x00039d0d ---defsym:sm_set_authentication_requirements=0x00039d19 ---defsym:sm_set_encryption_key_size_range=0x00039d25 ---defsym:sscanf_bd_addr=0x0003a0d5 ---defsym:sysSetPublicDeviceAddr=0x0003b4b1 ---defsym:uuid128_to_str=0x0003d691 ---defsym:uuid_add_bluetooth_prefix=0x0003d6e9 ---defsym:uuid_has_bluetooth_prefix=0x0003d709 ---defsym:vPortFree=0x0003d851 ---defsym:vQueueWaitForMessageRestricted=0x0003da21 ---defsym:vTaskDelay=0x0003da69 ---defsym:vTaskInternalSetTimeOutState=0x0003dab5 ---defsym:vTaskMissedYield=0x0003dac5 ---defsym:vTaskPlaceOnEventList=0x0003dad1 ---defsym:vTaskPlaceOnEventListRestricted=0x0003db09 ---defsym:vTaskPriorityDisinheritAfterTimeout=0x0003db49 ---defsym:vTaskStartScheduler=0x0003dbf5 ---defsym:vTaskStepTick=0x0003dc81 ---defsym:vTaskSuspendAll=0x0003dcb1 ---defsym:vTaskSwitchContext=0x0003dcc1 ---defsym:xPortStartScheduler=0x0003e145 ---defsym:xQueueCreateCountingSemaphore=0x0003e201 ---defsym:xQueueGenericCreate=0x0003e23d ---defsym:xQueueGenericCreateStatic=0x0003e289 ---defsym:xQueueGenericReset=0x0003e2f1 ---defsym:xQueueGenericSend=0x0003e37d ---defsym:xQueueGenericSendFromISR=0x0003e4e5 ---defsym:xQueueGiveFromISR=0x0003e5a5 ---defsym:xQueueIsQueueEmptyFromISR=0x0003e649 ---defsym:xQueueReceive=0x0003e66d ---defsym:xQueueReceiveFromISR=0x0003e799 ---defsym:xQueueSemaphoreTake=0x0003e82d ---defsym:xTaskCheckForTimeOut=0x0003e995 ---defsym:xTaskCreate=0x0003ea05 ---defsym:xTaskCreateStatic=0x0003ea61 ---defsym:xTaskGetSchedulerState=0x0003ead1 ---defsym:xTaskGetTickCount=0x0003eaed ---defsym:xTaskGetTickCountFromISR=0x0003eaf9 ---defsym:xTaskIncrementTick=0x0003eb09 ---defsym:xTaskPriorityDisinherit=0x0003ebd5 ---defsym:xTaskPriorityInherit=0x0003ec69 ---defsym:xTaskRemoveFromEventList=0x0003ecfd ---defsym:xTaskResumeAll=0x0003ed7d ---defsym:xTimerCreate=0x0003ee45 ---defsym:xTimerCreateTimerTask=0x0003ee79 ---defsym:xTimerGenericCommand=0x0003eee5 ---defsym:xTimerGetExpiryTime=0x0003ef55 +--defsym:ble_gatts_find_chr=0x00008a99 +--defsym:ble_gatts_find_svc=0x00008b31 +--defsym:bt_dh_key_gen=0x00008e81 +--defsym:bt_encrypt_be=0x00008ea9 +--defsym:bt_hex=0x00008ed1 +--defsym:bt_le_adv_start=0x00008f31 +--defsym:bt_le_adv_stop=0x00009059 +--defsym:bt_mesh_init=0x0000b7bd +--defsym:bt_mesh_input_number=0x0000b81d +--defsym:bt_mesh_input_string=0x0000b891 +--defsym:bt_mesh_is_provisioned=0x0000b90d +--defsym:bt_mesh_model_elem=0x0000bdcd +--defsym:bt_mesh_model_msg_init=0x0000bfa1 +--defsym:bt_mesh_model_publish=0x0000c039 +--defsym:bt_mesh_model_send=0x0000c47d +--defsym:bt_mesh_prov_disable=0x0000e625 +--defsym:bt_mesh_prov_enable=0x0000e65d +--defsym:bt_mesh_provision=0x0000e819 +--defsym:bt_mesh_reset=0x0000efdd +--defsym:bt_pub_key_gen=0x0000fa71 +--defsym:bt_pub_key_get=0x0000faa1 +--defsym:bt_rand=0x0000fab5 +--defsym:btstack_push_user_msg=0x0000fd31 +--defsym:char_for_nibble=0x000102db +--defsym:eTaskConfirmSleepModeStatus=0x00011779 +--defsym:gap_add_dev_to_periodic_list=0x00013ad5 +--defsym:gap_add_whitelist=0x00013aed +--defsym:gap_aes_encrypt=0x00013b01 +--defsym:gap_clr_adv_set=0x00013b29 +--defsym:gap_clr_periodic_adv_list=0x00013b39 +--defsym:gap_create_connection_cancel=0x00013b65 +--defsym:gap_disconnect=0x00013b75 +--defsym:gap_ext_create_connection=0x00013c09 +--defsym:gap_get_connection_parameter_range=0x00013ccd +--defsym:gap_periodic_adv_create_sync=0x00013d65 +--defsym:gap_periodic_adv_create_sync_cancel=0x00013d89 +--defsym:gap_periodic_adv_term_sync=0x00013d99 +--defsym:gap_read_periodic_adv_list_size=0x00013ea5 +--defsym:gap_read_phy=0x00013eb5 +--defsym:gap_remove_whitelist=0x00013ec9 +--defsym:gap_rmv_adv_set=0x00013f55 +--defsym:gap_rmv_dev_from_periodic_list=0x00013f69 +--defsym:gap_set_adv_set_random_addr=0x00013fa9 +--defsym:gap_set_connection_parameter_range=0x00013ff5 +--defsym:gap_set_def_phy=0x0001400d +--defsym:gap_set_ext_adv_data=0x00014025 +--defsym:gap_set_ext_adv_enable=0x0001403d +--defsym:gap_set_ext_adv_para=0x000140b9 +--defsym:gap_set_ext_scan_enable=0x00014185 +--defsym:gap_set_ext_scan_para=0x0001419d +--defsym:gap_set_ext_scan_response_data=0x00014245 +--defsym:gap_set_host_channel_classification=0x0001425d +--defsym:gap_set_periodic_adv_data=0x00014271 +--defsym:gap_set_periodic_adv_enable=0x000142e5 +--defsym:gap_set_periodic_adv_para=0x000142f9 +--defsym:gap_set_phy=0x00014311 +--defsym:gap_set_random_device_address=0x0001432d +--defsym:gap_start_ccm=0x00014391 +--defsym:gap_update_connection_parameters=0x000143c5 +--defsym:gatt_client_cancel_write=0x0001487d +--defsym:gatt_client_deserialize_characteristic=0x000148a3 +--defsym:gatt_client_deserialize_characteristic_descriptor=0x000148db +--defsym:gatt_client_deserialize_service=0x000148e9 +--defsym:gatt_client_discover_characteristic_descriptors=0x00014915 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00014957 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x000149a7 +--defsym:gatt_client_discover_characteristics_for_service=0x000149f7 +--defsym:gatt_client_discover_characteristics_for_service_by_uuid128=0x00014a2f +--defsym:gatt_client_discover_characteristics_for_service_by_uuid16=0x00014a3d +--defsym:gatt_client_discover_primary_services=0x00014a4b +--defsym:gatt_client_discover_primary_services_by_uuid128=0x00014a7d +--defsym:gatt_client_discover_primary_services_by_uuid16=0x00014ac1 +--defsym:gatt_client_execute_write=0x00014afd +--defsym:gatt_client_find_included_services_for_service=0x00014b23 +--defsym:gatt_client_get_mtu=0x00014b53 +--defsym:gatt_client_is_ready=0x00014bfd +--defsym:gatt_client_listen_for_characteristic_value_updates=0x00014c13 +--defsym:gatt_client_prepare_write=0x00014c39 +--defsym:gatt_client_pts_suppress_mtu_exchange=0x00014c75 +--defsym:gatt_client_read_characteristic_descriptor=0x00014c81 +--defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00014c87 +--defsym:gatt_client_read_long_characteristic_descriptor=0x00014cb1 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00014cb9 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00014cbf +--defsym:gatt_client_read_long_value_of_characteristic=0x00014ced +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00014cf5 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00014cfb +--defsym:gatt_client_read_multiple_characteristic_values=0x00014d29 +--defsym:gatt_client_read_value_of_characteristic=0x00014d59 +--defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00014d5f +--defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00014d8d +--defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00014dd9 +--defsym:gatt_client_register_handler=0x00014e25 +--defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00014e31 +--defsym:gatt_client_signed_write_without_response=0x0001525d +--defsym:gatt_client_write_characteristic_descriptor=0x00015321 +--defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0001532f +--defsym:gatt_client_write_client_characteristic_configuration=0x00015369 +--defsym:gatt_client_write_long_characteristic_descriptor=0x000153bb +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000153cd +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000153dd +--defsym:gatt_client_write_long_value_of_characteristic=0x00015419 +--defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00015429 +--defsym:gatt_client_write_value_of_characteristic=0x00015465 +--defsym:gatt_client_write_value_of_characteristic_without_response=0x0001549b +--defsym:hci_add_event_handler=0x00018f9d +--defsym:hci_power_control=0x000197d9 +--defsym:hci_register_acl_packet_handler=0x000199d9 +--defsym:k_delayed_work_add_arg=0x0001ae4d +--defsym:k_delayed_work_cancel=0x0001ae51 +--defsym:k_delayed_work_init=0x0001ae67 +--defsym:k_delayed_work_remaining_get=0x0001ae81 +--defsym:k_delayed_work_submit=0x0001aea7 +--defsym:k_fifo_is_empty=0x0001aec3 +--defsym:k_sleep=0x0001aeeb +--defsym:k_uptime_get=0x0001aef9 +--defsym:k_uptime_get_32=0x0001af0d +--defsym:k_work_add_arg=0x0001af1f +--defsym:k_work_init=0x0001af23 +--defsym:k_work_submit=0x0001af3d +--defsym:kv_commit=0x0001b1dd +--defsym:kv_get=0x0001b239 +--defsym:kv_init=0x0001b251 +--defsym:kv_put=0x0001b2a1 +--defsym:kv_remove=0x0001b319 +--defsym:kv_remove_all=0x0001b355 +--defsym:kv_value_append=0x0001b419 +--defsym:kv_value_modified=0x0001b47d +--defsym:kv_value_trunc=0x0001b481 +--defsym:kv_visit=0x0001b4d1 +--defsym:l2cap_can_send_fixed_channel_packet_now=0x0001b545 +--defsym:l2cap_init=0x0001b89d +--defsym:l2cap_max_le_mtu=0x0001b8e1 +--defsym:l2cap_register_fixed_channel=0x0001b965 +--defsym:l2cap_request_can_send_fix_channel_now_event=0x0001b981 +--defsym:l2cap_send_connectionless=0x0001bb29 +--defsym:l2cap_send_connectionless3=0x0001bbb9 +--defsym:l2cap_send_signaling_le=0x0001bca5 +--defsym:le_adv_status_reset=0x0001bce1 +--defsym:mesh_platform_config=0x0002a639 +--defsym:mesh_set_dev_name=0x0002a8c9 +--defsym:mesh_setup=0x0002a8d5 +--defsym:net_buf_add_zeros=0x0002d945 +--defsym:net_buf_get=0x0002d973 +--defsym:net_buf_put=0x0002d983 +--defsym:net_buf_ref=0x0002d9a1 +--defsym:net_buf_reserve=0x0002d9b1 +--defsym:net_buf_simple_add=0x0002d9c3 +--defsym:net_buf_simple_add_be16=0x0002d9c7 +--defsym:net_buf_simple_add_be32=0x0002d9dd +--defsym:net_buf_simple_add_le16=0x0002d9ef +--defsym:net_buf_simple_add_le32=0x0002d9fb +--defsym:net_buf_simple_add_u8=0x0002da07 +--defsym:net_buf_simple_pull=0x0002da63 +--defsym:net_buf_simple_pull_be16=0x0002da6f +--defsym:net_buf_simple_pull_be32=0x0002da97 +--defsym:net_buf_simple_pull_le16=0x0002dabf +--defsym:net_buf_simple_pull_le32=0x0002dae7 +--defsym:net_buf_simple_pull_u8=0x0002db0f +--defsym:net_buf_simple_push=0x0002db2f +--defsym:net_buf_simple_push_be16=0x0002db53 +--defsym:net_buf_simple_push_le16=0x0002db87 +--defsym:net_buf_simple_push_u8=0x0002dbbb +--defsym:net_buf_slist_get=0x0002dc25 +--defsym:net_buf_slist_init=0x0002dc4d +--defsym:net_buf_slist_is_empty=0x0002dc55 +--defsym:net_buf_slist_merge_slist=0x0002dc61 +--defsym:net_buf_slist_peek_head=0x0002dc7d +--defsym:net_buf_slist_peek_next=0x0002dc87 +--defsym:net_buf_slist_put=0x0002dc91 +--defsym:net_buf_slist_remove=0x0002dca1 +--defsym:net_buf_unref=0x0002dcdb +--defsym:nibble_for_char=0x0002ed75 +--defsym:npl_freertos_callout_init=0x0002f405 +--defsym:npl_freertos_callout_remaining_ticks=0x0002f441 +--defsym:npl_freertos_callout_reset=0x0002f459 +--defsym:npl_freertos_eventq_get=0x0002f4f5 +--defsym:npl_freertos_eventq_put=0x0002f549 +--defsym:npl_freertos_sem_init=0x0002f5a1 +--defsym:npl_freertos_sem_pend=0x0002f5bd +--defsym:npl_freertos_sem_release=0x0002f611 +--defsym:npl_freertos_time_ms_to_ticks=0x0002f661 +--defsym:os_mbuf_adj=0x0002f78f +--defsym:os_mbuf_append=0x0002f827 +--defsym:os_mbuf_appendfrom=0x0002f8bf +--defsym:os_mbuf_cmpf=0x0002f915 +--defsym:os_mbuf_cmpm=0x0002f975 +--defsym:os_mbuf_concat=0x0002fa33 +--defsym:os_mbuf_copydata=0x0002fa6f +--defsym:os_mbuf_copyinto=0x0002fac7 +--defsym:os_mbuf_dup=0x0002fb45 +--defsym:os_mbuf_extend=0x0002fbb5 +--defsym:os_mbuf_free=0x0002fc05 +--defsym:os_mbuf_free_chain=0x0002fc1d +--defsym:os_mbuf_get=0x0002fc33 +--defsym:os_mbuf_get_pkthdr=0x0002fc5f +--defsym:os_mbuf_off=0x0002fc8f +--defsym:os_mbuf_pool_init=0x0002fcad +--defsym:os_mbuf_prepend=0x0002fcb7 +--defsym:os_mbuf_prepend_pullup=0x0002fd39 +--defsym:os_mbuf_pullup=0x0002fd51 +--defsym:os_mbuf_trim_front=0x0002fe1d +--defsym:os_mqueue_get=0x0002ff3d +--defsym:os_mqueue_init=0x0002ff63 +--defsym:os_mqueue_put=0x0002ff75 +--defsym:os_msys_count=0x0002ffad +--defsym:os_msys_get=0x0002ffc9 +--defsym:os_msys_get_pkthdr=0x0002ffe1 +--defsym:os_msys_num_free=0x00030041 +--defsym:os_msys_register=0x0003005d +--defsym:os_msys_reset=0x00030099 +--defsym:platform_config=0x0003038d +--defsym:platform_get_version=0x000303b9 +--defsym:platform_printf=0x000303c1 +--defsym:platform_raise_assertion=0x000303d5 +--defsym:platform_set_evt_callback=0x00030465 +--defsym:platform_set_irq_callback=0x00030479 +--defsym:platform_set_rf_clk_source=0x000304bd +--defsym:platform_set_rf_init_data=0x000304c9 +--defsym:platform_set_rf_power_mapping=0x000304d5 +--defsym:platform_shutdown=0x000304e1 +--defsym:printf_hexdump=0x0003149d +--defsym:pvPortMalloc=0x00034611 +--defsym:pvTaskIncrementMutexHeldCount=0x000346f5 +--defsym:pvTimerGetTimerID=0x0003470d +--defsym:pxPortInitialiseStack=0x00034739 +--defsym:reverse_128=0x00034ead +--defsym:reverse_24=0x00034eb3 +--defsym:reverse_48=0x00034eb9 +--defsym:reverse_56=0x00034ebf +--defsym:reverse_64=0x00034ec5 +--defsym:reverse_bd_addr=0x00034ecb +--defsym:reverse_bytes=0x00034ed1 +--defsym:settings_bytes_from_str=0x000374bd +--defsym:settings_str_from_bytes=0x000374cf +--defsym:sm_add_event_handler=0x00037665 +--defsym:sm_address_resolution_lookup=0x000377b1 +--defsym:sm_authenticated=0x0003788b +--defsym:sm_authorization_decline=0x000378a1 +--defsym:sm_authorization_grant=0x000378c1 +--defsym:sm_authorization_state=0x000378e1 +--defsym:sm_bonding_decline=0x000378fd +--defsym:sm_config=0x00037df5 +--defsym:sm_encryption_key_size=0x00037ef5 +--defsym:sm_just_works_confirm=0x00038861 +--defsym:sm_le_device_key=0x00038b91 +--defsym:sm_passkey_input=0x00038c81 +--defsym:sm_private_random_address_generation_get=0x00039051 +--defsym:sm_private_random_address_generation_get_mode=0x00039059 +--defsym:sm_private_random_address_generation_set_mode=0x00039065 +--defsym:sm_private_random_address_generation_set_update_period=0x0003908d +--defsym:sm_register_oob_data_callback=0x000390c5 +--defsym:sm_request_pairing=0x000390d1 +--defsym:sm_send_security_request=0x00039c5d +--defsym:sm_set_accepted_stk_generation_methods=0x00039c85 +--defsym:sm_set_authentication_requirements=0x00039c91 +--defsym:sm_set_encryption_key_size_range=0x00039c9d +--defsym:sscanf_bd_addr=0x0003a04d +--defsym:sysSetPublicDeviceAddr=0x0003b429 +--defsym:uuid128_to_str=0x0003d609 +--defsym:uuid_add_bluetooth_prefix=0x0003d661 +--defsym:uuid_has_bluetooth_prefix=0x0003d681 +--defsym:vPortFree=0x0003d7c9 +--defsym:vQueueWaitForMessageRestricted=0x0003d999 +--defsym:vTaskDelay=0x0003d9e1 +--defsym:vTaskInternalSetTimeOutState=0x0003da2d +--defsym:vTaskMissedYield=0x0003da3d +--defsym:vTaskPlaceOnEventList=0x0003da49 +--defsym:vTaskPlaceOnEventListRestricted=0x0003da81 +--defsym:vTaskPriorityDisinheritAfterTimeout=0x0003dac1 +--defsym:vTaskStartScheduler=0x0003db6d +--defsym:vTaskStepTick=0x0003dbf9 +--defsym:vTaskSuspendAll=0x0003dc29 +--defsym:vTaskSwitchContext=0x0003dc39 +--defsym:xPortStartScheduler=0x0003e0bd +--defsym:xQueueCreateCountingSemaphore=0x0003e179 +--defsym:xQueueGenericCreate=0x0003e1b5 +--defsym:xQueueGenericCreateStatic=0x0003e201 +--defsym:xQueueGenericReset=0x0003e269 +--defsym:xQueueGenericSend=0x0003e2f5 +--defsym:xQueueGenericSendFromISR=0x0003e45d +--defsym:xQueueGiveFromISR=0x0003e51d +--defsym:xQueueIsQueueEmptyFromISR=0x0003e5c1 +--defsym:xQueueReceive=0x0003e5e5 +--defsym:xQueueReceiveFromISR=0x0003e711 +--defsym:xQueueSemaphoreTake=0x0003e7a5 +--defsym:xTaskCheckForTimeOut=0x0003e90d +--defsym:xTaskCreate=0x0003e97d +--defsym:xTaskCreateStatic=0x0003e9d9 +--defsym:xTaskGetSchedulerState=0x0003ea49 +--defsym:xTaskGetTickCount=0x0003ea65 +--defsym:xTaskGetTickCountFromISR=0x0003ea71 +--defsym:xTaskIncrementTick=0x0003ea81 +--defsym:xTaskPriorityDisinherit=0x0003eb4d +--defsym:xTaskPriorityInherit=0x0003ebe1 +--defsym:xTaskRemoveFromEventList=0x0003ec75 +--defsym:xTaskResumeAll=0x0003ecf5 +--defsym:xTimerCreate=0x0003edbd +--defsym:xTimerCreateTimerTask=0x0003edf1 +--defsym:xTimerGenericCommand=0x0003ee5d +--defsym:xTimerGetExpiryTime=0x0003eecd diff --git a/bundles/typical/inc/gap.h b/bundles/typical/inc/gap.h index 08d053c01..c1ece1827 100644 --- a/bundles/typical/inc/gap.h +++ b/bundles/typical/inc/gap.h @@ -48,9 +48,18 @@ void gap_set_random_device_address(const uint8_t *address); * @param handle */ uint8_t gap_disconnect(hci_con_handle_t handle); +void gap_disconnect_all(void); uint8_t gap_add_whitelist(const uint8_t *address,bd_addr_type_t addtype); uint8_t gap_remove_whitelist(const uint8_t *address,bd_addr_type_t addtype); +// uint8_t gap_clear_white_lists(void); +// WARNING: ^^^ this API is not available in this release + + +uint8_t gap_read_rssi(hci_con_handle_t handle); +uint8_t gap_read_remote_used_features(hci_con_handle_t handle); +uint8_t gap_read_remote_info(hci_con_handle_t handle); +uint8_t gap_le_read_channel_map(hci_con_handle_t handle); typedef enum phy_type { @@ -129,7 +138,7 @@ typedef enum scan_filter_policy // Accept all advertising packets except directed advertising packets not // addressed to this device (default). SCAN_ACCEPT_ALL_EXCEPT_NOT_DIRECTED, - // Accept only advertising packets from devices where the advertiser¡¯s + // Accept only advertising packets from devices where the advertiser��s // address is in the White List. Directed advertising packets which are not // addressed to this device shall be ignored SCAN_ACCEPT_WLIST_EXCEPT_NOT_DIRECTED, @@ -293,7 +302,7 @@ typedef enum * identified by the Advertising_Handle parameter. * * @param adv_handle Used to identify an advertising set. Range: 0x00 to 0xEF - * @param cte_len Constant Tone Extension length in 8 ¦Ìs units. Range: 0x02 to 0x14 + * @param cte_len Constant Tone Extension length in 8 ��s units. Range: 0x02 to 0x14 * @param cte_type CTE Type * @param cte_count The number of Constant Tone Extensions to transmit in each periodic * advertising interval. @@ -412,7 +421,7 @@ typedef enum * Requested interval for initiating the Constant Tone Extension Request * procedure in number of connection events. * @param requested_cte_length Minimum length of the Constant Tone Extension being requested in 8 - * ¦Ìs units. Range: 0x02 to 0x14. + * ��s units. Range: 0x02 to 0x14. * @param requested_cte_type Requested CTE type * @return 0: Message is sent out; Other: Message is not sent out * diff --git a/bundles/typical/inc/platform_api.h b/bundles/typical/inc/platform_api.h index ee3f514ee..d6fc07f7c 100644 --- a/bundles/typical/inc/platform_api.h +++ b/bundles/typical/inc/platform_api.h @@ -198,17 +198,16 @@ void platform_config(const platform_cfg_item_t item, const uint8_t flag); /** **************************************************************************************** * @brief Shutdown the whole system, and power on again after a duration - * specified by duration_ms. + * specified by duration_cycles. * Optionally, a portion of SYS memory can be retentioned during shutdown. - * Note that: this function will NOT return except that shutdown procedure fails - * to initiate. * - * @param[in] duration_ms Duration before power on again (in ms) + * @param[in] duration_cycles Duration before power on again (measured in cycles of 32k clock) + * Mininum value: 825 cycles (about 25.18ms) * @param[in] p_retention_data Pointer to the start of data to be retentioned * @param[in] data_size Size of the data to be retentioned **************************************************************************************** */ -void platform_shutdown(const uint32_t duration_ms, const void *p_retention_data, const uint32_t data_size); +void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); /** **************************************************************************************** diff --git a/bundles/typical/meta.json b/bundles/typical/meta.json index dd86a9037..3724ad1da 100644 --- a/bundles/typical/meta.json +++ b/bundles/typical/meta.json @@ -67,8 +67,13 @@ "gatt_client_pts_suppress_mtu_exchange", "gap_set_random_device_address", "gap_disconnect", + "gap_disconnect_all", "gap_add_whitelist", "gap_remove_whitelist", + "gap_read_rssi", + "gap_read_remote_used_features", + "gap_read_remote_info", + "gap_le_read_channel_map", "gap_read_phy", "gap_set_def_phy", "gap_set_phy", @@ -243,11 +248,11 @@ }, "rom": { "base": 16384, - "size": 132208 + "size": 132252 }, "version": [ 0, 14, - 5 + 7 ] } \ No newline at end of file diff --git a/bundles/typical/platform.bin b/bundles/typical/platform.bin index e7b97ed10a34464aa903fecdb83f3a25cd09b251..b2081113cdcf5f71fdd2a7d1c3cb9b30b5bb7f5e 100644 GIT binary patch delta 33657 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 delta 33810 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 + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o central_throughput.bin ./output/central_throughput.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009bb0 + 0x6450 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -452,11 +455,12 @@ + - + @@ -464,4 +468,5 @@ +
diff --git a/examples/central_throughput/src/profile.c b/examples/central_throughput/src/profile.c index 79bcbf3db..fd4b796c2 100644 --- a/examples/central_throughput/src/profile.c +++ b/examples/central_throughput/src/profile.c @@ -3,6 +3,7 @@ #include "platform_api.h" #include "att_db.h" #include "gap.h" +#include "l2cap.h" #include "att_dispatch.h" #include "btstack_util.h" #include "btstack_event.h" @@ -94,6 +95,7 @@ void loopback_rx(const uint8_t *buffer, const uint16_t size) printf("%04d: %.2f\n", loopback_info.counter, duration / 32.768); xTimerStart(app_timer, portMAX_DELAY); loopback_info.counter++; + gap_read_rssi(slave.conn_handle); } } @@ -263,6 +265,8 @@ void send_data(void) #define USER_MSG_SHOW_TPT 5 #define USER_MSG_LOOPBACK 6 #define USER_MSG_LOOPBACK_SEND 7 +#define USER_MSG_SET_PHY 8 +#define USER_MSG_SET_INTERVAL 9 static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) { @@ -335,6 +339,37 @@ static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) case USER_MSG_LOOPBACK_SEND: loopback_send(); break; + case USER_MSG_SET_PHY: + { + uint16_t phy = size; + phy_bittypes_t phy_bit; + phy_option_t phy_opt = HOST_PREFER_S8_CODING; + switch (phy) + { + case 0: + phy_bit = PHY_1M_BIT; + break; + case 1: + phy_bit = PHY_2M_BIT; + break; + case 2: + phy_opt = HOST_PREFER_S2_CODING; // fall through + case 3: + phy_bit = PHY_CODED_BIT; + break; + } + gap_set_phy(slave.conn_handle, 0, phy_bit, phy_bit, phy_opt); + } + break; + case USER_MSG_SET_INTERVAL: + { + uint16_t interval = size; + uint16_t ce_len = (interval << 1) - 2; + gap_update_connection_parameters(slave.conn_handle, interval, interval, + 0, interval > 10 ? interval : 10, // supervisor_timeout = max(100, interval * 8) + ce_len, ce_len); + } + break; default: ; } @@ -354,18 +389,34 @@ uint32_t timer_isr(void *user_data) return 0; } +#define CHECK_STATE() \ + if (INVALID_HANDLE == slave.output_desc.handle) \ + { \ + platform_printf("ERROR: not ready\n"); \ + return; \ + } + void loopback_test(int start1stop0) { + CHECK_STATE(); btstack_push_user_msg(USER_MSG_LOOPBACK, NULL, start1stop0); } +void set_phy(int phy) +{ + CHECK_STATE(); + btstack_push_user_msg(USER_MSG_SET_PHY, NULL, phy); +} + +void set_interval(int interval) +{ + CHECK_STATE(); + btstack_push_user_msg(USER_MSG_SET_INTERVAL, NULL, interval); +} + void start_tpt(tpt_dir_t dir) { - if (INVALID_HANDLE == slave.output_desc.handle) - { - platform_printf("ERROR: not ready\n"); - return; - } + CHECK_STATE(); if (DIR_M_TO_S == dir) btstack_push_user_msg(USER_MSG_START_M2S, NULL, 0); @@ -375,11 +426,7 @@ void start_tpt(tpt_dir_t dir) void stop_tpt(tpt_dir_t dir) { - if (INVALID_HANDLE == slave.output_desc.handle) - { - platform_printf("ERROR: not ready\n"); - return; - } + CHECK_STATE(); if (DIR_M_TO_S == dir) btstack_push_user_msg(USER_MSG_STOP_M2S, NULL, 0); @@ -414,7 +461,7 @@ static initiating_phy_config_t phy_configs[] = .interval_min = 50, .interval_max = 50, .latency = 0, - .supervision_timeout = 200, + .supervision_timeout = 600, .min_ce_len = 90, .max_ce_len = 90 } @@ -424,6 +471,19 @@ static initiating_phy_config_t phy_configs[] = bd_addr_t rand_addr = {0xC0, 0x00, 0x00, 0x11, 0x11, 0x11}; bd_addr_t peer_addr; +#define OGF_STATUS_PARAMETERS 0x05 +#define OPCODE(ogf, ocf) (ocf | ogf << 10) +#define OPCODE_READ_RSSI OPCODE(OGF_STATUS_PARAMETERS, 0x05) + +#pragma pack (push, 1) +typedef struct read_rssi_complete +{ + uint8_t status; + uint16_t handle; + int8_t rssi; +} read_rssi_complete_t; +#pragma pack (pop) + static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) { const le_meta_event_create_conn_complete_t *conn_complete; @@ -476,12 +536,35 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin gap_set_phy(slave.conn_handle, 0, PHY_2M_BIT, PHY_2M_BIT, HOST_NO_PREFERRED_CODING); gatt_client_discover_primary_services_by_uuid128(service_discovery_callback, conn_complete->handle, UUID_TPT); break; + case HCI_SUBEVENT_LE_PHY_UPDATE_COMPLETE: + { + const le_meta_phy_update_complete_t *cmpl = decode_hci_le_meta_event(packet, le_meta_phy_update_complete_t); + platform_printf("PHY updated: Rx %d, Tx %d\n", cmpl->rx_phy, cmpl->tx_phy); + } + break; + case HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE: + { + const le_meta_event_conn_update_complete_t *cmpl = decode_hci_le_meta_event(packet, le_meta_event_conn_update_complete_t); + platform_printf("CONN updated: interval %.2f ms\n", cmpl->interval * 1.25); + } + break; default: break; } break; + case HCI_EVENT_COMMAND_COMPLETE: + { + if (hci_event_command_complete_get_command_opcode(packet) == OPCODE_READ_RSSI) + { + const read_rssi_complete_t *cmpl = + (const read_rssi_complete_t *)hci_event_command_complete_get_return_parameters(packet); + platform_printf("RSSI: %ddBm\n", cmpl->rssi); + } + } + break; + case HCI_EVENT_DISCONNECTION_COMPLETE: reset_info(); gap_set_ext_scan_enable(1, 0, 0, 0); // start continuous scanning diff --git a/examples/central_throughput/src/uart_console.c b/examples/central_throughput/src/uart_console.c index 837223fc3..43832ec04 100644 --- a/examples/central_throughput/src/uart_console.c +++ b/examples/central_throughput/src/uart_console.c @@ -27,8 +27,10 @@ static char buffer[20] = {0}; static const char help[] = "commands:\n" "h/? show this\n" "start dir start tpt test on dir\n" - "stop dir stop tpt test on dir\n\n" - "loopback start/stop" + "stop dir stop tpt test on dir\n" + "loopback start/stop\n" + "phy 1m/2m/s2/s8\n" + "interval x (in 1.25 ms)\n" "note: dir = s->m or m->s\n"; void cmd_help(const char *param) @@ -76,6 +78,28 @@ void cmd_loopback(const char *param) loopback_test(strcmp(param, "start") == 0 ? 1 : 0); } +void set_phy(int phy); + +void cmd_phy(const char *param) +{ + int phy; + if (strcmp(param, "1m") == 0) phy = 0; + else if (strcmp(param, "2m") == 0) phy = 1; + else if (strcmp(param, "s2") == 0) phy = 2; + else if (strcmp(param, "s8") == 0) phy = 3; + else return; + set_phy(phy); +} + +void set_interval(int interval); + +void cmd_interval(const char *param) +{ + int interval = 0; + if (sscanf(param, "%d", &interval) != 1) return; + set_interval(interval); +} + static cmd_t cmds[] = { { @@ -98,6 +122,14 @@ static cmd_t cmds[] = .cmd = "loopback", .handler = cmd_loopback }, + { + .cmd = "phy", + .handler = cmd_phy + }, + { + .cmd = "interval", + .handler = cmd_interval + }, }; void handle_command(char *cmd_line) diff --git a/examples/hid_keyboard/hid_keyboard.ingw b/examples/hid_keyboard/hid_keyboard.ingw index dfba5a058..926eb3e18 100644 --- a/examples/hid_keyboard/hid_keyboard.ingw +++ b/examples/hid_keyboard/hid_keyboard.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/hid_keyboard/hid_keyboard.uvprojx b/examples/hid_keyboard/hid_keyboard.uvprojx index 65256b818..ed15ad98a 100644 --- a/examples/hid_keyboard/hid_keyboard.uvprojx +++ b/examples/hid_keyboard/hid_keyboard.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o hid_keyboard.bin ./output/hid_keyboard.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009bb0 + 0x6450 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -454,11 +457,12 @@ + - + @@ -466,4 +470,5 @@ +
diff --git a/examples/hid_keyboard/src/USBKeyboard.h b/examples/hid_keyboard/src/USBKeyboard.h index cab823033..4b10fe822 100644 --- a/examples/hid_keyboard/src/USBKeyboard.h +++ b/examples/hid_keyboard/src/USBKeyboard.h @@ -10,13 +10,6 @@ // typical maximum simultaneous events that can be detected and reported #define INPUT_REPORT_KEYS_MAX 6 -typedef __packed struct kb_report -{ - uint8_t modifier; - uint8_t reserved; - uint8_t codes[INPUT_REPORT_KEYS_MAX]; -} kb_report_t; - /** * Modifier masks - used for the first byte in the HID report. * NOTE: The second byte in the report is reserved, 0x00 diff --git a/examples/hid_keyboard/src/profile.c b/examples/hid_keyboard/src/profile.c index bc33746f4..f5a4b903b 100644 --- a/examples/hid_keyboard/src/profile.c +++ b/examples/hid_keyboard/src/profile.c @@ -12,6 +12,8 @@ #include "USBHID_Types.h" #include "USBKeyboard.h" +#include "profile.h" + // GATT characteristic handles #define HANDLE_DEVICE_NAME 3 #define HANDLE_APPEARANCE 5 diff --git a/examples/hid_mouse/hid_mouse.ingw b/examples/hid_mouse/hid_mouse.ingw index 2dcfb78ea..9e33b99eb 100644 --- a/examples/hid_mouse/hid_mouse.ingw +++ b/examples/hid_mouse/hid_mouse.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/hid_mouse/hid_mouse.uvprojx b/examples/hid_mouse/hid_mouse.uvprojx index 7819ad1d0..14c24513d 100644 --- a/examples/hid_mouse/hid_mouse.uvprojx +++ b/examples/hid_mouse/hid_mouse.uvprojx @@ -319,6 +319,15 @@ 2 0 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 --gnu USE_STDPERIPH_DRIVER diff --git a/examples/ibeacon_scanner/ibeacon_scanner.ingw b/examples/ibeacon_scanner/ibeacon_scanner.ingw index c91342e86..fed374f07 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.ingw +++ b/examples/ibeacon_scanner/ibeacon_scanner.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/io_over_ble_mas/io_over_ble_mas.ingw b/examples/io_over_ble_mas/io_over_ble_mas.ingw index 338305369..b1cc8eccd 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.ingw +++ b/examples/io_over_ble_mas/io_over_ble_mas.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/io_over_ble_sla/io_over_ble_sla.ingw b/examples/io_over_ble_sla/io_over_ble_sla.ingw index af4573251..d46297530 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.ingw +++ b/examples/io_over_ble_sla/io_over_ble_sla.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/mesh-light/mesh-light.ingw b/examples/mesh-light/mesh-light.ingw index e4bbd7b03..424a01851 100644 --- a/examples/mesh-light/mesh-light.ingw +++ b/examples/mesh-light/mesh-light.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 258376, + "size": 258236, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 278528 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_init","l2cap_max_le_mtu","l2cap_send_signaling_le","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","kv_value_append","kv_value_trunc","mesh_setup","mesh_set_dev_name","mesh_platform_config","_os_mbuf_leadingspace","_os_mbuf_trailingspace","os_mqueue_init","os_mqueue_get","os_mqueue_put","os_msys_register","os_msys_get","os_msys_reset","os_msys_get_pkthdr","os_msys_count","os_msys_num_free","os_mbuf_pool_init","os_mbuf_get","os_mbuf_get_pkthdr","os_mbuf_dup","os_mbuf_off","os_mbuf_copydata","os_mbuf_append","os_mbuf_appendfrom","os_mbuf_free","os_mbuf_free_chain","os_mbuf_adj","os_mbuf_cmpf","os_mbuf_cmpm","os_mbuf_prepend","os_mbuf_prepend_pullup","os_mbuf_copyinto","os_mbuf_concat","os_mbuf_extend","os_mbuf_pullup","os_mbuf_trim_front","NET_BUF_SIMPLE","net_buf_simple_init","net_buf_put","net_buf_ref","net_buf_unref","net_buf_simple_pull_le16","net_buf_simple_pull_be16","net_buf_simple_pull_be32","net_buf_simple_pull_le32","net_buf_simple_pull_u8","net_buf_simple_add_le16","net_buf_simple_add_be16","net_buf_simple_add_u8","net_buf_simple_add_be32","net_buf_simple_add_le32","net_buf_add_zeros","net_buf_simple_push_le16","net_buf_simple_push_be16","net_buf_simple_push_u8","net_buf_simple_pull","net_buf_simple_add","k_fifo_is_empty","net_buf_get","net_buf_simple_push","net_buf_reserve","bt_dh_key_gen","bt_pub_key_gen","bt_pub_key_get","bt_rand","bt_hex","bt_encrypt_be","bt_le_adv_start","bt_le_adv_stop","k_work_init","k_delayed_work_init","k_delayed_work_cancel","k_delayed_work_submit","k_uptime_get","k_uptime_get_32","k_sleep","k_work_submit","k_work_add_arg","k_delayed_work_add_arg","k_delayed_work_remaining_get","net_buf_simple_save","net_buf_simple_restore","sys_memcpy_swap","MYNEWT_VAL_BLE_MESH_GATT_PROXY","k_sem_take","net_buf_slist_init","net_buf_slist_is_empty","net_buf_slist_peek_head","net_buf_slist_peek_next","net_buf_slist_get","net_buf_slist_put","net_buf_slist_remove","net_buf_slist_merge_slist","settings_bytes_from_str","settings_str_from_bytes","PB_ADV_config","le_adv_status_reset","bt_mesh_model_msg_init","bt_mesh_model_send","bt_mesh_model_publish","bt_mesh_model_elem","bt_mesh_input_string","bt_mesh_input_number","bt_mesh_prov_enable","bt_mesh_prov_disable","bt_mesh_init","bt_mesh_reset","bt_mesh_provision","bt_mesh_is_provisioned","ble_npl_callout_init","npl_freertos_eventq_get","npl_freertos_eventq_put","npl_freertos_sem_init","npl_freertos_sem_pend","npl_freertos_sem_release","npl_freertos_callout_init","npl_freertos_callout_reset","npl_freertos_callout_remaining_ticks","npl_freertos_time_ms_to_ticks","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueCreateCountingSemaphore","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","sysSetPublicDeviceAddr","platform_config","platform_shutdown","platform_printf","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_init","l2cap_max_le_mtu","l2cap_send_signaling_le","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","kv_value_append","kv_value_trunc","mesh_setup","mesh_set_dev_name","mesh_platform_config","_os_mbuf_leadingspace","_os_mbuf_trailingspace","os_mqueue_init","os_mqueue_get","os_mqueue_put","os_msys_register","os_msys_get","os_msys_reset","os_msys_get_pkthdr","os_msys_count","os_msys_num_free","os_mbuf_pool_init","os_mbuf_get","os_mbuf_get_pkthdr","os_mbuf_dup","os_mbuf_off","os_mbuf_copydata","os_mbuf_append","os_mbuf_appendfrom","os_mbuf_free","os_mbuf_free_chain","os_mbuf_adj","os_mbuf_cmpf","os_mbuf_cmpm","os_mbuf_prepend","os_mbuf_prepend_pullup","os_mbuf_copyinto","os_mbuf_concat","os_mbuf_extend","os_mbuf_pullup","os_mbuf_trim_front","NET_BUF_SIMPLE","net_buf_simple_init","net_buf_put","net_buf_ref","net_buf_unref","net_buf_simple_pull_le16","net_buf_simple_pull_be16","net_buf_simple_pull_be32","net_buf_simple_pull_le32","net_buf_simple_pull_u8","net_buf_simple_add_le16","net_buf_simple_add_be16","net_buf_simple_add_u8","net_buf_simple_add_be32","net_buf_simple_add_le32","net_buf_add_zeros","net_buf_simple_push_le16","net_buf_simple_push_be16","net_buf_simple_push_u8","net_buf_simple_pull","net_buf_simple_add","k_fifo_is_empty","net_buf_get","net_buf_simple_push","net_buf_reserve","bt_dh_key_gen","bt_pub_key_gen","bt_pub_key_get","bt_rand","bt_hex","bt_encrypt_be","bt_le_adv_start","bt_le_adv_stop","k_work_init","k_delayed_work_init","k_delayed_work_cancel","k_delayed_work_submit","k_uptime_get","k_uptime_get_32","k_sleep","k_work_submit","k_work_add_arg","k_delayed_work_add_arg","k_delayed_work_remaining_get","net_buf_simple_save","net_buf_simple_restore","sys_memcpy_swap","MYNEWT_VAL_BLE_MESH_GATT_PROXY","k_sem_take","net_buf_slist_init","net_buf_slist_is_empty","net_buf_slist_peek_head","net_buf_slist_peek_next","net_buf_slist_get","net_buf_slist_put","net_buf_slist_remove","net_buf_slist_merge_slist","settings_bytes_from_str","settings_str_from_bytes","PB_ADV_config","le_adv_status_reset","bt_mesh_model_msg_init","bt_mesh_model_send","bt_mesh_model_publish","bt_mesh_model_elem","bt_mesh_input_string","bt_mesh_input_number","bt_mesh_prov_enable","bt_mesh_prov_disable","bt_mesh_init","bt_mesh_reset","bt_mesh_provision","bt_mesh_is_provisioned","ble_npl_callout_init","npl_freertos_eventq_get","npl_freertos_eventq_put","npl_freertos_sem_init","npl_freertos_sem_pend","npl_freertos_sem_release","npl_freertos_callout_init","npl_freertos_callout_reset","npl_freertos_callout_remaining_ticks","npl_freertos_time_ms_to_ticks","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueCreateCountingSemaphore","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,3] + 0,14,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/periodic_advertiser/periodic_advertiser.ingw b/examples/periodic_advertiser/periodic_advertiser.ingw index 35f24b84e..35d2045c1 100644 --- a/examples/periodic_advertiser/periodic_advertiser.ingw +++ b/examples/periodic_advertiser/periodic_advertiser.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/periodic_advertiser/periodic_advertiser.uvoptx b/examples/periodic_advertiser/periodic_advertiser.uvoptx index eaf87e217..83cbeacd6 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvoptx +++ b/examples/periodic_advertiser/periodic_advertiser.uvoptx @@ -186,7 +186,7 @@ APP - 0 + 1 0 0 0 @@ -214,18 +214,6 @@ 0 0 - - 1 - 3 - 1 - 0 - 0 - 0 - ..\anti_lost_sla\src\dev_info.c - dev_info.c - 0 - 0 - @@ -236,7 +224,7 @@ 0 2 - 4 + 3 2 0 0 @@ -248,7 +236,7 @@ 2 - 5 + 4 3 0 0 @@ -276,7 +264,7 @@ 0 4 - 6 + 5 1 0 0 @@ -288,7 +276,7 @@ 4 - 7 + 6 1 0 0 @@ -298,30 +286,6 @@ 0 0 - - 4 - 8 - 1 - 0 - 0 - 0 - ..\..\src\FWlib\peripheral_pinctrl.c - peripheral_pinctrl.c - 0 - 0 - - - 4 - 9 - 1 - 0 - 0 - 0 - ..\..\src\FWlib\peripheral_pwm.c - peripheral_pwm.c - 0 - 0 - @@ -330,30 +294,6 @@ 0 0 0 - - 5 - 10 - 1 - 0 - 0 - 0 - ../..\src\Tools\ad_parser.c - ad_parser.c - 0 - 0 - - - 5 - 11 - 1 - 0 - 0 - 0 - ..\..\src\Tools\blink.c - blink.c - 0 - 0 - @@ -364,4 +304,4 @@ 1 - \ No newline at end of file + diff --git a/examples/periodic_advertiser/periodic_advertiser.uvprojx b/examples/periodic_advertiser/periodic_advertiser.uvprojx index 97ac03658..6b72ee560 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvprojx +++ b/examples/periodic_advertiser/periodic_advertiser.uvprojx @@ -319,6 +319,15 @@ 2 0 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 --gnu USE_STDPERIPH_DRIVER diff --git a/examples/periodic_advertiser/src/profile.c b/examples/periodic_advertiser/src/profile.c index 0f7fe51a8..7c061038b 100644 --- a/examples/periodic_advertiser/src/profile.c +++ b/examples/periodic_advertiser/src/profile.c @@ -15,10 +15,6 @@ static uint8_t adv_data[] = { #include "../data/advertising.adv" }; -const static uint8_t profile_data[] = { - #include "../data/gatt.profile" -}; - static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size) { @@ -87,6 +83,14 @@ static void setup_adv(void) gap_set_periodic_adv_data(0, sizeof(adv_data), (uint8_t*)adv_data); gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); gap_set_periodic_adv_enable(1, 0); +#ifdef CTE + gap_set_connectionless_cte_tx_param(0, 2, + CTE_AOA, + 1, + 2, + 0, NULL); + gap_set_connectionless_cte_tx_enable(0, 1); +#endif } static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) @@ -109,8 +113,6 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin switch (hci_event_le_meta_get_subevent_code(packet)) { case HCI_SUBEVENT_LE_CONNECTION_COMPLETE: - att_set_db(decode_hci_le_meta_event(packet, le_meta_event_create_conn_complete_t)->handle, - profile_data); break; default: break; @@ -118,8 +120,8 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin break; - case HCI_EVENT_DISCONNECTION_COMPLETE: - gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); + case HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED: + platform_printf("terminated\n"); break; case ATT_EVENT_CAN_SEND_NOW: @@ -142,6 +144,7 @@ static TimerHandle_t app_timer = 0; uint32_t setup_profile(void *data, void *user_data) { + platform_printf("setup profile\n"); // Note: security has not been enabled. app_timer = xTimerCreate("t1", pdMS_TO_TICKS(1000), diff --git a/examples/periodic_scanner/periodic_scanner.ingw b/examples/periodic_scanner/periodic_scanner.ingw index f3e14755a..6abf23f78 100644 --- a/examples/periodic_scanner/periodic_scanner.ingw +++ b/examples/periodic_scanner/periodic_scanner.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/periodic_scanner/periodic_scanner.uvoptx b/examples/periodic_scanner/periodic_scanner.uvoptx index eaf87e217..d10c660ce 100644 --- a/examples/periodic_scanner/periodic_scanner.uvoptx +++ b/examples/periodic_scanner/periodic_scanner.uvoptx @@ -186,7 +186,7 @@ APP - 0 + 1 0 0 0 @@ -221,8 +221,20 @@ 0 0 0 - ..\anti_lost_sla\src\dev_info.c - dev_info.c + ..\smart_meter\src\thermo_service.c + thermo_service.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\ibeacon_scanner\src\service_ibeacon.c + service_ibeacon.c 0 0 @@ -236,7 +248,7 @@ 0 2 - 4 + 5 2 0 0 @@ -248,7 +260,7 @@ 2 - 5 + 6 3 0 0 @@ -276,7 +288,7 @@ 0 4 - 6 + 7 1 0 0 @@ -288,7 +300,7 @@ 4 - 7 + 8 1 0 0 @@ -298,30 +310,6 @@ 0 0 - - 4 - 8 - 1 - 0 - 0 - 0 - ..\..\src\FWlib\peripheral_pinctrl.c - peripheral_pinctrl.c - 0 - 0 - - - 4 - 9 - 1 - 0 - 0 - 0 - ..\..\src\FWlib\peripheral_pwm.c - peripheral_pwm.c - 0 - 0 - @@ -332,7 +320,7 @@ 0 5 - 10 + 9 1 0 0 @@ -342,18 +330,6 @@ 0 0 - - 5 - 11 - 1 - 0 - 0 - 0 - ..\..\src\Tools\blink.c - blink.c - 0 - 0 - @@ -364,4 +340,4 @@ 1 - \ No newline at end of file + diff --git a/examples/periodic_scanner/periodic_scanner.uvprojx b/examples/periodic_scanner/periodic_scanner.uvprojx index c1f0742b0..ff9cf7292 100644 --- a/examples/periodic_scanner/periodic_scanner.uvprojx +++ b/examples/periodic_scanner/periodic_scanner.uvprojx @@ -319,9 +319,18 @@ 2 0 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 --gnu - USE_STDPERIPH_DRIVER + USE_STDPERIPH_DRIVER,SIMULATION ..\ibeacon_scanner\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src diff --git a/examples/periodic_scanner/src/main.c b/examples/periodic_scanner/src/main.c index 5fcb11cec..f6628b589 100644 --- a/examples/periodic_scanner/src/main.c +++ b/examples/periodic_scanner/src/main.c @@ -54,7 +54,7 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { - config_uart(OSC_CLK_FREQ, 115200); + config_uart(OSC_CLK_FREQ, 921600); } uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) diff --git a/examples/periodic_scanner/src/profile.c b/examples/periodic_scanner/src/profile.c index 867eeb961..08edb7820 100644 --- a/examples/periodic_scanner/src/profile.c +++ b/examples/periodic_scanner/src/profile.c @@ -1,5 +1,6 @@ #include #include +#include #include "platform_api.h" #include "att_db.h" #include "gap.h" @@ -19,7 +20,7 @@ uint8_t prd_create_sync = 0; uint8_t prd_adv_data_acc[1650] = {0}; uint8_t prd_adv_data_offset = 0; -static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, +static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size) { switch (att_handle) @@ -32,7 +33,7 @@ static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t a static btstack_packet_callback_registration_t hci_event_callback_registration; -static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, +static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) { switch (att_handle) @@ -92,7 +93,7 @@ void show_adv(int8_t rssi) uint16_t length; ibeacon_adv_t *p_ibeacon; const temperature_service_data_adv_t *p_temperature; - + ad_iterator_init(&context, prd_adv_data_offset, prd_adv_data_acc); while (ad_iterator_has_more(&context)) { @@ -117,7 +118,7 @@ void show_adv(int8_t rssi) last_power = rssi / 2 + last_power / 2; print_uuid(p_ibeacon->uuid); - platform_printf(" %04X,%04X, %.1fm, %ddBm\n", + platform_printf(" %04X,%04X, %.1fm, %ddBm\n", p_ibeacon->major, p_ibeacon->minor, estimate_distance(p_ibeacon->ref_power, last_power), last_power); break; @@ -126,6 +127,102 @@ void show_adv(int8_t rssi) } } +char *base64_encode(const uint8_t *data, int data_len, + char *res, int buffer_size) +{ + int len = (data_len + 2) / 3 * 4; + int i, j; + + const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + if (len > buffer_size - 1) + { + res[0] = '\0'; + return res; + } + + res[len]='\0'; + + for(i = 0, j = 0; i < len - 2; j += 3, i += 4) + { + res[i + 0] = base64_table[data[j] >> 2]; + res[i + 1] = base64_table[(data[j] & 0x3) << 4 | (data[j + 1] >> 4)]; + res[i + 2] = base64_table[(data[j + 1] & 0xf) << 2 | (data[j + 2] >> 6)]; + res[i + 3] = base64_table[data[j + 2] & 0x3f]; + } + + switch (data_len % 3) + { + case 1: + res[i - 2] = '='; + res[i - 1] = '='; + break; + case 2: + res[i - 1] = '='; + break; + } + + return res; +} + +void recv_iq_report(const le_meta_connless_iq_report_t *report) +{ + static char iq_str_buffer[100]; + platform_printf("CTE:"); + platform_printf(base64_encode((const uint8_t *)report, + sizeof(*report) + report->sample_count * sizeof(report->samples[0]), + iq_str_buffer, sizeof(iq_str_buffer))); + platform_printf("\n"); +} + +#ifdef SIMULATION + +#pragma pack (push, 1) +typedef struct sim_iq_report +{ + le_meta_connless_iq_report_t report; + le_iq_sample_t samples[10]; +} sim_iq_report_t; +#pragma pack (pop) + +static sim_iq_report_t iq_report = +{ + .report = { + .sync_handle = 0, + .channel_index = 1, + .rssi = -500, + .rssi_ant_id = 0, + .cte_type = 0, + .slot_durations = 1, + .packet_status = 0, + .event_counter = 0, + .sample_count = 10 + }, + .samples = { + 127, 0, 127, 0, 127, 0, 127, 0, 127, 0, 127, 0, 127, 0, 127, 0, // ref + 127, 0, -118, 51 + } +}; + +static int8_t *iqs = (int8_t *)iq_report.samples; + +void simulate_cte_report() +{ + #define PI 3.1415926536 + #define R 0.03 + static float angle = 0.0; + float phase; + int8_t *sample = iqs + (8 + 1) * 2; + angle += PI / 30; + if (angle >= 2 * PI) angle -= 2 * PI; + phase = - 4 * PI * 2404000000.0 / (300000000) * R * cos(angle); + sample[0] = 127 * cos(phase); + sample[1] = 127 * sin(phase); + iq_report.report.event_counter++; + recv_iq_report(&iq_report.report); +} +#endif + static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) { uint8_t event = hci_event_packet_get_type(packet); @@ -151,12 +248,12 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin { const le_ext_adv_report_t *report = decode_hci_le_meta_event(packet, le_meta_event_ext_adv_report_t)->reports; - printf("%02X:%02X:%02X:%02X:%02X:%02X: %dBm\n", + platform_printf("%02X:%02X:%02X:%02X:%02X:%02X: %dBm\n", report->address[5], report->address[4], report->address[3], report->address[2], report->address[1], report->address[0], report->rssi); if ((0 == prd_create_sync) && (report->prd_adv_interval)) { - printf("create sync...\n"); + platform_printf("create sync...\n"); prd_create_sync = 1; gap_periodic_adv_create_sync(PERIODIC_ADVERTISER_FROM_PARAM, report->sid, @@ -168,14 +265,31 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin } break; case HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_SYNC_ESTABLISHED: - printf("established\n"); - gap_set_ext_scan_enable(0, 0, 0, 0); + platform_printf("established\n"); + gap_set_ext_scan_enable(0, 0, 0, 0); prd_adv_data_offset = 0; +#ifdef CTE + { + static const uint8_t ant_ids[] = {0, 1}; + const le_meta_event_periodic_adv_sync_established_t *established = + decode_hci_le_meta_event(packet, le_meta_event_periodic_adv_sync_established_t); + gap_set_connectionless_iq_sampling_enable(established->sync_handle, + 1, + (1 << CTE_SLOT_DURATION_1US) | (1 << CTE_SLOT_DURATION_2US), + 16, + sizeof(ant_ids), ant_ids); + } + +#endif + break; +#ifdef CTE + case HCI_SUBEVENT_LE_CONNECTIONLESS_IQ_REPORT: + recv_iq_report(decode_hci_le_meta_event(packet, le_meta_connless_iq_report_t)); break; - +#endif case HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_REPORT: { - const le_meta_event_periodic_adv_report_t *report = + const le_meta_event_periodic_adv_report_t *report = decode_hci_le_meta_event(packet, le_meta_event_periodic_adv_report_t); if (prd_adv_data_offset + report->data_length <= sizeof(prd_adv_data_acc)) { @@ -185,6 +299,9 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin switch (report->data_status) { case HCI_PRD_ADV_DATA_STATUS_CML: +#ifdef SIMULATION + simulate_cte_report(); +#endif show_adv(report->rssi); prd_adv_data_offset = 0; break; @@ -193,13 +310,13 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin case HCI_PRD_ADV_DATA_STATUS_TRUNCED: prd_adv_data_offset = 0; break; - } + } } break; - + case HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_SYNC_LOST: prd_create_sync = 0; - printf("sync lost\n"); + platform_printf("sync lost\n"); gap_set_ext_scan_enable(1, 0, 0, 0); // start continuous scanning break; default: @@ -227,7 +344,7 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin } uint32_t setup_profile(void *data, void *user_data) -{ +{ att_server_init(att_read_callback, att_write_callback); hci_event_callback_registration.callback = user_packet_handler; hci_add_event_handler(&hci_event_callback_registration); diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw index 5e6805b69..893b816ae 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx b/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx index fc59a302f..0b0f689b9 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx @@ -117,7 +117,7 @@ 0 DLGUARM - d + / 0 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx index dc90ea62d..6938821b7 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o peripheral_all_in_one.bin ./output/peripheral_all_in_one.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009bb0 + 0x6450 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -330,8 +333,8 @@ 0 --gnu - USE_STDPERIPH_DRIVER,OPTIONAL_RF_CLK,HEIGHT=128 - + USE_STDPERIPH_DRIVER,OPTIONAL_RF_CLK,HEIGHT=128,SIMULATION + ..\peripheral_etag\src;..\peripheral_pedometer\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -502,11 +505,12 @@ + - + @@ -514,4 +518,5 @@ +
diff --git a/examples/peripheral_all_in_one/src/main.c b/examples/peripheral_all_in_one/src/main.c index 6ffe16256..a83262681 100644 --- a/examples/peripheral_all_in_one/src/main.c +++ b/examples/peripheral_all_in_one/src/main.c @@ -306,12 +306,31 @@ static void pedometer_task(void *pdata) extern uint8_t rsc_notify_enable; extern uint8_t rsc_indicate_enable; +extern void app_timer_callback(void); + +uint32_t timer2_isr(void *user_data) +{ + extern SemaphoreHandle_t sem_battery; + BaseType_t xHigherPriorityTaskWoke = pdFALSE; + TMR_IntClr(APB_TMR2); + app_timer_callback(); + xSemaphoreGiveFromISR(sem_battery, &xHigherPriorityTaskWoke); + return 0; +} + uint32_t timer_isr(void *user_data) { + static int cnt = 0; BaseType_t xHigherPriorityTaskWoke = pdFALSE; TMR_IntClr(APB_TMR1); if (rsc_notify_enable | rsc_indicate_enable) xSemaphoreGiveFromISR(sem_pedometer, &xHigherPriorityTaskWoke); + cnt++; + if (cnt >= ACC_SAMPLING_RATE) + { + timer2_isr(user_data); + cnt = 0; + } return 0; } @@ -349,6 +368,3 @@ int app_main() NULL); return 0; } - - - diff --git a/examples/peripheral_all_in_one/src/profile.c b/examples/peripheral_all_in_one/src/profile.c index d51349c96..7e4cdab5a 100644 --- a/examples/peripheral_all_in_one/src/profile.c +++ b/examples/peripheral_all_in_one/src/profile.c @@ -311,8 +311,6 @@ static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_h } } -static TimerHandle_t app_timer = 0; - #define USER_MSG_ID_REQUEST_SEND 1 void send_rsc_meas(void) @@ -341,8 +339,6 @@ static void send_temperature(void) #define USER_MSG_ID_REQUEST_SEND 1 -static void app_timer_callback(TimerHandle_t xTimer); - static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) { switch (msg_id) @@ -395,7 +391,6 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin printf("conn: %d\n", decode_hci_le_meta_event(packet, le_meta_event_create_conn_complete_t)->status); att_set_db(decode_hci_le_meta_event(packet, le_meta_event_create_conn_complete_t)->handle, profile_data); - xTimerStart(app_timer, portMAX_DELAY); break; default: break; @@ -409,7 +404,6 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin temperture_indicate_enable = 0; rsc_notify_enable = 0; rsc_indicate_enable = 0; - xTimerStop(app_timer, portMAX_DELAY); gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); break; @@ -433,7 +427,7 @@ void print_reg(uint32_t addr) printf("%08X = %08X\n", addr, *(uint32_t *)(addr)); } -static SemaphoreHandle_t sem_battery = NULL; +SemaphoreHandle_t sem_battery = NULL; uint8_t *battery_level = NULL; static void battery_task(void *pdata) @@ -464,7 +458,7 @@ static void battery_task(void *pdata) } } -static void app_timer_callback(TimerHandle_t xTimer) +void app_timer_callback() { //printf("t\n"); if (temperture_notify_enable | temperture_indicate_enable) @@ -483,18 +477,10 @@ static void app_timer_callback(TimerHandle_t xTimer) rsc_meas.total_distance = pedometer->total_distance; btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND, NULL, 0); } - - xSemaphoreGive(sem_battery); } uint32_t setup_profile(void *data, void *user_data) { - app_timer = xTimerCreate("app", - pdMS_TO_TICKS(300), - pdTRUE, - NULL, - app_timer_callback); - battery_level = profile_data + HANDLE_BATTERY_LEVEL_OFFSET; sem_battery = xSemaphoreCreateBinary(); diff --git a/examples/peripheral_ancs/peripheral_ancs.ingw b/examples/peripheral_ancs/peripheral_ancs.ingw index 28f22efce..dbbf1c837 100644 --- a/examples/peripheral_ancs/peripheral_ancs.ingw +++ b/examples/peripheral_ancs/peripheral_ancs.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_band/peripheral_band.ingw b/examples/peripheral_band/peripheral_band.ingw index 877ec71e7..0d7ed74cc 100644 --- a/examples/peripheral_band/peripheral_band.ingw +++ b/examples/peripheral_band/peripheral_band.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_battery/peripheral_battery.ingw b/examples/peripheral_battery/peripheral_battery.ingw index fe22b0443..8c4987369 100644 --- a/examples/peripheral_battery/peripheral_battery.ingw +++ b/examples/peripheral_battery/peripheral_battery.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_console/peripheral_console.ingw b/examples/peripheral_console/peripheral_console.ingw index 5c100cdee..309977153 100644 --- a/examples/peripheral_console/peripheral_console.ingw +++ b/examples/peripheral_console/peripheral_console.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_etag/peripheral_etag.ingw b/examples/peripheral_etag/peripheral_etag.ingw index b9c2ffcba..fecacaddd 100644 --- a/examples/peripheral_etag/peripheral_etag.ingw +++ b/examples/peripheral_etag/peripheral_etag.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw index 9af671c3d..818c35009 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_irc/peripheral_irc.ingw b/examples/peripheral_irc/peripheral_irc.ingw index 43e9f1b70..b01d1bf3c 100644 --- a/examples/peripheral_irc/peripheral_irc.ingw +++ b/examples/peripheral_irc/peripheral_irc.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/peripheral_led/peripheral_led.ingw b/examples/peripheral_led/peripheral_led.ingw index bc54a5308..2398f2e3a 100644 --- a/examples/peripheral_led/peripheral_led.ingw +++ b/examples/peripheral_led/peripheral_led.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_pedometer/peripheral_pedometer.ingw b/examples/peripheral_pedometer/peripheral_pedometer.ingw index b0103c36a..d974d881a 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.ingw +++ b/examples/peripheral_pedometer/peripheral_pedometer.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_piano/peripheral_piano.ingw b/examples/peripheral_piano/peripheral_piano.ingw index 4a1f4db14..4a7591fa9 100644 --- a/examples/peripheral_piano/peripheral_piano.ingw +++ b/examples/peripheral_piano/peripheral_piano.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/peripheral_throughput/peripheral_throughput.ingw b/examples/peripheral_throughput/peripheral_throughput.ingw index 08bd80c53..6f3bd7170 100644 --- a/examples/peripheral_throughput/peripheral_throughput.ingw +++ b/examples/peripheral_throughput/peripheral_throughput.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/secondary_fota/secondary_fota.ingw b/examples/secondary_fota/secondary_fota.ingw index 6e3aeb4e2..d697456ff 100644 --- a/examples/secondary_fota/secondary_fota.ingw +++ b/examples/secondary_fota/secondary_fota.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", diff --git a/examples/smart_meter/smart_meter.ingw b/examples/smart_meter/smart_meter.ingw index 228d02a9e..03aee91e8 100644 --- a/examples/smart_meter/smart_meter.ingw +++ b/examples/smart_meter/smart_meter.ingw @@ -2,7 +2,7 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -13,9 +13,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/smart_meter/smart_meter.uvprojx b/examples/smart_meter/smart_meter.uvprojx index 83338c6d0..8a1650d1f 100644 --- a/examples/smart_meter/smart_meter.uvprojx +++ b/examples/smart_meter/smart_meter.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o smart_meter.bin ./output/smart_meter.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009bb0 + 0x6450 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -452,11 +455,12 @@ + - + @@ -464,4 +468,5 @@ +
diff --git a/examples/smart_meter/src/main.c b/examples/smart_meter/src/main.c index 457579dc5..4dc0dae95 100644 --- a/examples/smart_meter/src/main.c +++ b/examples/smart_meter/src/main.c @@ -138,7 +138,7 @@ int app_main() { // If there are *three* crystals on board, *uncomment* below line. // Otherwise, below line should be kept commented out. - platform_set_rf_clk_source(0); + // platform_set_rf_clk_source(0); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_HARD_FAULT, (f_platform_evt_cb)cb_hard_fault, NULL); diff --git a/examples/smart_meter/src/profile.c b/examples/smart_meter/src/profile.c index 7157717cc..9c1fa17be 100644 --- a/examples/smart_meter/src/profile.c +++ b/examples/smart_meter/src/profile.c @@ -558,7 +558,7 @@ static initiating_phy_config_t phy_configs[] = { .scan_int = 200, .scan_win = 50, - .interval_min = 100, + .interval_min = 200, .interval_max = 200, .latency = 2, .supervision_timeout = 200, diff --git a/examples/thermo_ota/thermo_ota.ingw b/examples/thermo_ota/thermo_ota.ingw index 119cc74aa..dcfe19a90 100644 --- a/examples/thermo_ota/thermo_ota.ingw +++ b/examples/thermo_ota/thermo_ota.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/uart_console/uart_console.ingw b/examples/uart_console/uart_console.ingw index 391f330ff..de8681ac4 100644 --- a/examples/uart_console/uart_console.ingw +++ b/examples/uart_console/uart_console.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/examples/voice_remote_ctrl/README.md b/examples/voice_remote_ctrl/README.md index 7f4fb621d..fd8d688be 100644 --- a/examples/voice_remote_ctrl/README.md +++ b/examples/voice_remote_ctrl/README.md @@ -4,7 +4,8 @@ This example demonstrates how to: * Real-time 4-bit ADPCM encoding of audio data; * Use hardware timer & ADC (loop mode); -* Scan keyboard state. +* Scan keyboard state; +* Update connection parameters. Note: Define `DEV_BOARD` to run this on development board (no keyboard), otherwise, this app is built for a special remote controller. diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw index fee2fb364..d29443a59 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw @@ -1,7 +1,7 @@ { "bundle_meta": { "rom": { - "size": 132208, + "size": 132252, "base": 16384 }, "ram": { @@ -12,9 +12,9 @@ "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,5] + 0,14,7] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", diff --git a/src/BSP/eflash.c b/src/BSP/eflash.c index bd495e007..a5f4e4e46 100644 --- a/src/BSP/eflash.c +++ b/src/BSP/eflash.c @@ -2,39 +2,47 @@ uint32_t ClkFreq; //0:16M 1:24M -#define PAGE_SIZE (8192) -#define PAGE_SIZE_SHIFT 13 +#define PAGE_SIZE (8192) +#define PAGE_SIZE_SHIFT 13 -#define RTC_CHIP_STAT_ADDR (0x40050004) -#define CLK_FREQ_STAT_POS 3 +#define RTC_CHIP_STAT_ADDR (0x40050004) +#define CLK_FREQ_STAT_POS 3 -#define EFLASH_BASE ((uint32_t)0x00004000UL) -#define EFLASH_SIZE ((uint32_t)0x00080000UL) //512k byte +#define EFLASH_BASE ((uint32_t)0x00004000UL) +#define EFLASH_SIZE ((uint32_t)0x00080000UL) //512k byte #include "eflash.inc" static void init(void) { - ClkFreq = (*(uint32_t *)RTC_CHIP_STAT_ADDR>>CLK_FREQ_STAT_POS)&0x1; - EflashCacheBypass(); - EflashBaseTime(); + ClkFreq = (*(uint32_t *)RTC_CHIP_STAT_ADDR >> CLK_FREQ_STAT_POS) & 0x1; + EflashCacheBypass(); + EflashBaseTime(); #ifdef FOR_ASIC - EflashRepair(); + EflashRepair(); #endif } -static void uninit() +static void uninit() { EflashCacheEna(); EflashCacheFlush(); } -int program_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size) +int program_flash0(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size, int erase) { - uint32_t addr = dest_addr; - if ((addr & (PAGE_SIZE - 1)) != 0) - return 1; - if (size < 1) + uint32_t addr = dest_addr; + if (erase) + { + if ((addr & (PAGE_SIZE - 1)) != 0) + return 1; + } + else + { + if ((addr & 0x3) != 0) + return 1; + } + if ((size < 1) || ((size & 0x3) != 0)) return 1; init(); @@ -42,12 +50,15 @@ int program_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size while (size) { - int32_t i; + int i; uint32_t sz = size > PAGE_SIZE ? PAGE_SIZE : size; uint32_t *p32 = (uint32_t *)buffer; - uint32_t page_idx = ((addr - EFLASH_BASE) >> PAGE_SIZE_SHIFT) & 0x3f; - EraseEFlashPage(page_idx); - for (i = 0; i < (sz + 3) >> 2; i++) + if (erase) + { + uint32_t page_idx = ((addr - EFLASH_BASE) >> PAGE_SIZE_SHIFT) & 0x3f; + EraseEFlashPage(page_idx); + } + for (i = 0; i<(sz + 3)>> 2; i++) EflashProgram(addr + (i << 2), *p32++); buffer += sz; @@ -59,3 +70,13 @@ int program_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size uninit(); return 0; } + +int program_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size) +{ + return program_flash0(dest_addr, buffer, size, 1); +} + +int write_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size) +{ + return program_flash0(dest_addr, buffer, size, 0); +} diff --git a/src/BSP/eflash.h b/src/BSP/eflash.h index d393a9b32..a46f8d9af 100644 --- a/src/BSP/eflash.h +++ b/src/BSP/eflash.h @@ -8,14 +8,26 @@ extern "C" { #endif /** - * @brief Write a block of data to flash - * @param[in] dest_addr target address (unified address) in flash + * @brief Erase a block of data in flash then write data. + * + * @param[in] dest_addr page aligned target address (unified address) in flash * @param[in] buffer buffer to be written - * @param[in] size byte number to be written + * @param[in] size byte number to be written (must be multiple of 4 bytes) * @return 0 if successful else non-0 */ int program_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size); +/** + * @brief Write a block of data to flash without erasing. + * Note: `dest_addr` must points to a block of flash that has been erased, otherwise, + * data can't be written into it. + * @param[in] dest_addr 32-bit aligned target address (unified address) in flash + * @param[in] buffer buffer to be written + * @param[in] size byte number to be written (must be multiple of 4 bytes) + * @return 0 if successful else non-0 + */ +int write_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size); + #ifdef __cplusplus } #endif From 9041762b699aed8c98bb4a65b49ee425bc51a232 Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Mon, 20 Apr 2020 15:42:50 +0800 Subject: [PATCH 02/10] update for nim v1.2.0: 1. Use --gc:arc and --os:any; 2. Use closures to simplify code. --- examples-nim/peripheral_battery/nim.cfg | 2 +- examples-nim/peripheral_battery/src/main.nim | 8 ++--- examples-nim/smart_home_hub/nim.cfg | 6 ++-- .../smart_home_hub/src/gstartup_ing91800.s | 2 +- examples-nim/smart_home_hub/src/profile.nim | 24 ++++----------- src/Tools/btdatabuilder.nim | 30 +++++++++---------- 6 files changed, 29 insertions(+), 43 deletions(-) diff --git a/examples-nim/peripheral_battery/nim.cfg b/examples-nim/peripheral_battery/nim.cfg index 9d434018d..7446acb77 100644 --- a/examples-nim/peripheral_battery/nim.cfg +++ b/examples-nim/peripheral_battery/nim.cfg @@ -2,7 +2,7 @@ cpu = "arm" gc = "none" define = "release" deadCodeElim = "on" -os = "standalone" +os = "any" LineDir = "on" debuginfo implicitStatic = "on" diff --git a/examples-nim/peripheral_battery/src/main.nim b/examples-nim/peripheral_battery/src/main.nim index 11bf88ffc..675c5c391 100644 --- a/examples-nim/peripheral_battery/src/main.nim +++ b/examples-nim/peripheral_battery/src/main.nim @@ -6,7 +6,7 @@ proc cbHardFault(info: ptr hard_fault_info_t; _: pointer): uint32 {.noconv.} = platformPrintf("HARDFAULT:\nPC : 0x%08X\nLR : 0x%08X\nPSR: 0x%08X\n" & "R0 : 0x%08X\nR1 : 0x%08X\nR2 : 0x%08X\nP3 : 0x%08X\n" & "R12: 0x%08X\n", - info.pc, info.lr, info.psr, + info.pc, info.lr, info.psr, info.r0, info.r1, info.r2, info.r3, info.r12) while true: discard @@ -30,13 +30,13 @@ proc flockfile*(_: File) {.exportc noconv.}= discard proc funlockfile*(_: File) {.exportc noconv.}= discard -proc configUart(freq: uint32; baud: uint32) = +proc configUart(freq: uint32; baud: uint32) = var config = UART_sStateStruct( UART_en : 1, word_length : UART_WLEN_8_BITS, parity : UART_PARITY_NOT_CHECK, fifo_enable : 1, two_stop_bits : 0, - receive_en : 1, transmit_en : 1, + receive_en : 1, transmit_en : 1, cts_en : 0, rts_en : 0, rxfifo_waterlevel : 1, txfifo_waterlevel : 1, ClockFrequency : freq, @@ -65,7 +65,7 @@ proc appMain*(): int {.exportc noconv.} = platformSetEvtCallback(PLATFORM_CB_EVT_ON_DEEP_SLEEP_WAKEUP, onDeepSleepWakeup, nil) platformSetEvtCallback(PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, queryDeepSleepAllowed, nil) platformSetEvtCallback(PLATFORM_CB_EVT_PUTC, cast[fPlatformEvtCB](cbPutc), nil) - + setupPeripherals() return 0 diff --git a/examples-nim/smart_home_hub/nim.cfg b/examples-nim/smart_home_hub/nim.cfg index 7f781f846..9cb37b43f 100644 --- a/examples-nim/smart_home_hub/nim.cfg +++ b/examples-nim/smart_home_hub/nim.cfg @@ -1,13 +1,13 @@ cpu = "arm" -gc = "none" +gc = "arc" define = "release" deadCodeElim = "on" -os = "standalone" +os = "any" LineDir = "off" debuginfo implicitStatic = "on" -d="OPTIONAL_RF_CLK" --d="StandaloneHeapSize=4" +-d="useMalloc" --path="../../src/BSP" --path="../../src/FWLib" --path="../../src/StartUP" diff --git a/examples-nim/smart_home_hub/src/gstartup_ing91800.s b/examples-nim/smart_home_hub/src/gstartup_ing91800.s index 606f81635..3637baded 100644 --- a/examples-nim/smart_home_hub/src/gstartup_ing91800.s +++ b/examples-nim/smart_home_hub/src/gstartup_ing91800.s @@ -14,7 +14,7 @@ __StackTop: .section .heap .align 3 - .equ Heap_Size, 0 + .equ Heap_Size, 8192 .globl __HeapBase .globl __HeapLimit __HeapBase: diff --git a/examples-nim/smart_home_hub/src/profile.nim b/examples-nim/smart_home_hub/src/profile.nim index 84af1dd7b..15d97229d 100644 --- a/examples-nim/smart_home_hub/src/profile.nim +++ b/examples-nim/smart_home_hub/src/profile.nim @@ -101,12 +101,7 @@ proc startScanIfNeeded() = discard gapSetExtScanEnable(1, 0, 0, 0) proc slaveFromConnHandle(connHandle: uint16): ptr Slave = - var env {.global.} : uint16 - env = connHandle - proc predSlave(slave: Slave): bool = - return slave.connHandle == env - - return first(slaves, predSlave) + return first(slaves, (slave) => slave.connHandle == connHandle) proc slaveFromAddr(address: bdAddrT): ptr Slave = var reversed: bdAddrT @@ -128,12 +123,7 @@ proc broadcast(data: ptr uint8; len: int; code: SmartHomeCmdCode; exclude: uint1 discard attServerNotify(server.connHandle, HANDLE_SMART_HOME_STATUS, data, cast[uint16](len)) proc attServerFromConnHandle(connHandle: uint16): ptr AttServer = - var env {.global.} : uint16 - env = connHandle - proc predServer(slave: AttServer): bool = - return slave.connHandle == env - - return first(attServers, predServer) + return first(attServers, (slave) => slave.connHandle == connHandle) proc broadcast(data: openArray[uint8]; code: SmartHomeCmdCode; exclude: uint16 = INVALID_HANDLE) = broadcast(unsafeAddr data[0], len(data), code, exclude) @@ -187,12 +177,7 @@ proc temperatureNotificationHandler(packetType: uint8; connHandle: uint16; packe discard proc setRGB(id: uint8, rgb: ptr uint8): bool = - var predSlaveEnv {.global.} : uint8 - predSlaveEnv = id - proc predSlave(slave: Slave): bool = - return slave.connHandle != INVALID_HANDLE and slave.id == predSlaveEnv - - let slave = first(slaves, predSlave) + let slave = first(slaves, (slave) => slave.connHandle != INVALID_HANDLE and slave.id == id) if slave == nil: return false if slave.cRGBCtrl.valueHandle == INVALID_HANDLE: return false @@ -555,8 +540,9 @@ proc userPacketHandler(packetType: uint8; channel: uint16; packet: ptr uint8; si discard proc setupProfile*(unused1: pointer; unused2: pointer): uint32 {.exportc noconv.} = + platformPrintf("profile run\n") # Note: security has not been enabled. - initiatingTimer = xTimerCreate(cast[cstring]("a"), + initiatingTimer = xTimerCreate("a", pdMS_TO_TICKS(5000), pdFALSE, nil, diff --git a/src/Tools/btdatabuilder.nim b/src/Tools/btdatabuilder.nim index f09557829..4aa34e6b7 100644 --- a/src/Tools/btdatabuilder.nim +++ b/src/Tools/btdatabuilder.nim @@ -6,28 +6,28 @@ # ## This module implements *compile time* data builders for advertising & GATT profile. -## +## ## Functionalities: ## ## 1. Use ``includeCBytes`` to load bytes defined in C-compatible format ## -## .. code-block:: +## .. code-block:: ## let advData = includeCBytes"./data/advertising.adv" -## +## ## 2. Use ``Flags``, ``LocalName``, ``iBeacon``, etc to compose advertising data manualy ## -## .. code-block:: +## .. code-block:: ## let advData = concatToArray([Flags({LEGeneralDiscoverableMode, BR_EDR_NotSupported}), ## iBeacon("{E9052F1E-9D67-4A6E-B2D7-459D132D6A94}", 0, 0, -50)]) -## +## ## 3. Use ``defineProfile``, ``Service``, ``Characteristic``, and ``Descriptor`` to compose GATT profile. ## Handles and value offset are defined as consts. ## ## In below example, `profileData` contains the profile data, `HANDLE_BATTERY_LEVEL` represents its handle, ## and, `HANDLE_BATTERY_LEVEL_OFFSET` represents the offset (in byte) of value (battery level, 10u8) in the profile. -## +## ## Use `*` suffix to make profile data or other consts public. -## +## ## Data of each item (Service/Characteristic/Descriptor) and generated code are all printed during compiling. ## ## .. code-block:: @@ -44,7 +44,7 @@ import proc a2B(a: string): uint8 = cast[uint8]((if a.toLower.startsWith("0x"): parseHexInt else: parseInt) a) - + proc staticParse(filename: string): seq[uint8] {.compileTime.} = result = @[] for s in readFile(filename).splitLines(): @@ -146,7 +146,7 @@ func EddystoneEncodeURL(aurl: string): seq[uint8] {.compileTime.} = break whileBody result.add(cast[uint8](ord(url[0]))) url.delete(0, 0) - + func EddystoneURL*(txPowerAt0: int, url: string): seq[uint8] {.compileTime.} = return ServiceData(EddystoneServiceID, concat(@[@[0x10u8, cast[uint8](txPowerAt0)], EddystoneEncodeURL url])) @@ -176,7 +176,7 @@ type HandleValue = tuple handle: uint16 value: seq[uint8] - + NameHandleValue = tuple name: string handle: uint16 @@ -232,14 +232,14 @@ func makeIntDel(node: NimNode; name: string) {.compileTime.} = func makeIntDef(name: string; v: NimNode): NimNode {.compileTime.} = result = nnkIdentDefs.newTree - + makeIntDel(result, name) result.add newEmptyNode() - result.add v + result.add v func makeConstDef[T](name: string; v: T): NimNode {.compileTime.} = result = nnkConstDef.newTree - + makeIntDel(result, name) result.add newEmptyNode() result.add newLit v @@ -256,7 +256,7 @@ macro defineProfile*(items: static[openArray[NameHandleValue]]; dbName: static[s debugEcho "Items in profile:" for x in items: - debugEcho x.repr + debugEcho x # x.repr var db = nnkBracket.newTree db.add concat(items.mapIt(it.value)).map(newLit) @@ -267,7 +267,7 @@ macro defineProfile*(items: static[openArray[NameHandleValue]]; dbName: static[s for x in items: if x.name != "": sConst.add makeConstDef(x.name, x.handle) - sConst.add makeConstDef(makeOffstInt(x.name), x.offset + total) + sConst.add makeConstDef(makeOffstInt(x.name), x.offset + total) total += len(x.value) debugEcho result.repr From 50b6ea1580ef28ac687b69199c7245b467fe5047 Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Tue, 19 May 2020 10:07:08 +0800 Subject: [PATCH 03/10] init pin for I2C. --- examples/peripheral_pedometer/src/main.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/examples/peripheral_pedometer/src/main.c b/examples/peripheral_pedometer/src/main.c index fdd586bc7..8ebf3e7a5 100644 --- a/examples/peripheral_pedometer/src/main.c +++ b/examples/peripheral_pedometer/src/main.c @@ -1,3 +1,4 @@ +#define OPTIONAL_RF_CLK #include "profile.h" #include "ingsoc.h" #include "platform_api.h" @@ -50,6 +51,16 @@ void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); +#ifndef SIMULATION + PINCTRL_SetPadMux(6, IO_SOURCE_GENERAL); + PINCTRL_SetPadMux(7, IO_SOURCE_GENERAL); + PINCTRL_SetPadMux(14, IO_SOURCE_I2C0_SCL_O); + PINCTRL_SetPadMux(15, IO_SOURCE_I2C0_SDO); + PINCTRL_SelI2cSclIn(I2C_PORT_0, 14); + printf("init"); + i2c_init(I2C_PORT_0); +#endif + // timer 0 can be used as watchdog, so we use timer 1. // setup timer 1: 50Hz TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / ACC_SAMPLING_RATE); @@ -103,12 +114,6 @@ int app_main() platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER1, timer_isr, NULL); - // platform_config(PLATFORM_CFG_LOG_HCI, PLATFORM_CFG_ENABLE); - -#ifndef SIMULATION - printf("init"); - i2c_init(I2C_PORT_0); -#endif xTaskCreate(pedometer_task, "b", From 99b8e471adefefe0b5fd16dfa9321fd9e4862c4f Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Tue, 23 Jun 2020 20:56:48 +0800 Subject: [PATCH 04/10] prepare for upcoming release. --- bundles/mesh/{ => ING9188xx}/meta.json | 0 bundles/mesh/{ => ING9188xx}/platform.bin | Bin bundles/mesh/{ => ING9188xx}/symdefs.g | 0 bundles/mesh/{ => ING9188xx}/symdefs.i | 0 bundles/mesh/{ => ING9188xx}/symdefs.m | 0 bundles/mesh/{ => ING9188xx}/symdefs.s | 0 bundles/mesh/api.list | 381 ---- bundles/typical/{ => ING9188xx}/meta.json | 45 +- bundles/typical/ING9188xx/platform.bin | Bin 0 -> 133460 bytes bundles/typical/ING9188xx/symdefs.g | 247 ++ bundles/typical/ING9188xx/symdefs.i | 247 ++ bundles/typical/ING9188xx/symdefs.m | 248 ++ bundles/typical/ING9188xx/symdefs.s | 247 ++ bundles/typical/inc/att_db.h | 119 +- bundles/typical/inc/att_db.nim | 102 +- bundles/typical/inc/btstack_event.h | 48 +- bundles/typical/inc/btstack_event.nim | 32 +- bundles/typical/inc/btstack_util.h | 2 +- bundles/typical/inc/compiler.h | 26 - bundles/typical/inc/compiler.nim | 12 - bundles/typical/inc/gap.h | 509 ++++- bundles/typical/inc/gap.nim | 560 ++++- bundles/typical/inc/gatt_client.h | 245 +- bundles/typical/inc/gatt_client.nim | 283 +-- bundles/typical/inc/kv_storage.h | 31 +- bundles/typical/inc/kv_storage.nim | 29 +- bundles/typical/inc/os/queue.h | 80 +- bundles/typical/inc/os/semphr.h~RF5787eac.TMP | 1140 +++++++++ bundles/typical/inc/os/task.h | 4 +- bundles/typical/inc/platform_api.h | 41 +- bundles/typical/inc/platform_api.nim | 69 +- bundles/typical/platform.bin | Bin 132252 -> 0 bytes bundles/typical/symdefs.g | 238 -- bundles/typical/symdefs.i | 238 -- bundles/typical/symdefs.m | 239 -- bundles/typical/symdefs.s | 238 -- examples-gcc/peripheral_ibeacon/Makefile | 2 +- .../peripheral_ibeacon.ingw | 341 ++- .../peripheral_ibeacon/generic_cortex.icf | 6 +- .../peripheral_ibeacon/peripheral_ibeacon.ewp | 2 +- .../peripheral_ibeacon.ingw | 341 ++- examples-nim/peripheral_battery/Makefile | 5 +- .../peripheral_battery/flash_download.ini | 6 +- examples-nim/peripheral_battery/makefile.conf | 25 +- examples-nim/peripheral_battery/nim.cfg | 16 +- .../peripheral_battery.ingw | 359 ++- .../peripheral_battery/src/panicoverride.nim | 14 - .../smart_home_hub/.vscode/settings.json | 6 + examples-nim/smart_home_hub/Makefile | 5 +- examples-nim/smart_home_hub/makefile.conf | 17 +- examples-nim/smart_home_hub/nim.cfg | 15 +- .../smart_home_hub/smart_home_hub.ingw | 359 ++- .../smart_home_hub/src/gstartup_ing91800.s | 2 +- examples-nim/smart_home_hub/src/main.nim | 6 +- .../smart_home_hub/src/panicoverride.nim | 14 - examples-nim/smart_home_hub/src/profile.nim | 109 +- .../peripheral_ibeacon/peripheral_ibeacon.hzp | 2 +- .../peripheral_ibeacon.ingw | 341 ++- .../peripheral_ibeacon.emProject | 2 +- .../peripheral_ibeacon.ingw | 341 ++- examples/anti_lost_mas/anti_lost_mas.ingw | 357 ++- examples/anti_lost_mas/anti_lost_mas.uvoptx | 4 +- examples/anti_lost_mas/anti_lost_mas.uvproj | 6 +- examples/anti_lost_mas/anti_lost_mas.uvprojx | 107 +- examples/anti_lost_mas/flash_download.ini | 4 +- examples/anti_lost_mas/src/main.c | 2 +- examples/anti_lost_mas/src/profile.c | 6 +- examples/anti_lost_sla/anti_lost_sla.ingw | 357 ++- examples/anti_lost_sla/anti_lost_sla.uvoptx | 26 +- examples/anti_lost_sla/anti_lost_sla.uvproj | 6 +- examples/anti_lost_sla/anti_lost_sla.uvprojx | 116 +- examples/anti_lost_sla/flash_download.ini | 6 +- examples/anti_lost_sla/src/main.c | 2 +- examples/anti_lost_sla/src/profile.c | 8 +- .../central_throughput.ingw | 357 ++- .../central_throughput.uvoptx | 4 +- .../central_throughput.uvproj | 2 +- .../central_throughput.uvprojx | 2 +- .../central_throughput/flash_download.ini | 6 +- examples/central_throughput/src/main.c | 11 +- examples/central_throughput/src/profile.c | 141 +- .../central_throughput/src/rf_powerboost.dat | 256 +++ examples/hid_keyboard/hid_keyboard.ingw | 355 ++- examples/hid_keyboard/hid_keyboard.uvoptx | 4 +- examples/hid_keyboard/hid_keyboard.uvproj | 2 +- examples/hid_keyboard/hid_keyboard.uvprojx | 107 +- examples/hid_keyboard/src/profile.c | 4 +- examples/hid_mouse/hid_mouse.ingw | 355 ++- examples/hid_mouse/hid_mouse.uvproj | 2 +- examples/hid_mouse/hid_mouse.uvprojx | 2 +- examples/hid_mouse/src/profile.c | 4 +- examples/ibeacon_scanner/flash_download.ini | 6 +- examples/ibeacon_scanner/ibeacon_scanner.ingw | 329 ++- .../ibeacon_scanner/ibeacon_scanner.uvoptx | 38 +- .../ibeacon_scanner/ibeacon_scanner.uvproj | 2 +- .../ibeacon_scanner/ibeacon_scanner.uvprojx | 11 +- examples/ibeacon_scanner/src/main.c | 9 +- examples/ibeacon_scanner/src/profile.c | 5 +- examples/io_over_ble_mas/io_over_ble_mas.ingw | 345 ++- .../io_over_ble_mas/io_over_ble_mas.uvoptx | 2 +- .../io_over_ble_mas/io_over_ble_mas.uvproj | 2 +- .../io_over_ble_mas/io_over_ble_mas.uvprojx | 107 +- examples/io_over_ble_mas/src/io_interf.c | 2 +- examples/io_over_ble_mas/src/profile.c | 44 +- examples/io_over_ble_sla/io_over_ble_sla.ingw | 345 ++- .../io_over_ble_sla/io_over_ble_sla.uvproj | 2 +- .../io_over_ble_sla/io_over_ble_sla.uvprojx | 2 +- examples/io_over_ble_sla/src/profile.c | 4 +- examples/mesh-light/mesh-light.ingw | 440 +++- examples/mesh-light/mesh-light.uvoptx | 4 +- examples/mesh-light/mesh-light.uvproj | 2 +- examples/mesh-light/mesh-light.uvprojx | 107 +- .../periodic_advertiser/flash_download.ini | 6 +- .../periodic_advertiser.ingw | 357 ++- .../periodic_advertiser.uvoptx | 16 +- .../periodic_advertiser.uvproj | 2 +- .../periodic_advertiser.uvprojx | 7 +- examples/periodic_advertiser/src/main.c | 9 +- examples/periodic_advertiser/src/profile.c | 2 - examples/periodic_scanner/flash_download.ini | 6 +- .../periodic_scanner/periodic_scanner.ingw | 357 ++- .../periodic_scanner/periodic_scanner.uvproj | 2 +- .../periodic_scanner/periodic_scanner.uvprojx | 2 +- examples/periodic_scanner/src/profile.c | 26 +- .../peripheral_all_in_one/flash_download.ini | 4 +- .../peripheral_all_in_one.ingw | 347 ++- .../peripheral_all_in_one.uvoptx | 2 +- .../peripheral_all_in_one.uvproj | 2 +- .../peripheral_all_in_one.uvprojx | 4 +- examples/peripheral_all_in_one/src/main.c | 105 +- examples/peripheral_all_in_one/src/profile.c | 6 +- examples/peripheral_ancs/flash_download.ini | 4 +- examples/peripheral_ancs/peripheral_ancs.ingw | 15 +- .../peripheral_ancs/peripheral_ancs.uvoptx | 4 +- .../peripheral_ancs/peripheral_ancs.uvproj | 4 +- .../peripheral_ancs/peripheral_ancs.uvprojx | 107 +- examples/peripheral_ancs/src/ancs.c | 20 +- examples/peripheral_ancs/src/main.c | 2 +- examples/peripheral_ancs/src/profile.c | 12 +- examples/peripheral_band/flash_download.ini | 4 +- examples/peripheral_band/peripheral_band.ingw | 347 ++- .../peripheral_band/peripheral_band.uvoptx | 2 +- .../peripheral_band/peripheral_band.uvproj | 2 +- .../peripheral_band/peripheral_band.uvprojx | 2 +- examples/peripheral_band/src/main.c | 1 + examples/peripheral_band/src/profile.c | 4 +- .../peripheral_battery/flash_download.ini | 4 +- .../peripheral_battery.ingw | 335 ++- .../peripheral_battery.uvproj | 2 +- .../peripheral_battery.uvprojx | 2 +- examples/peripheral_battery/src/main.c | 2 +- examples/peripheral_battery/src/profile.c | 4 +- .../peripheral_console/flash_download.ini | 8 +- .../peripheral_console.ingw | 347 ++- .../peripheral_console.uvproj | 2 +- .../peripheral_console.uvprojx | 2 +- examples/peripheral_console/src/main.c | 2 +- examples/peripheral_console/src/profile.c | 4 +- examples/peripheral_etag/peripheral_etag.ingw | 345 ++- .../peripheral_etag/peripheral_etag.uvproj | 2 +- .../peripheral_etag/peripheral_etag.uvprojx | 2 +- examples/peripheral_etag/src/profile.c | 4 +- .../peripheral_ibeacon/flash_download.ini | 6 +- .../peripheral_ibeacon.ingw | 341 ++- .../peripheral_ibeacon.uvoptx | 2 +- .../peripheral_ibeacon.uvproj | 2 +- .../peripheral_ibeacon.uvprojx | 107 +- examples/peripheral_ibeacon/src/profile.c | 3 - examples/peripheral_irc/peripheral_irc.ingw | 357 ++- examples/peripheral_irc/peripheral_irc.uvproj | 2 +- .../peripheral_irc/peripheral_irc.uvprojx | 2 +- examples/peripheral_irc/src/profile.c | 4 +- examples/peripheral_led/peripheral_led.ingw | 345 ++- examples/peripheral_led/peripheral_led.uvproj | 2 +- .../peripheral_led/peripheral_led.uvprojx | 2 +- examples/peripheral_led/src/impl_led.c | 107 + examples/peripheral_led/src/main.c | 106 +- examples/peripheral_led/src/profile.c | 4 +- .../peripheral_pedometer/flash_download.ini | 4 +- .../peripheral_pedometer.ingw | 339 ++- .../peripheral_pedometer.uvoptx | 12 + .../peripheral_pedometer.uvproj | 2 +- .../peripheral_pedometer.uvprojx | 7 +- examples/peripheral_pedometer/src/profile.c | 4 +- examples/peripheral_piano/flash_download.ini | 6 +- .../peripheral_piano/peripheral_piano.ingw | 347 ++- .../peripheral_piano/peripheral_piano.uvoptx | 2 +- .../peripheral_piano/peripheral_piano.uvproj | 2 +- .../peripheral_piano/peripheral_piano.uvprojx | 2 +- examples/peripheral_piano/src/profile.c | 4 +- examples/peripheral_throughput/README.md | 2 +- .../peripheral_throughput/flash_download.ini | 4 +- .../peripheral_throughput.ingw | 347 ++- .../peripheral_throughput.uvopt | 40 +- .../peripheral_throughput.uvoptx | 26 +- .../peripheral_throughput.uvproj | 12 +- .../peripheral_throughput.uvprojx | 117 +- examples/peripheral_throughput/src/main.c | 19 +- examples/peripheral_throughput/src/profile.c | 29 +- examples/secondary_fota/secondary_fota.ingw | 17 +- examples/secondary_fota/secondary_fota.uvproj | 4 +- .../secondary_fota/secondary_fota.uvprojx | 4 +- examples/secondary_fota/src/profile.c | 4 +- examples/smart_meter/flash_download.ini | 2 +- examples/smart_meter/smart_meter.ingw | 349 ++- examples/smart_meter/smart_meter.uvoptx | 2 +- examples/smart_meter/smart_meter.uvproj | 2 +- examples/smart_meter/smart_meter.uvprojx | 2 +- examples/smart_meter/src/main.c | 4 +- examples/smart_meter/src/profile.c | 128 +- examples/thermo_ota/flash_download.ini | 2 +- examples/thermo_ota/src/profilestask.c | 4 +- examples/thermo_ota/thermo_ota.ingw | 297 ++- examples/thermo_ota/thermo_ota.uvoptx | 16 + examples/thermo_ota/thermo_ota.uvproj | 2 +- examples/thermo_ota/thermo_ota.uvprojx | 107 +- examples/uart_console/src/main.c | 2 +- examples/uart_console/src/profile.c | 4 +- examples/uart_console/uart_console.ingw | 347 ++- examples/uart_console/uart_console.uvproj | 2 +- examples/uart_console/uart_console.uvprojx | 107 +- examples/voice_remote_ctrl/src/profile.c | 4 +- .../voice_remote_ctrl/voice_remote_ctrl.ingw | 347 ++- .../voice_remote_ctrl.uvproj | 2 +- .../voice_remote_ctrl.uvprojx | 2 +- src/BSP/eflash.c | 82 +- src/BSP/eflash.inc | 24 +- src/BSP/eflash.nim | 21 +- src/BSP/iic.nim | 2 +- src/BSP/spi_flash.nim | 2 +- src/FWlib/peripheral_pinctrl.c | 87 +- src/FWlib/peripheral_pinctrl.h | 26 +- src/FWlib/peripheral_pinctrl.nim | 26 +- src/FWlib/peripheral_uart.c | 4 +- src/FWlib/peripheral_uart.h | 2 +- src/FWlib/peripheral_uart.nim | 4 +- src/StartUP/ingsoc.nim | 8 +- src/Tools/SEGGER_RTT.c | 2030 +++++++++++++++++ src/Tools/SEGGER_RTT.h | 375 +++ src/Tools/SEGGER_RTT_Conf.h | 389 ++++ src/Tools/btdatabuilder.nim | 4 +- src/Tools/malloc_override.c | 35 + src/Tools/ota_service.c | 2 +- src/Tools/trace.c | 105 + src/Tools/trace.h | 42 + src/Tools/trace.nim | 22 + 246 files changed, 17907 insertions(+), 5191 deletions(-) rename bundles/mesh/{ => ING9188xx}/meta.json (100%) rename bundles/mesh/{ => ING9188xx}/platform.bin (100%) rename bundles/mesh/{ => ING9188xx}/symdefs.g (100%) rename bundles/mesh/{ => ING9188xx}/symdefs.i (100%) rename bundles/mesh/{ => ING9188xx}/symdefs.m (100%) rename bundles/mesh/{ => ING9188xx}/symdefs.s (100%) delete mode 100644 bundles/mesh/api.list rename bundles/typical/{ => ING9188xx}/meta.json (91%) create mode 100644 bundles/typical/ING9188xx/platform.bin create mode 100644 bundles/typical/ING9188xx/symdefs.g create mode 100644 bundles/typical/ING9188xx/symdefs.i create mode 100644 bundles/typical/ING9188xx/symdefs.m create mode 100644 bundles/typical/ING9188xx/symdefs.s delete mode 100644 bundles/typical/inc/compiler.h delete mode 100644 bundles/typical/inc/compiler.nim create mode 100644 bundles/typical/inc/os/semphr.h~RF5787eac.TMP delete mode 100644 bundles/typical/platform.bin delete mode 100644 bundles/typical/symdefs.g delete mode 100644 bundles/typical/symdefs.i delete mode 100644 bundles/typical/symdefs.m delete mode 100644 bundles/typical/symdefs.s delete mode 100644 examples-nim/peripheral_battery/src/panicoverride.nim create mode 100644 examples-nim/smart_home_hub/.vscode/settings.json delete mode 100644 examples-nim/smart_home_hub/src/panicoverride.nim create mode 100644 examples/central_throughput/src/rf_powerboost.dat create mode 100644 examples/peripheral_led/src/impl_led.c create mode 100644 src/Tools/SEGGER_RTT.c create mode 100644 src/Tools/SEGGER_RTT.h create mode 100644 src/Tools/SEGGER_RTT_Conf.h create mode 100644 src/Tools/malloc_override.c create mode 100644 src/Tools/trace.c create mode 100644 src/Tools/trace.h create mode 100644 src/Tools/trace.nim diff --git a/bundles/mesh/meta.json b/bundles/mesh/ING9188xx/meta.json similarity index 100% rename from bundles/mesh/meta.json rename to bundles/mesh/ING9188xx/meta.json diff --git a/bundles/mesh/platform.bin b/bundles/mesh/ING9188xx/platform.bin similarity index 100% rename from bundles/mesh/platform.bin rename to bundles/mesh/ING9188xx/platform.bin diff --git a/bundles/mesh/symdefs.g b/bundles/mesh/ING9188xx/symdefs.g similarity index 100% rename from bundles/mesh/symdefs.g rename to bundles/mesh/ING9188xx/symdefs.g diff --git a/bundles/mesh/symdefs.i b/bundles/mesh/ING9188xx/symdefs.i similarity index 100% rename from bundles/mesh/symdefs.i rename to bundles/mesh/ING9188xx/symdefs.i diff --git a/bundles/mesh/symdefs.m b/bundles/mesh/ING9188xx/symdefs.m similarity index 100% rename from bundles/mesh/symdefs.m rename to bundles/mesh/ING9188xx/symdefs.m diff --git a/bundles/mesh/symdefs.s b/bundles/mesh/ING9188xx/symdefs.s similarity index 100% rename from bundles/mesh/symdefs.s rename to bundles/mesh/ING9188xx/symdefs.s diff --git a/bundles/mesh/api.list b/bundles/mesh/api.list deleted file mode 100644 index 853549a0f..000000000 --- a/bundles/mesh/api.list +++ /dev/null @@ -1,381 +0,0 @@ -========================= -api in att_db.h: - att_set_db - att_set_read_callback - att_set_write_callback - att_handle_request - att_prepare_handle_value_notification - att_prepare_handle_value_indication - att_clear_transaction_queue -========================= -api in att_server.h: -========================= -api in gatt_external.h: - att_server_init - att_server_register_packet_handler - att_server_can_send_packet_now - att_server_request_can_send_now_event - att_server_notify - att_server_indicate - att_emit_general_event - gatt_client_discover_primary_services - gatt_client_discover_primary_services_by_uuid16 - gatt_client_discover_primary_services_by_uuid128 - gatt_client_discover_characteristics_for_service - gatt_client_find_included_services_for_service - gatt_client_discover_characteristics_for_handle_range_by_uuid16 - gatt_client_discover_characteristics_for_handle_range_by_uuid128 - gatt_client_discover_characteristics_for_service_by_uuid16 - gatt_client_discover_characteristics_for_service_by_uuid128 - gatt_client_discover_characteristic_descriptors - gatt_client_read_value_of_characteristic - gatt_client_read_value_of_characteristic_using_value_handle - gatt_client_read_value_of_characteristics_by_uuid16 - gatt_client_read_value_of_characteristics_by_uuid128 - gatt_client_read_long_value_of_characteristic - gatt_client_read_long_value_of_characteristic_using_value_handle - gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset - gatt_client_read_multiple_characteristic_values - gatt_client_write_value_of_characteristic_without_response - gatt_client_signed_write_without_response - gatt_client_write_value_of_characteristic - gatt_client_write_long_value_of_characteristic - gatt_client_write_long_value_of_characteristic_with_offset - gatt_client_reliable_write_long_value_of_characteristic - gatt_client_read_characteristic_descriptor - gatt_client_read_characteristic_descriptor_using_descriptor_handle - gatt_client_read_long_characteristic_descriptor - gatt_client_read_long_characteristic_descriptor_using_descriptor_handle - gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset - gatt_client_write_characteristic_descriptor - gatt_client_write_characteristic_descriptor_using_descriptor_handle - gatt_client_write_long_characteristic_descriptor - gatt_client_write_long_characteristic_descriptor_using_descriptor_handle - gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset - gatt_client_write_client_characteristic_configuration - gatt_client_prepare_write - gatt_client_execute_write - gatt_client_cancel_write - ble_gatts_find_svc - ble_gatts_find_chr - ble_att_mtu -========================= -api in gap_external.h: - gap_dispose_set_scan_para_complete - gap_dispose_set_adv_para_complete - gap_discovery_proc_init - gap_general_connection_proc_init - gap_auto_connection_proc_init - fill_advertising_report_from_packet - fill_ext_advertising_report_from_packet - fill_period_report_from_packet - gap_get_advertisingReport - gap_observe_proc_init - gap_set_scan_parameters - gap_start_scan - gap_stop_scan - gap_set_random_device_address - gap_random_address_set_mode - gap_random_address_set - gap_random_address_get_mode - gap_auto_connection_start - gap_auto_connect - gap_auto_connection_stop - gap_auto_connection_stop_all - gap_connect - gap_disconnect - gap_get_connection_type - gap_advertisements_set_data - gap_advertisements_set_params - gap_advertisements_enable - gap_scan_response_set_data - ble_gap_set_whitelist - ble_gap_remove_whitelist - btstack_memory_dtbt_app_timer_free - app_funregister - app_OS_Timer - app_set_timer - app_timer_delete - app_add_timer - reverse_bd_addr - gap_random_address_set_update_period - gap_update_connection_parameters - gap_get_connection_parameter_range - gap_set_connection_parameter_range - hci_add_event_handler - hci_register_acl_packet_handler - hci_power_control -========================= -api in platform_api.h: - platform_set_evt_callback - platform_set_irq_callback - platform_get_version - sysSetPublicDeviceAddr - platform_config - platform_set_rf_clk_souce - platform_set_rf_init_data -========================= -api in btstack_util.h: - little_endian_read_16 - little_endian_read_24 - little_endian_read_32 - little_endian_store_16 - little_endian_store_32 - big_endian_read_16 - big_endian_read_32 - big_endian_store_16 - big_endian_store_32 - reverse_bytes - reverse_24 - reverse_48 - reverse_56 - reverse_64 - reverse_128 - btstack_min - btstack_max - char_for_nibble - nibble_for_char - bd_addr_cmp - bd_addr_copy - printf_hexdump - uuid128_to_str - bd_addr_to_str - sscanf_bd_addr - uuid_add_bluetooth_prefix - uuid_has_bluetooth_prefix -========================= -api in btstack_run_loop.h: - btstack_run_loop_timer_dump - btstack_run_loop_init - btstack_run_loop_set_timer - btstack_run_loop_set_timer_handler - btstack_run_loop_set_timer_context - btstack_run_loop_get_timer_context - btstack_run_loop_add_timer - btstack_run_loop_remove_timer - btstack_run_loop_get_time_ms - btstack_run_loop_set_data_source_handler - btstack_run_loop_set_data_source_fd - btstack_run_loop_get_data_source_fd - btstack_run_loop_enable_data_source_callbacks - btstack_run_loop_disable_data_source_callbacks - btstack_run_loop_add_data_source - btstack_run_loop_remove_data_source - btstack_run_loop_execute -========================= -api in hci.h: - hci_init - hci_set_control - hci_set_sco_voice_setting - hci_get_sco_voice_setting - hci_close - hci_register_sco_packet_handler - hci_can_send_command_packet_now - hci_send_cmd - hci_send_cmd_pending - hci_get_sco_packet_length - hci_reserve_packet_buffer - hci_get_outgoing_packet_buffer - hci_release_packet_buffer - hci_connections_get_iterator - hci_connection_for_handle - hci_connection_for_bd_addr_and_type - hci_is_packet_buffer_reserved - hci_can_send_acl_le_packet_now - hci_can_send_acl_packet_now - hci_can_send_prepared_acl_packet_now - hci_send_acl_packet_buffer - hci_authentication_active_for_handle - hci_max_acl_data_packet_length - hci_usable_acl_packet_types - hci_non_flushable_packet_boundary_flag_supported - gap_ssp_supported_on_both_sides - hci_disconnect_security_block - hci_remote_esco_supported - hci_emit_state - hci_send_cmd_packet - hci_disconnect_all - hci_number_free_acl_slots_for_handle - hci_le_advertisements_set_params - hci_le_local_feature_support - hci_le_remote_feature_support - hci_disable_l2cap_timeout_check - HCI_ReadADVChannel_TXPower - gap_initiator_filiter_policy_set - AppTaskStart_msg_recv - HCI_TimerExpProcess - hci_add_first_event_handler - le_handle_advertisement_report - gap_initiator_filiter_policy_set - gap_set_initiator_filter_policy - gap_whitelist_is_onused - HCI_ReadRSSI - HCI_ReadRemoteInfo - HCI_ReadRemoteUsedFeatures - HCI_ReadADVChannel_TXPower - HCI_LEReadChannelMap - HCI_LETransmitTest - HCI_LEReceiveTest - HCI_LETestEnd - HCI_ClearWhiteLists - le_handle_direct_advertisement_report - mesh_advertisements_set_data - hci_remove_from_whitelist -========================= -api in btstack_memory.h: - btstack_memory_init - btstack_memory_hci_connection_get - btstack_memory_hci_connection_free - btstack_memory_l2cap_channel_get - btstack_memory_l2cap_channel_free - btstack_memory_gatt_client_get - btstack_memory_gatt_client_free - btstack_memory_whitelist_entry_get - btstack_memory_whitelist_entry_free - btstack_memory_sm_lookup_entry_get - btstack_memory_sm_lookup_entry_free - btstack_memory_dtbt_msg_get - btstack_memory_dtbt_msg_free -========================= -api in btstack_event.h: - btstack_push_user_msg -========================= -api in mesh_api.h: - mesh_setup - mesh_set_dev_name - npl_freertos_sem_init -========================= -api in os_mbuf.h: - _os_mbuf_trailingspace - os_msys_register - os_msys_get - os_msys_reset - os_mbuf_pool_init - os_mbuf_get - os_mbuf_get_pkthdr - os_mbuf_append - os_mbuf_free - os_mbuf_free_chain - os_mbuf_adj - os_mbuf_extend - os_mbuf_pullup -========================= -api in glue.h: - NET_BUF_SIMPLE - net_buf_simple_init - net_buf_put - net_buf_ref - net_buf_unref - net_buf_simple_pull_le16 - net_buf_simple_pull_be16 - net_buf_simple_pull_be32 - net_buf_simple_pull_u8 - net_buf_simple_add_le16 - net_buf_simple_add_be16 - net_buf_simple_add_u8 - net_buf_simple_add_be32 - net_buf_simple_push_be16 - net_buf_simple_push_u8 - net_buf_simple_pull - net_buf_simple_add - net_buf_simple_push - net_buf_reserve - bt_dh_key_gen - bt_pub_key_gen - bt_pub_key_get - bt_rand - bt_hex - bt_encrypt_be - bt_le_adv_start - k_work_init - k_delayed_work_init - k_delayed_work_cancel - k_delayed_work_submit - k_uptime_get - k_uptime_get_32 - k_sleep - k_work_submit - k_work_add_arg - k_delayed_work_add_arg - k_delayed_work_remaining_get - net_buf_simple_save - net_buf_simple_restore - sys_memcpy_swap - net_buf_slist_init - net_buf_slist_is_empty - net_buf_slist_peek_head - net_buf_slist_peek_next - net_buf_slist_get - net_buf_slist_put - net_buf_slist_remove -========================= -api in access.h: - bt_mesh_model_msg_init - bt_mesh_model_send - bt_mesh_model_publish - bt_mesh_model_elem -========================= -api in main.h: - bt_mesh_prov_enable - bt_mesh_prov_disable - bt_mesh_init - bt_mesh_reset - bt_mesh_provision - bt_mesh_is_provisioned -========================= -api in event_groups.h: -========================= -api in queue.h: - xQueueGenericSend - xQueueReceive - xQueueGenericSendFromISR - xQueueGiveFromISR - xQueueReceiveFromISR - xQueueCreateCountingSemaphore - xQueueSemaphoreTake - xQueueGenericCreate - xQueueGenericCreateStatic - xQueueCreateSet - xQueueAddToSet - xQueueSelectFromSet - vQueueWaitForMessageRestricted - xQueueGenericReset -========================= -api in semphr.h: -========================= -api in task.h: - xTaskCreate - xTaskCreateStatic - vTaskDelay - vTaskStartScheduler - vTaskSuspendAll - xTaskResumeAll - xTaskGetTickCount - xTaskGetTickCountFromISR - xTaskIncrementTick - vTaskPlaceOnEventList - vTaskPlaceOnEventListRestricted - xTaskRemoveFromEventList - vTaskSwitchContext - xTaskCheckForTimeOut - vTaskMissedYield - xTaskGetSchedulerState - xTaskPriorityInherit - xTaskPriorityDisinherit - vTaskPriorityDisinheritAfterTimeout - pvTaskIncrementMutexHeldCount - vTaskInternalSetTimeOutState -========================= -api in timers.h: - xTimerCreate - pvTimerGetTimerID - vTimerSetTimerID - xTimerGetExpiryTime - xTimerCreateTimerTask - xTimerGenericCommand -========================= -api in portable.h: - pxPortInitialiseStack - pvPortMalloc - vPortFree - xPortStartScheduler diff --git a/bundles/typical/meta.json b/bundles/typical/ING9188xx/meta.json similarity index 91% rename from bundles/typical/meta.json rename to bundles/typical/ING9188xx/meta.json index 3724ad1da..61ffd9294 100644 --- a/bundles/typical/meta.json +++ b/bundles/typical/ING9188xx/meta.json @@ -20,18 +20,14 @@ "gatt_client_discover_primary_services", "gatt_client_discover_primary_services_by_uuid16", "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_discover_characteristics_for_service", "gatt_client_find_included_services_for_service", + "gatt_client_discover_characteristics_for_service", "gatt_client_discover_characteristics_for_handle_range_by_uuid16", "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristics_for_service_by_uuid16", - "gatt_client_discover_characteristics_for_service_by_uuid128", "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic", "gatt_client_read_value_of_characteristic_using_value_handle", "gatt_client_read_value_of_characteristics_by_uuid16", "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic", "gatt_client_read_long_value_of_characteristic_using_value_handle", "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", "gatt_client_read_multiple_characteristic_values", @@ -41,25 +37,16 @@ "gatt_client_write_long_value_of_characteristic", "gatt_client_write_long_value_of_characteristic_with_offset", "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor", "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor", "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor", "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor", "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", "gatt_client_write_client_characteristic_configuration", "gatt_client_prepare_write", "gatt_client_execute_write", "gatt_client_cancel_write", - "gatt_client_deserialize_service", - "gatt_client_deserialize_characteristic", - "gatt_client_deserialize_characteristic_descriptor", - "ble_gatts_find_svc", - "ble_gatts_find_chr", "gatt_client_get_mtu", "gatt_client_is_ready", "gatt_client_listen_for_characteristic_value_updates", @@ -70,6 +57,7 @@ "gap_disconnect_all", "gap_add_whitelist", "gap_remove_whitelist", + "gap_clear_white_lists", "gap_read_rssi", "gap_read_remote_used_features", "gap_read_remote_info", @@ -199,12 +187,32 @@ "kv_value_modified", "kv_visit", "xQueueGenericSend", + "xQueuePeek", + "xQueuePeekFromISR", "xQueueReceive", + "uxQueueMessagesWaiting", + "uxQueueSpacesAvailable", + "vQueueDelete", "xQueueGenericSendFromISR", "xQueueGiveFromISR", + "xQueueReceiveFromISR", + "xQueueIsQueueEmptyFromISR", + "xQueueIsQueueFullFromISR", + "uxQueueMessagesWaitingFromISR", + "xQueueCreateMutex", + "xQueueCreateMutexStatic", + "xQueueCreateCountingSemaphore", + "xQueueCreateCountingSemaphoreStatic", "xQueueSemaphoreTake", + "xQueueTakeMutexRecursive", + "xQueueGiveMutexRecursive", "xQueueGenericCreate", "xQueueGenericCreateStatic", + "xQueueCreateSet", + "xQueueAddToSet", + "xQueueRemoveFromSet", + "xQueueSelectFromSet", + "xQueueSelectFromSetFromISR", "vQueueWaitForMessageRestricted", "xQueueGenericReset", "xTaskCreate", @@ -219,6 +227,7 @@ "vTaskPlaceOnEventListRestricted", "xTaskRemoveFromEventList", "vTaskSwitchContext", + "xTaskGetCurrentTaskHandle", "xTaskCheckForTimeOut", "vTaskMissedYield", "xTaskGetSchedulerState", @@ -244,15 +253,15 @@ }, "ram": { "base": 536880208, - "size": 30560 + "size": 30608 }, "rom": { "base": 16384, - "size": 132252 + "size": 133936 }, "version": [ 0, - 14, - 7 + 15, + 0 ] } \ No newline at end of file diff --git a/bundles/typical/ING9188xx/platform.bin b/bundles/typical/ING9188xx/platform.bin new file mode 100644 index 0000000000000000000000000000000000000000..8f20a0f1c8520065fba523bbc58b0a1416cdc14c GIT binary patch literal 133460 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⪼sDjp+ijuP^vXuhkfB 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
+HjO5pjJchO)U8i%@dJI;%fuh0eelZZn*U!BWYn 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 literal 0 HcmV?d00001 diff --git a/bundles/typical/ING9188xx/symdefs.g b/bundles/typical/ING9188xx/symdefs.g new file mode 100644 index 000000000..be443af76 --- /dev/null +++ b/bundles/typical/ING9188xx/symdefs.g @@ -0,0 +1,247 @@ +att_dispatch_client_can_send_now = 0x00005985; +att_dispatch_client_request_can_send_now_event = 0x0000598d; +att_dispatch_register_client = 0x000059a5; +att_dispatch_register_server = 0x000059b9; +att_dispatch_server_can_send_now = 0x000059cd; +att_dispatch_server_request_can_send_now_event = 0x000059d5; +att_emit_general_event = 0x00005aa5; +att_server_can_send_packet_now = 0x00006235; +att_server_get_mtu = 0x00006239; +att_server_indicate = 0x000062ad; +att_server_init = 0x00006331; +att_server_notify = 0x0000636d; +att_server_register_packet_handler = 0x00006455; +att_server_request_can_send_now_event = 0x00006461; +att_set_db = 0x0000647d; +att_set_read_callback = 0x00006491; +att_set_write_callback = 0x0000649d; +bd_addr_cmp = 0x000065e1; +bd_addr_copy = 0x000065e7; +bd_addr_to_str = 0x000065f1; +big_endian_read_16 = 0x00006629; +big_endian_read_32 = 0x00006631; +big_endian_store_16 = 0x00006645; +big_endian_store_32 = 0x00006651; +btstack_push_user_msg = 0x000069b5; +char_for_nibble = 0x00006c0d; +eTaskConfirmSleepModeStatus = 0x00006e99; +gap_add_dev_to_periodic_list = 0x000077a5; +gap_add_whitelist = 0x000077bd; +gap_aes_encrypt = 0x000077d1; +gap_clear_white_lists = 0x000077f9; +gap_clr_adv_set = 0x00007809; +gap_clr_periodic_adv_list = 0x00007819; +gap_create_connection_cancel = 0x00007875; +gap_disconnect = 0x00007885; +gap_disconnect_all = 0x000078b1; +gap_ext_create_connection = 0x00007959; +gap_get_connection_parameter_range = 0x00007a1d; +gap_le_read_channel_map = 0x00007a5d; +gap_periodic_adv_create_sync = 0x00007b6d; +gap_periodic_adv_create_sync_cancel = 0x00007b91; +gap_periodic_adv_term_sync = 0x00007ba1; +gap_read_periodic_adv_list_size = 0x00007c35; +gap_read_phy = 0x00007c45; +gap_read_remote_info = 0x00007c59; +gap_read_remote_used_features = 0x00007c6d; +gap_read_rssi = 0x00007c81; +gap_remove_whitelist = 0x00007c95; +gap_rmv_adv_set = 0x00007d21; +gap_rmv_dev_from_periodic_list = 0x00007d35; +gap_set_adv_set_random_addr = 0x00007d75; +gap_set_connection_parameter_range = 0x00007dc1; +gap_set_def_phy = 0x00007dd9; +gap_set_ext_adv_data = 0x00007df1; +gap_set_ext_adv_enable = 0x00007e09; +gap_set_ext_adv_para = 0x00007e85; +gap_set_ext_scan_enable = 0x00007f65; +gap_set_ext_scan_para = 0x00007f7d; +gap_set_ext_scan_response_data = 0x00008025; +gap_set_host_channel_classification = 0x0000803d; +gap_set_periodic_adv_data = 0x00008051; +gap_set_periodic_adv_enable = 0x000080c5; +gap_set_periodic_adv_para = 0x000080d9; +gap_set_phy = 0x000080f1; +gap_set_random_device_address = 0x0000810d; +gap_start_ccm = 0x00008171; +gap_update_connection_parameters = 0x000081b9; +gatt_client_cancel_write = 0x00008675; +gatt_client_discover_characteristic_descriptors = 0x0000869b; +gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x000086dd; +gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x0000872d; +gatt_client_discover_characteristics_for_service = 0x0000877d; +gatt_client_discover_primary_services = 0x000087b3; +gatt_client_discover_primary_services_by_uuid128 = 0x000087e5; +gatt_client_discover_primary_services_by_uuid16 = 0x00008829; +gatt_client_execute_write = 0x00008865; +gatt_client_find_included_services_for_service = 0x0000888b; +gatt_client_get_mtu = 0x000088b9; +gatt_client_is_ready = 0x00008961; +gatt_client_listen_for_characteristic_value_updates = 0x00008977; +gatt_client_prepare_write = 0x0000899b; +gatt_client_pts_suppress_mtu_exchange = 0x000089d9; +gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x000089e5; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x00008a0f; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00008a15; +gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00008a43; +gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00008a49; +gatt_client_read_multiple_characteristic_values = 0x00008a77; +gatt_client_read_value_of_characteristic_using_value_handle = 0x00008aa7; +gatt_client_read_value_of_characteristics_by_uuid128 = 0x00008ad5; +gatt_client_read_value_of_characteristics_by_uuid16 = 0x00008b21; +gatt_client_register_handler = 0x00008b6d; +gatt_client_reliable_write_long_value_of_characteristic = 0x00008b79; +gatt_client_signed_write_without_response = 0x00008fa5; +gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x00009069; +gatt_client_write_client_characteristic_configuration = 0x000090a3; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x000090f5; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00009105; +gatt_client_write_long_value_of_characteristic = 0x00009141; +gatt_client_write_long_value_of_characteristic_with_offset = 0x00009151; +gatt_client_write_value_of_characteristic = 0x0000918d; +gatt_client_write_value_of_characteristic_without_response = 0x000091c3; +hci_add_event_handler = 0x0000b429; +hci_power_control = 0x0000bb71; +hci_register_acl_packet_handler = 0x0000bd25; +kv_get = 0x0000c3a5; +kv_init = 0x0000c3bd; +kv_put = 0x0000c40d; +kv_remove = 0x0000c485; +kv_value_modified = 0x0000c4f5; +kv_visit = 0x0000c4f9; +l2cap_can_send_fixed_channel_packet_now = 0x0000c5b9; +l2cap_can_send_packet_now = 0x0000c5bd; +l2cap_create_channel = 0x0000c76d; +l2cap_disconnect = 0x0000c8a5; +l2cap_get_remote_mtu_for_local_cid = 0x0000cb49; +l2cap_init = 0x0000cfb9; +l2cap_le_send_flow_control_credit = 0x0000d001; +l2cap_max_le_mtu = 0x0000d261; +l2cap_max_mtu = 0x0000d265; +l2cap_next_local_cid = 0x0000d269; +l2cap_next_sig_id = 0x0000d279; +l2cap_register_fixed_channel = 0x0000d311; +l2cap_register_packet_handler = 0x0000d32d; +l2cap_register_service = 0x0000d339; +l2cap_request_can_send_fix_channel_now_event = 0x0000d421; +l2cap_request_can_send_now_event = 0x0000d445; +l2cap_request_connection_parameter_update = 0x0000d45f; +l2cap_require_security_level_2_for_outgoing_sdp = 0x0000d491; +l2cap_send = 0x0000d855; +l2cap_send_connectionless = 0x0000d8cd; +l2cap_send_connectionless3 = 0x0000d95d; +l2cap_send_echo_request = 0x0000d9f5; +l2cap_send_signaling_le = 0x0000da59; +l2cap_unregister_service = 0x0000dab1; +ll_hint_on_ce_len = 0x0000dc95; +ll_set_adv_coded_scheme = 0x0000df71; +ll_set_initiating_coded_scheme = 0x0000dfa1; +nibble_for_char = 0x0001c861; +platform_config = 0x0001c905; +platform_get_heap_status = 0x0001c941; +platform_get_version = 0x0001c959; +platform_printf = 0x0001c961; +platform_raise_assertion = 0x0001c975; +platform_reset = 0x0001c989; +platform_set_evt_callback = 0x0001c9bd; +platform_set_irq_callback = 0x0001c9d1; +platform_set_rf_clk_source = 0x0001ca09; +platform_set_rf_init_data = 0x0001ca15; +platform_set_rf_power_mapping = 0x0001ca21; +platform_shutdown = 0x0001ca2d; +platform_switch_app = 0x0001ca31; +printf_hexdump = 0x0001d721; +pvPortMalloc = 0x0001e21d; +pvTaskIncrementMutexHeldCount = 0x0001e305; +pvTimerGetTimerID = 0x0001e31d; +pxPortInitialiseStack = 0x0001e349; +reverse_128 = 0x0001e4f1; +reverse_24 = 0x0001e4f7; +reverse_48 = 0x0001e4fd; +reverse_56 = 0x0001e503; +reverse_64 = 0x0001e509; +reverse_bd_addr = 0x0001e50f; +reverse_bytes = 0x0001e515; +sm_add_event_handler = 0x0001e675; +sm_address_resolution_lookup = 0x0001e7a9; +sm_authenticated = 0x0001e883; +sm_authorization_decline = 0x0001e899; +sm_authorization_grant = 0x0001e8b9; +sm_authorization_state = 0x0001e8d9; +sm_bonding_decline = 0x0001e8f5; +sm_config = 0x0001eccd; +sm_encryption_key_size = 0x0001edd9; +sm_just_works_confirm = 0x0001f559; +sm_le_device_key = 0x0001f7a9; +sm_passkey_input = 0x0001f841; +sm_private_random_address_generation_get = 0x0001fbcd; +sm_private_random_address_generation_get_mode = 0x0001fbd5; +sm_private_random_address_generation_set_mode = 0x0001fbe1; +sm_private_random_address_generation_set_update_period = 0x0001fc09; +sm_register_oob_data_callback = 0x0001fc41; +sm_request_pairing = 0x0001fc4d; +sm_send_security_request = 0x0002067f; +sm_set_accepted_stk_generation_methods = 0x000206a5; +sm_set_authentication_requirements = 0x000206b1; +sm_set_encryption_key_size_range = 0x000206bd; +sscanf_bd_addr = 0x000209b1; +sysSetPublicDeviceAddr = 0x00020ced; +uuid128_to_str = 0x000211d1; +uuid_add_bluetooth_prefix = 0x00021229; +uuid_has_bluetooth_prefix = 0x00021249; +uxQueueMessagesWaiting = 0x0002128d; +uxQueueMessagesWaitingFromISR = 0x000212b5; +uxQueueSpacesAvailable = 0x000212d1; +vPortFree = 0x00021401; +vQueueDelete = 0x000215d1; +vQueueWaitForMessageRestricted = 0x000215fd; +vTaskDelay = 0x00021645; +vTaskInternalSetTimeOutState = 0x00021691; +vTaskMissedYield = 0x000216a1; +vTaskPlaceOnEventList = 0x000216ad; +vTaskPlaceOnEventListRestricted = 0x000216e5; +vTaskPriorityDisinheritAfterTimeout = 0x00021725; +vTaskStartScheduler = 0x000217d1; +vTaskStepTick = 0x00021861; +vTaskSuspendAll = 0x00021891; +vTaskSwitchContext = 0x000218a1; +xPortStartScheduler = 0x00021949; +xQueueAddToSet = 0x00021a05; +xQueueCreateCountingSemaphore = 0x00021a29; +xQueueCreateCountingSemaphoreStatic = 0x00021a65; +xQueueCreateMutex = 0x00021aa9; +xQueueCreateMutexStatic = 0x00021abf; +xQueueCreateSet = 0x00021ad9; +xQueueGenericCreate = 0x00021ae1; +xQueueGenericCreateStatic = 0x00021b2d; +xQueueGenericReset = 0x00021b95; +xQueueGenericSend = 0x00021c21; +xQueueGenericSendFromISR = 0x00021d8d; +xQueueGiveFromISR = 0x00021e4d; +xQueueGiveMutexRecursive = 0x00021ef1; +xQueueIsQueueEmptyFromISR = 0x00021f31; +xQueueIsQueueFullFromISR = 0x00021f55; +xQueuePeek = 0x00021f7d; +xQueuePeekFromISR = 0x000220a5; +xQueueReceive = 0x00022111; +xQueueReceiveFromISR = 0x0002223d; +xQueueRemoveFromSet = 0x000222d1; +xQueueSelectFromSet = 0x000222f3; +xQueueSelectFromSetFromISR = 0x00022305; +xQueueSemaphoreTake = 0x00022319; +xQueueTakeMutexRecursive = 0x00022485; +xTaskCheckForTimeOut = 0x000224c9; +xTaskCreate = 0x00022539; +xTaskCreateStatic = 0x00022595; +xTaskGetCurrentTaskHandle = 0x00022605; +xTaskGetSchedulerState = 0x00022611; +xTaskGetTickCount = 0x0002262d; +xTaskIncrementTick = 0x00022639; +xTaskPriorityDisinherit = 0x00022705; +xTaskPriorityInherit = 0x00022799; +xTaskRemoveFromEventList = 0x0002282d; +xTaskResumeAll = 0x000228ad; +xTimerCreate = 0x00022975; +xTimerCreateStatic = 0x000229a9; +xTimerCreateTimerTask = 0x000229e1; +xTimerGenericCommand = 0x00022a4d; diff --git a/bundles/typical/ING9188xx/symdefs.i b/bundles/typical/ING9188xx/symdefs.i new file mode 100644 index 000000000..29b7c1f53 --- /dev/null +++ b/bundles/typical/ING9188xx/symdefs.i @@ -0,0 +1,247 @@ +--define_symbol att_dispatch_client_can_send_now=0x00005985 +--define_symbol att_dispatch_client_request_can_send_now_event=0x0000598d +--define_symbol att_dispatch_register_client=0x000059a5 +--define_symbol att_dispatch_register_server=0x000059b9 +--define_symbol att_dispatch_server_can_send_now=0x000059cd +--define_symbol att_dispatch_server_request_can_send_now_event=0x000059d5 +--define_symbol att_emit_general_event=0x00005aa5 +--define_symbol att_server_can_send_packet_now=0x00006235 +--define_symbol att_server_get_mtu=0x00006239 +--define_symbol att_server_indicate=0x000062ad +--define_symbol att_server_init=0x00006331 +--define_symbol att_server_notify=0x0000636d +--define_symbol att_server_register_packet_handler=0x00006455 +--define_symbol att_server_request_can_send_now_event=0x00006461 +--define_symbol att_set_db=0x0000647d +--define_symbol att_set_read_callback=0x00006491 +--define_symbol att_set_write_callback=0x0000649d +--define_symbol bd_addr_cmp=0x000065e1 +--define_symbol bd_addr_copy=0x000065e7 +--define_symbol bd_addr_to_str=0x000065f1 +--define_symbol big_endian_read_16=0x00006629 +--define_symbol big_endian_read_32=0x00006631 +--define_symbol big_endian_store_16=0x00006645 +--define_symbol big_endian_store_32=0x00006651 +--define_symbol btstack_push_user_msg=0x000069b5 +--define_symbol char_for_nibble=0x00006c0d +--define_symbol eTaskConfirmSleepModeStatus=0x00006e99 +--define_symbol gap_add_dev_to_periodic_list=0x000077a5 +--define_symbol gap_add_whitelist=0x000077bd +--define_symbol gap_aes_encrypt=0x000077d1 +--define_symbol gap_clear_white_lists=0x000077f9 +--define_symbol gap_clr_adv_set=0x00007809 +--define_symbol gap_clr_periodic_adv_list=0x00007819 +--define_symbol gap_create_connection_cancel=0x00007875 +--define_symbol gap_disconnect=0x00007885 +--define_symbol gap_disconnect_all=0x000078b1 +--define_symbol gap_ext_create_connection=0x00007959 +--define_symbol gap_get_connection_parameter_range=0x00007a1d +--define_symbol gap_le_read_channel_map=0x00007a5d +--define_symbol gap_periodic_adv_create_sync=0x00007b6d +--define_symbol gap_periodic_adv_create_sync_cancel=0x00007b91 +--define_symbol gap_periodic_adv_term_sync=0x00007ba1 +--define_symbol gap_read_periodic_adv_list_size=0x00007c35 +--define_symbol gap_read_phy=0x00007c45 +--define_symbol gap_read_remote_info=0x00007c59 +--define_symbol gap_read_remote_used_features=0x00007c6d +--define_symbol gap_read_rssi=0x00007c81 +--define_symbol gap_remove_whitelist=0x00007c95 +--define_symbol gap_rmv_adv_set=0x00007d21 +--define_symbol gap_rmv_dev_from_periodic_list=0x00007d35 +--define_symbol gap_set_adv_set_random_addr=0x00007d75 +--define_symbol gap_set_connection_parameter_range=0x00007dc1 +--define_symbol gap_set_def_phy=0x00007dd9 +--define_symbol gap_set_ext_adv_data=0x00007df1 +--define_symbol gap_set_ext_adv_enable=0x00007e09 +--define_symbol gap_set_ext_adv_para=0x00007e85 +--define_symbol gap_set_ext_scan_enable=0x00007f65 +--define_symbol gap_set_ext_scan_para=0x00007f7d +--define_symbol gap_set_ext_scan_response_data=0x00008025 +--define_symbol gap_set_host_channel_classification=0x0000803d +--define_symbol gap_set_periodic_adv_data=0x00008051 +--define_symbol gap_set_periodic_adv_enable=0x000080c5 +--define_symbol gap_set_periodic_adv_para=0x000080d9 +--define_symbol gap_set_phy=0x000080f1 +--define_symbol gap_set_random_device_address=0x0000810d +--define_symbol gap_start_ccm=0x00008171 +--define_symbol gap_update_connection_parameters=0x000081b9 +--define_symbol gatt_client_cancel_write=0x00008675 +--define_symbol gatt_client_discover_characteristic_descriptors=0x0000869b +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000086dd +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000872d +--define_symbol gatt_client_discover_characteristics_for_service=0x0000877d +--define_symbol gatt_client_discover_primary_services=0x000087b3 +--define_symbol gatt_client_discover_primary_services_by_uuid128=0x000087e5 +--define_symbol gatt_client_discover_primary_services_by_uuid16=0x00008829 +--define_symbol gatt_client_execute_write=0x00008865 +--define_symbol gatt_client_find_included_services_for_service=0x0000888b +--define_symbol gatt_client_get_mtu=0x000088b9 +--define_symbol gatt_client_is_ready=0x00008961 +--define_symbol gatt_client_listen_for_characteristic_value_updates=0x00008977 +--define_symbol gatt_client_prepare_write=0x0000899b +--define_symbol gatt_client_pts_suppress_mtu_exchange=0x000089d9 +--define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x000089e5 +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00008a0f +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008a15 +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008a43 +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008a49 +--define_symbol gatt_client_read_multiple_characteristic_values=0x00008a77 +--define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x00008aa7 +--define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00008ad5 +--define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00008b21 +--define_symbol gatt_client_register_handler=0x00008b6d +--define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x00008b79 +--define_symbol gatt_client_signed_write_without_response=0x00008fa5 +--define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009069 +--define_symbol gatt_client_write_client_characteristic_configuration=0x000090a3 +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000090f5 +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009105 +--define_symbol gatt_client_write_long_value_of_characteristic=0x00009141 +--define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00009151 +--define_symbol gatt_client_write_value_of_characteristic=0x0000918d +--define_symbol gatt_client_write_value_of_characteristic_without_response=0x000091c3 +--define_symbol hci_add_event_handler=0x0000b429 +--define_symbol hci_power_control=0x0000bb71 +--define_symbol hci_register_acl_packet_handler=0x0000bd25 +--define_symbol kv_get=0x0000c3a5 +--define_symbol kv_init=0x0000c3bd +--define_symbol kv_put=0x0000c40d +--define_symbol kv_remove=0x0000c485 +--define_symbol kv_value_modified=0x0000c4f5 +--define_symbol kv_visit=0x0000c4f9 +--define_symbol l2cap_can_send_fixed_channel_packet_now=0x0000c5b9 +--define_symbol l2cap_can_send_packet_now=0x0000c5bd +--define_symbol l2cap_create_channel=0x0000c76d +--define_symbol l2cap_disconnect=0x0000c8a5 +--define_symbol l2cap_get_remote_mtu_for_local_cid=0x0000cb49 +--define_symbol l2cap_init=0x0000cfb9 +--define_symbol l2cap_le_send_flow_control_credit=0x0000d001 +--define_symbol l2cap_max_le_mtu=0x0000d261 +--define_symbol l2cap_max_mtu=0x0000d265 +--define_symbol l2cap_next_local_cid=0x0000d269 +--define_symbol l2cap_next_sig_id=0x0000d279 +--define_symbol l2cap_register_fixed_channel=0x0000d311 +--define_symbol l2cap_register_packet_handler=0x0000d32d +--define_symbol l2cap_register_service=0x0000d339 +--define_symbol l2cap_request_can_send_fix_channel_now_event=0x0000d421 +--define_symbol l2cap_request_can_send_now_event=0x0000d445 +--define_symbol l2cap_request_connection_parameter_update=0x0000d45f +--define_symbol l2cap_require_security_level_2_for_outgoing_sdp=0x0000d491 +--define_symbol l2cap_send=0x0000d855 +--define_symbol l2cap_send_connectionless=0x0000d8cd +--define_symbol l2cap_send_connectionless3=0x0000d95d +--define_symbol l2cap_send_echo_request=0x0000d9f5 +--define_symbol l2cap_send_signaling_le=0x0000da59 +--define_symbol l2cap_unregister_service=0x0000dab1 +--define_symbol ll_hint_on_ce_len=0x0000dc95 +--define_symbol ll_set_adv_coded_scheme=0x0000df71 +--define_symbol ll_set_initiating_coded_scheme=0x0000dfa1 +--define_symbol nibble_for_char=0x0001c861 +--define_symbol platform_config=0x0001c905 +--define_symbol platform_get_heap_status=0x0001c941 +--define_symbol platform_get_version=0x0001c959 +--define_symbol platform_printf=0x0001c961 +--define_symbol platform_raise_assertion=0x0001c975 +--define_symbol platform_reset=0x0001c989 +--define_symbol platform_set_evt_callback=0x0001c9bd +--define_symbol platform_set_irq_callback=0x0001c9d1 +--define_symbol platform_set_rf_clk_source=0x0001ca09 +--define_symbol platform_set_rf_init_data=0x0001ca15 +--define_symbol platform_set_rf_power_mapping=0x0001ca21 +--define_symbol platform_shutdown=0x0001ca2d +--define_symbol platform_switch_app=0x0001ca31 +--define_symbol printf_hexdump=0x0001d721 +--define_symbol pvPortMalloc=0x0001e21d +--define_symbol pvTaskIncrementMutexHeldCount=0x0001e305 +--define_symbol pvTimerGetTimerID=0x0001e31d +--define_symbol pxPortInitialiseStack=0x0001e349 +--define_symbol reverse_128=0x0001e4f1 +--define_symbol reverse_24=0x0001e4f7 +--define_symbol reverse_48=0x0001e4fd +--define_symbol reverse_56=0x0001e503 +--define_symbol reverse_64=0x0001e509 +--define_symbol reverse_bd_addr=0x0001e50f +--define_symbol reverse_bytes=0x0001e515 +--define_symbol sm_add_event_handler=0x0001e675 +--define_symbol sm_address_resolution_lookup=0x0001e7a9 +--define_symbol sm_authenticated=0x0001e883 +--define_symbol sm_authorization_decline=0x0001e899 +--define_symbol sm_authorization_grant=0x0001e8b9 +--define_symbol sm_authorization_state=0x0001e8d9 +--define_symbol sm_bonding_decline=0x0001e8f5 +--define_symbol sm_config=0x0001eccd +--define_symbol sm_encryption_key_size=0x0001edd9 +--define_symbol sm_just_works_confirm=0x0001f559 +--define_symbol sm_le_device_key=0x0001f7a9 +--define_symbol sm_passkey_input=0x0001f841 +--define_symbol sm_private_random_address_generation_get=0x0001fbcd +--define_symbol sm_private_random_address_generation_get_mode=0x0001fbd5 +--define_symbol sm_private_random_address_generation_set_mode=0x0001fbe1 +--define_symbol sm_private_random_address_generation_set_update_period=0x0001fc09 +--define_symbol sm_register_oob_data_callback=0x0001fc41 +--define_symbol sm_request_pairing=0x0001fc4d +--define_symbol sm_send_security_request=0x0002067f +--define_symbol sm_set_accepted_stk_generation_methods=0x000206a5 +--define_symbol sm_set_authentication_requirements=0x000206b1 +--define_symbol sm_set_encryption_key_size_range=0x000206bd +--define_symbol sscanf_bd_addr=0x000209b1 +--define_symbol sysSetPublicDeviceAddr=0x00020ced +--define_symbol uuid128_to_str=0x000211d1 +--define_symbol uuid_add_bluetooth_prefix=0x00021229 +--define_symbol uuid_has_bluetooth_prefix=0x00021249 +--define_symbol uxQueueMessagesWaiting=0x0002128d +--define_symbol uxQueueMessagesWaitingFromISR=0x000212b5 +--define_symbol uxQueueSpacesAvailable=0x000212d1 +--define_symbol vPortFree=0x00021401 +--define_symbol vQueueDelete=0x000215d1 +--define_symbol vQueueWaitForMessageRestricted=0x000215fd +--define_symbol vTaskDelay=0x00021645 +--define_symbol vTaskInternalSetTimeOutState=0x00021691 +--define_symbol vTaskMissedYield=0x000216a1 +--define_symbol vTaskPlaceOnEventList=0x000216ad +--define_symbol vTaskPlaceOnEventListRestricted=0x000216e5 +--define_symbol vTaskPriorityDisinheritAfterTimeout=0x00021725 +--define_symbol vTaskStartScheduler=0x000217d1 +--define_symbol vTaskStepTick=0x00021861 +--define_symbol vTaskSuspendAll=0x00021891 +--define_symbol vTaskSwitchContext=0x000218a1 +--define_symbol xPortStartScheduler=0x00021949 +--define_symbol xQueueAddToSet=0x00021a05 +--define_symbol xQueueCreateCountingSemaphore=0x00021a29 +--define_symbol xQueueCreateCountingSemaphoreStatic=0x00021a65 +--define_symbol xQueueCreateMutex=0x00021aa9 +--define_symbol xQueueCreateMutexStatic=0x00021abf +--define_symbol xQueueCreateSet=0x00021ad9 +--define_symbol xQueueGenericCreate=0x00021ae1 +--define_symbol xQueueGenericCreateStatic=0x00021b2d +--define_symbol xQueueGenericReset=0x00021b95 +--define_symbol xQueueGenericSend=0x00021c21 +--define_symbol xQueueGenericSendFromISR=0x00021d8d +--define_symbol xQueueGiveFromISR=0x00021e4d +--define_symbol xQueueGiveMutexRecursive=0x00021ef1 +--define_symbol xQueueIsQueueEmptyFromISR=0x00021f31 +--define_symbol xQueueIsQueueFullFromISR=0x00021f55 +--define_symbol xQueuePeek=0x00021f7d +--define_symbol xQueuePeekFromISR=0x000220a5 +--define_symbol xQueueReceive=0x00022111 +--define_symbol xQueueReceiveFromISR=0x0002223d +--define_symbol xQueueRemoveFromSet=0x000222d1 +--define_symbol xQueueSelectFromSet=0x000222f3 +--define_symbol xQueueSelectFromSetFromISR=0x00022305 +--define_symbol xQueueSemaphoreTake=0x00022319 +--define_symbol xQueueTakeMutexRecursive=0x00022485 +--define_symbol xTaskCheckForTimeOut=0x000224c9 +--define_symbol xTaskCreate=0x00022539 +--define_symbol xTaskCreateStatic=0x00022595 +--define_symbol xTaskGetCurrentTaskHandle=0x00022605 +--define_symbol xTaskGetSchedulerState=0x00022611 +--define_symbol xTaskGetTickCount=0x0002262d +--define_symbol xTaskIncrementTick=0x00022639 +--define_symbol xTaskPriorityDisinherit=0x00022705 +--define_symbol xTaskPriorityInherit=0x00022799 +--define_symbol xTaskRemoveFromEventList=0x0002282d +--define_symbol xTaskResumeAll=0x000228ad +--define_symbol xTimerCreate=0x00022975 +--define_symbol xTimerCreateStatic=0x000229a9 +--define_symbol xTimerCreateTimerTask=0x000229e1 +--define_symbol xTimerGenericCommand=0x00022a4d diff --git a/bundles/typical/ING9188xx/symdefs.m b/bundles/typical/ING9188xx/symdefs.m new file mode 100644 index 000000000..18f57f366 --- /dev/null +++ b/bundles/typical/ING9188xx/symdefs.m @@ -0,0 +1,248 @@ +## ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 +0x00005985 T att_dispatch_client_can_send_now +0x0000598d T att_dispatch_client_request_can_send_now_event +0x000059a5 T att_dispatch_register_client +0x000059b9 T att_dispatch_register_server +0x000059cd T att_dispatch_server_can_send_now +0x000059d5 T att_dispatch_server_request_can_send_now_event +0x00005aa5 T att_emit_general_event +0x00006235 T att_server_can_send_packet_now +0x00006239 T att_server_get_mtu +0x000062ad T att_server_indicate +0x00006331 T att_server_init +0x0000636d T att_server_notify +0x00006455 T att_server_register_packet_handler +0x00006461 T att_server_request_can_send_now_event +0x0000647d T att_set_db +0x00006491 T att_set_read_callback +0x0000649d T att_set_write_callback +0x000065e1 T bd_addr_cmp +0x000065e7 T bd_addr_copy +0x000065f1 T bd_addr_to_str +0x00006629 T big_endian_read_16 +0x00006631 T big_endian_read_32 +0x00006645 T big_endian_store_16 +0x00006651 T big_endian_store_32 +0x000069b5 T btstack_push_user_msg +0x00006c0d T char_for_nibble +0x00006e99 T eTaskConfirmSleepModeStatus +0x000077a5 T gap_add_dev_to_periodic_list +0x000077bd T gap_add_whitelist +0x000077d1 T gap_aes_encrypt +0x000077f9 T gap_clear_white_lists +0x00007809 T gap_clr_adv_set +0x00007819 T gap_clr_periodic_adv_list +0x00007875 T gap_create_connection_cancel +0x00007885 T gap_disconnect +0x000078b1 T gap_disconnect_all +0x00007959 T gap_ext_create_connection +0x00007a1d T gap_get_connection_parameter_range +0x00007a5d T gap_le_read_channel_map +0x00007b6d T gap_periodic_adv_create_sync +0x00007b91 T gap_periodic_adv_create_sync_cancel +0x00007ba1 T gap_periodic_adv_term_sync +0x00007c35 T gap_read_periodic_adv_list_size +0x00007c45 T gap_read_phy +0x00007c59 T gap_read_remote_info +0x00007c6d T gap_read_remote_used_features +0x00007c81 T gap_read_rssi +0x00007c95 T gap_remove_whitelist +0x00007d21 T gap_rmv_adv_set +0x00007d35 T gap_rmv_dev_from_periodic_list +0x00007d75 T gap_set_adv_set_random_addr +0x00007dc1 T gap_set_connection_parameter_range +0x00007dd9 T gap_set_def_phy +0x00007df1 T gap_set_ext_adv_data +0x00007e09 T gap_set_ext_adv_enable +0x00007e85 T gap_set_ext_adv_para +0x00007f65 T gap_set_ext_scan_enable +0x00007f7d T gap_set_ext_scan_para +0x00008025 T gap_set_ext_scan_response_data +0x0000803d T gap_set_host_channel_classification +0x00008051 T gap_set_periodic_adv_data +0x000080c5 T gap_set_periodic_adv_enable +0x000080d9 T gap_set_periodic_adv_para +0x000080f1 T gap_set_phy +0x0000810d T gap_set_random_device_address +0x00008171 T gap_start_ccm +0x000081b9 T gap_update_connection_parameters +0x00008675 T gatt_client_cancel_write +0x0000869b T gatt_client_discover_characteristic_descriptors +0x000086dd T gatt_client_discover_characteristics_for_handle_range_by_uuid128 +0x0000872d T gatt_client_discover_characteristics_for_handle_range_by_uuid16 +0x0000877d T gatt_client_discover_characteristics_for_service +0x000087b3 T gatt_client_discover_primary_services +0x000087e5 T gatt_client_discover_primary_services_by_uuid128 +0x00008829 T gatt_client_discover_primary_services_by_uuid16 +0x00008865 T gatt_client_execute_write +0x0000888b T gatt_client_find_included_services_for_service +0x000088b9 T gatt_client_get_mtu +0x00008961 T gatt_client_is_ready +0x00008977 T gatt_client_listen_for_characteristic_value_updates +0x0000899b T gatt_client_prepare_write +0x000089d9 T gatt_client_pts_suppress_mtu_exchange +0x000089e5 T gatt_client_read_characteristic_descriptor_using_descriptor_handle +0x00008a0f T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle +0x00008a15 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00008a43 T gatt_client_read_long_value_of_characteristic_using_value_handle +0x00008a49 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset +0x00008a77 T gatt_client_read_multiple_characteristic_values +0x00008aa7 T gatt_client_read_value_of_characteristic_using_value_handle +0x00008ad5 T gatt_client_read_value_of_characteristics_by_uuid128 +0x00008b21 T gatt_client_read_value_of_characteristics_by_uuid16 +0x00008b6d T gatt_client_register_handler +0x00008b79 T gatt_client_reliable_write_long_value_of_characteristic +0x00008fa5 T gatt_client_signed_write_without_response +0x00009069 T gatt_client_write_characteristic_descriptor_using_descriptor_handle +0x000090a3 T gatt_client_write_client_characteristic_configuration +0x000090f5 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle +0x00009105 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00009141 T gatt_client_write_long_value_of_characteristic +0x00009151 T gatt_client_write_long_value_of_characteristic_with_offset +0x0000918d T gatt_client_write_value_of_characteristic +0x000091c3 T gatt_client_write_value_of_characteristic_without_response +0x0000b429 T hci_add_event_handler +0x0000bb71 T hci_power_control +0x0000bd25 T hci_register_acl_packet_handler +0x0000c3a5 T kv_get +0x0000c3bd T kv_init +0x0000c40d T kv_put +0x0000c485 T kv_remove +0x0000c4f5 T kv_value_modified +0x0000c4f9 T kv_visit +0x0000c5b9 T l2cap_can_send_fixed_channel_packet_now +0x0000c5bd T l2cap_can_send_packet_now +0x0000c76d T l2cap_create_channel +0x0000c8a5 T l2cap_disconnect +0x0000cb49 T l2cap_get_remote_mtu_for_local_cid +0x0000cfb9 T l2cap_init +0x0000d001 T l2cap_le_send_flow_control_credit +0x0000d261 T l2cap_max_le_mtu +0x0000d265 T l2cap_max_mtu +0x0000d269 T l2cap_next_local_cid +0x0000d279 T l2cap_next_sig_id +0x0000d311 T l2cap_register_fixed_channel +0x0000d32d T l2cap_register_packet_handler +0x0000d339 T l2cap_register_service +0x0000d421 T l2cap_request_can_send_fix_channel_now_event +0x0000d445 T l2cap_request_can_send_now_event +0x0000d45f T l2cap_request_connection_parameter_update +0x0000d491 T l2cap_require_security_level_2_for_outgoing_sdp +0x0000d855 T l2cap_send +0x0000d8cd T l2cap_send_connectionless +0x0000d95d T l2cap_send_connectionless3 +0x0000d9f5 T l2cap_send_echo_request +0x0000da59 T l2cap_send_signaling_le +0x0000dab1 T l2cap_unregister_service +0x0000dc95 T ll_hint_on_ce_len +0x0000df71 T ll_set_adv_coded_scheme +0x0000dfa1 T ll_set_initiating_coded_scheme +0x0001c861 T nibble_for_char +0x0001c905 T platform_config +0x0001c941 T platform_get_heap_status +0x0001c959 T platform_get_version +0x0001c961 T platform_printf +0x0001c975 T platform_raise_assertion +0x0001c989 T platform_reset +0x0001c9bd T platform_set_evt_callback +0x0001c9d1 T platform_set_irq_callback +0x0001ca09 T platform_set_rf_clk_source +0x0001ca15 T platform_set_rf_init_data +0x0001ca21 T platform_set_rf_power_mapping +0x0001ca2d T platform_shutdown +0x0001ca31 T platform_switch_app +0x0001d721 T printf_hexdump +0x0001e21d T pvPortMalloc +0x0001e305 T pvTaskIncrementMutexHeldCount +0x0001e31d T pvTimerGetTimerID +0x0001e349 T pxPortInitialiseStack +0x0001e4f1 T reverse_128 +0x0001e4f7 T reverse_24 +0x0001e4fd T reverse_48 +0x0001e503 T reverse_56 +0x0001e509 T reverse_64 +0x0001e50f T reverse_bd_addr +0x0001e515 T reverse_bytes +0x0001e675 T sm_add_event_handler +0x0001e7a9 T sm_address_resolution_lookup +0x0001e883 T sm_authenticated +0x0001e899 T sm_authorization_decline +0x0001e8b9 T sm_authorization_grant +0x0001e8d9 T sm_authorization_state +0x0001e8f5 T sm_bonding_decline +0x0001eccd T sm_config +0x0001edd9 T sm_encryption_key_size +0x0001f559 T sm_just_works_confirm +0x0001f7a9 T sm_le_device_key +0x0001f841 T sm_passkey_input +0x0001fbcd T sm_private_random_address_generation_get +0x0001fbd5 T sm_private_random_address_generation_get_mode +0x0001fbe1 T sm_private_random_address_generation_set_mode +0x0001fc09 T sm_private_random_address_generation_set_update_period +0x0001fc41 T sm_register_oob_data_callback +0x0001fc4d T sm_request_pairing +0x0002067f T sm_send_security_request +0x000206a5 T sm_set_accepted_stk_generation_methods +0x000206b1 T sm_set_authentication_requirements +0x000206bd T sm_set_encryption_key_size_range +0x000209b1 T sscanf_bd_addr +0x00020ced T sysSetPublicDeviceAddr +0x000211d1 T uuid128_to_str +0x00021229 T uuid_add_bluetooth_prefix +0x00021249 T uuid_has_bluetooth_prefix +0x0002128d T uxQueueMessagesWaiting +0x000212b5 T uxQueueMessagesWaitingFromISR +0x000212d1 T uxQueueSpacesAvailable +0x00021401 T vPortFree +0x000215d1 T vQueueDelete +0x000215fd T vQueueWaitForMessageRestricted +0x00021645 T vTaskDelay +0x00021691 T vTaskInternalSetTimeOutState +0x000216a1 T vTaskMissedYield +0x000216ad T vTaskPlaceOnEventList +0x000216e5 T vTaskPlaceOnEventListRestricted +0x00021725 T vTaskPriorityDisinheritAfterTimeout +0x000217d1 T vTaskStartScheduler +0x00021861 T vTaskStepTick +0x00021891 T vTaskSuspendAll +0x000218a1 T vTaskSwitchContext +0x00021949 T xPortStartScheduler +0x00021a05 T xQueueAddToSet +0x00021a29 T xQueueCreateCountingSemaphore +0x00021a65 T xQueueCreateCountingSemaphoreStatic +0x00021aa9 T xQueueCreateMutex +0x00021abf T xQueueCreateMutexStatic +0x00021ad9 T xQueueCreateSet +0x00021ae1 T xQueueGenericCreate +0x00021b2d T xQueueGenericCreateStatic +0x00021b95 T xQueueGenericReset +0x00021c21 T xQueueGenericSend +0x00021d8d T xQueueGenericSendFromISR +0x00021e4d T xQueueGiveFromISR +0x00021ef1 T xQueueGiveMutexRecursive +0x00021f31 T xQueueIsQueueEmptyFromISR +0x00021f55 T xQueueIsQueueFullFromISR +0x00021f7d T xQueuePeek +0x000220a5 T xQueuePeekFromISR +0x00022111 T xQueueReceive +0x0002223d T xQueueReceiveFromISR +0x000222d1 T xQueueRemoveFromSet +0x000222f3 T xQueueSelectFromSet +0x00022305 T xQueueSelectFromSetFromISR +0x00022319 T xQueueSemaphoreTake +0x00022485 T xQueueTakeMutexRecursive +0x000224c9 T xTaskCheckForTimeOut +0x00022539 T xTaskCreate +0x00022595 T xTaskCreateStatic +0x00022605 T xTaskGetCurrentTaskHandle +0x00022611 T xTaskGetSchedulerState +0x0002262d T xTaskGetTickCount +0x00022639 T xTaskIncrementTick +0x00022705 T xTaskPriorityDisinherit +0x00022799 T xTaskPriorityInherit +0x0002282d T xTaskRemoveFromEventList +0x000228ad T xTaskResumeAll +0x00022975 T xTimerCreate +0x000229a9 T xTimerCreateStatic +0x000229e1 T xTimerCreateTimerTask +0x00022a4d T xTimerGenericCommand diff --git a/bundles/typical/ING9188xx/symdefs.s b/bundles/typical/ING9188xx/symdefs.s new file mode 100644 index 000000000..2681fe297 --- /dev/null +++ b/bundles/typical/ING9188xx/symdefs.s @@ -0,0 +1,247 @@ +--defsym:att_dispatch_client_can_send_now=0x00005985 +--defsym:att_dispatch_client_request_can_send_now_event=0x0000598d +--defsym:att_dispatch_register_client=0x000059a5 +--defsym:att_dispatch_register_server=0x000059b9 +--defsym:att_dispatch_server_can_send_now=0x000059cd +--defsym:att_dispatch_server_request_can_send_now_event=0x000059d5 +--defsym:att_emit_general_event=0x00005aa5 +--defsym:att_server_can_send_packet_now=0x00006235 +--defsym:att_server_get_mtu=0x00006239 +--defsym:att_server_indicate=0x000062ad +--defsym:att_server_init=0x00006331 +--defsym:att_server_notify=0x0000636d +--defsym:att_server_register_packet_handler=0x00006455 +--defsym:att_server_request_can_send_now_event=0x00006461 +--defsym:att_set_db=0x0000647d +--defsym:att_set_read_callback=0x00006491 +--defsym:att_set_write_callback=0x0000649d +--defsym:bd_addr_cmp=0x000065e1 +--defsym:bd_addr_copy=0x000065e7 +--defsym:bd_addr_to_str=0x000065f1 +--defsym:big_endian_read_16=0x00006629 +--defsym:big_endian_read_32=0x00006631 +--defsym:big_endian_store_16=0x00006645 +--defsym:big_endian_store_32=0x00006651 +--defsym:btstack_push_user_msg=0x000069b5 +--defsym:char_for_nibble=0x00006c0d +--defsym:eTaskConfirmSleepModeStatus=0x00006e99 +--defsym:gap_add_dev_to_periodic_list=0x000077a5 +--defsym:gap_add_whitelist=0x000077bd +--defsym:gap_aes_encrypt=0x000077d1 +--defsym:gap_clear_white_lists=0x000077f9 +--defsym:gap_clr_adv_set=0x00007809 +--defsym:gap_clr_periodic_adv_list=0x00007819 +--defsym:gap_create_connection_cancel=0x00007875 +--defsym:gap_disconnect=0x00007885 +--defsym:gap_disconnect_all=0x000078b1 +--defsym:gap_ext_create_connection=0x00007959 +--defsym:gap_get_connection_parameter_range=0x00007a1d +--defsym:gap_le_read_channel_map=0x00007a5d +--defsym:gap_periodic_adv_create_sync=0x00007b6d +--defsym:gap_periodic_adv_create_sync_cancel=0x00007b91 +--defsym:gap_periodic_adv_term_sync=0x00007ba1 +--defsym:gap_read_periodic_adv_list_size=0x00007c35 +--defsym:gap_read_phy=0x00007c45 +--defsym:gap_read_remote_info=0x00007c59 +--defsym:gap_read_remote_used_features=0x00007c6d +--defsym:gap_read_rssi=0x00007c81 +--defsym:gap_remove_whitelist=0x00007c95 +--defsym:gap_rmv_adv_set=0x00007d21 +--defsym:gap_rmv_dev_from_periodic_list=0x00007d35 +--defsym:gap_set_adv_set_random_addr=0x00007d75 +--defsym:gap_set_connection_parameter_range=0x00007dc1 +--defsym:gap_set_def_phy=0x00007dd9 +--defsym:gap_set_ext_adv_data=0x00007df1 +--defsym:gap_set_ext_adv_enable=0x00007e09 +--defsym:gap_set_ext_adv_para=0x00007e85 +--defsym:gap_set_ext_scan_enable=0x00007f65 +--defsym:gap_set_ext_scan_para=0x00007f7d +--defsym:gap_set_ext_scan_response_data=0x00008025 +--defsym:gap_set_host_channel_classification=0x0000803d +--defsym:gap_set_periodic_adv_data=0x00008051 +--defsym:gap_set_periodic_adv_enable=0x000080c5 +--defsym:gap_set_periodic_adv_para=0x000080d9 +--defsym:gap_set_phy=0x000080f1 +--defsym:gap_set_random_device_address=0x0000810d +--defsym:gap_start_ccm=0x00008171 +--defsym:gap_update_connection_parameters=0x000081b9 +--defsym:gatt_client_cancel_write=0x00008675 +--defsym:gatt_client_discover_characteristic_descriptors=0x0000869b +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000086dd +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000872d +--defsym:gatt_client_discover_characteristics_for_service=0x0000877d +--defsym:gatt_client_discover_primary_services=0x000087b3 +--defsym:gatt_client_discover_primary_services_by_uuid128=0x000087e5 +--defsym:gatt_client_discover_primary_services_by_uuid16=0x00008829 +--defsym:gatt_client_execute_write=0x00008865 +--defsym:gatt_client_find_included_services_for_service=0x0000888b +--defsym:gatt_client_get_mtu=0x000088b9 +--defsym:gatt_client_is_ready=0x00008961 +--defsym:gatt_client_listen_for_characteristic_value_updates=0x00008977 +--defsym:gatt_client_prepare_write=0x0000899b +--defsym:gatt_client_pts_suppress_mtu_exchange=0x000089d9 +--defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x000089e5 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00008a0f +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008a15 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008a43 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008a49 +--defsym:gatt_client_read_multiple_characteristic_values=0x00008a77 +--defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00008aa7 +--defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00008ad5 +--defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00008b21 +--defsym:gatt_client_register_handler=0x00008b6d +--defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00008b79 +--defsym:gatt_client_signed_write_without_response=0x00008fa5 +--defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009069 +--defsym:gatt_client_write_client_characteristic_configuration=0x000090a3 +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000090f5 +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009105 +--defsym:gatt_client_write_long_value_of_characteristic=0x00009141 +--defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00009151 +--defsym:gatt_client_write_value_of_characteristic=0x0000918d +--defsym:gatt_client_write_value_of_characteristic_without_response=0x000091c3 +--defsym:hci_add_event_handler=0x0000b429 +--defsym:hci_power_control=0x0000bb71 +--defsym:hci_register_acl_packet_handler=0x0000bd25 +--defsym:kv_get=0x0000c3a5 +--defsym:kv_init=0x0000c3bd +--defsym:kv_put=0x0000c40d +--defsym:kv_remove=0x0000c485 +--defsym:kv_value_modified=0x0000c4f5 +--defsym:kv_visit=0x0000c4f9 +--defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c5b9 +--defsym:l2cap_can_send_packet_now=0x0000c5bd +--defsym:l2cap_create_channel=0x0000c76d +--defsym:l2cap_disconnect=0x0000c8a5 +--defsym:l2cap_get_remote_mtu_for_local_cid=0x0000cb49 +--defsym:l2cap_init=0x0000cfb9 +--defsym:l2cap_le_send_flow_control_credit=0x0000d001 +--defsym:l2cap_max_le_mtu=0x0000d261 +--defsym:l2cap_max_mtu=0x0000d265 +--defsym:l2cap_next_local_cid=0x0000d269 +--defsym:l2cap_next_sig_id=0x0000d279 +--defsym:l2cap_register_fixed_channel=0x0000d311 +--defsym:l2cap_register_packet_handler=0x0000d32d +--defsym:l2cap_register_service=0x0000d339 +--defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d421 +--defsym:l2cap_request_can_send_now_event=0x0000d445 +--defsym:l2cap_request_connection_parameter_update=0x0000d45f +--defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d491 +--defsym:l2cap_send=0x0000d855 +--defsym:l2cap_send_connectionless=0x0000d8cd +--defsym:l2cap_send_connectionless3=0x0000d95d +--defsym:l2cap_send_echo_request=0x0000d9f5 +--defsym:l2cap_send_signaling_le=0x0000da59 +--defsym:l2cap_unregister_service=0x0000dab1 +--defsym:ll_hint_on_ce_len=0x0000dc95 +--defsym:ll_set_adv_coded_scheme=0x0000df71 +--defsym:ll_set_initiating_coded_scheme=0x0000dfa1 +--defsym:nibble_for_char=0x0001c861 +--defsym:platform_config=0x0001c905 +--defsym:platform_get_heap_status=0x0001c941 +--defsym:platform_get_version=0x0001c959 +--defsym:platform_printf=0x0001c961 +--defsym:platform_raise_assertion=0x0001c975 +--defsym:platform_reset=0x0001c989 +--defsym:platform_set_evt_callback=0x0001c9bd +--defsym:platform_set_irq_callback=0x0001c9d1 +--defsym:platform_set_rf_clk_source=0x0001ca09 +--defsym:platform_set_rf_init_data=0x0001ca15 +--defsym:platform_set_rf_power_mapping=0x0001ca21 +--defsym:platform_shutdown=0x0001ca2d +--defsym:platform_switch_app=0x0001ca31 +--defsym:printf_hexdump=0x0001d721 +--defsym:pvPortMalloc=0x0001e21d +--defsym:pvTaskIncrementMutexHeldCount=0x0001e305 +--defsym:pvTimerGetTimerID=0x0001e31d +--defsym:pxPortInitialiseStack=0x0001e349 +--defsym:reverse_128=0x0001e4f1 +--defsym:reverse_24=0x0001e4f7 +--defsym:reverse_48=0x0001e4fd +--defsym:reverse_56=0x0001e503 +--defsym:reverse_64=0x0001e509 +--defsym:reverse_bd_addr=0x0001e50f +--defsym:reverse_bytes=0x0001e515 +--defsym:sm_add_event_handler=0x0001e675 +--defsym:sm_address_resolution_lookup=0x0001e7a9 +--defsym:sm_authenticated=0x0001e883 +--defsym:sm_authorization_decline=0x0001e899 +--defsym:sm_authorization_grant=0x0001e8b9 +--defsym:sm_authorization_state=0x0001e8d9 +--defsym:sm_bonding_decline=0x0001e8f5 +--defsym:sm_config=0x0001eccd +--defsym:sm_encryption_key_size=0x0001edd9 +--defsym:sm_just_works_confirm=0x0001f559 +--defsym:sm_le_device_key=0x0001f7a9 +--defsym:sm_passkey_input=0x0001f841 +--defsym:sm_private_random_address_generation_get=0x0001fbcd +--defsym:sm_private_random_address_generation_get_mode=0x0001fbd5 +--defsym:sm_private_random_address_generation_set_mode=0x0001fbe1 +--defsym:sm_private_random_address_generation_set_update_period=0x0001fc09 +--defsym:sm_register_oob_data_callback=0x0001fc41 +--defsym:sm_request_pairing=0x0001fc4d +--defsym:sm_send_security_request=0x0002067f +--defsym:sm_set_accepted_stk_generation_methods=0x000206a5 +--defsym:sm_set_authentication_requirements=0x000206b1 +--defsym:sm_set_encryption_key_size_range=0x000206bd +--defsym:sscanf_bd_addr=0x000209b1 +--defsym:sysSetPublicDeviceAddr=0x00020ced +--defsym:uuid128_to_str=0x000211d1 +--defsym:uuid_add_bluetooth_prefix=0x00021229 +--defsym:uuid_has_bluetooth_prefix=0x00021249 +--defsym:uxQueueMessagesWaiting=0x0002128d +--defsym:uxQueueMessagesWaitingFromISR=0x000212b5 +--defsym:uxQueueSpacesAvailable=0x000212d1 +--defsym:vPortFree=0x00021401 +--defsym:vQueueDelete=0x000215d1 +--defsym:vQueueWaitForMessageRestricted=0x000215fd +--defsym:vTaskDelay=0x00021645 +--defsym:vTaskInternalSetTimeOutState=0x00021691 +--defsym:vTaskMissedYield=0x000216a1 +--defsym:vTaskPlaceOnEventList=0x000216ad +--defsym:vTaskPlaceOnEventListRestricted=0x000216e5 +--defsym:vTaskPriorityDisinheritAfterTimeout=0x00021725 +--defsym:vTaskStartScheduler=0x000217d1 +--defsym:vTaskStepTick=0x00021861 +--defsym:vTaskSuspendAll=0x00021891 +--defsym:vTaskSwitchContext=0x000218a1 +--defsym:xPortStartScheduler=0x00021949 +--defsym:xQueueAddToSet=0x00021a05 +--defsym:xQueueCreateCountingSemaphore=0x00021a29 +--defsym:xQueueCreateCountingSemaphoreStatic=0x00021a65 +--defsym:xQueueCreateMutex=0x00021aa9 +--defsym:xQueueCreateMutexStatic=0x00021abf +--defsym:xQueueCreateSet=0x00021ad9 +--defsym:xQueueGenericCreate=0x00021ae1 +--defsym:xQueueGenericCreateStatic=0x00021b2d +--defsym:xQueueGenericReset=0x00021b95 +--defsym:xQueueGenericSend=0x00021c21 +--defsym:xQueueGenericSendFromISR=0x00021d8d +--defsym:xQueueGiveFromISR=0x00021e4d +--defsym:xQueueGiveMutexRecursive=0x00021ef1 +--defsym:xQueueIsQueueEmptyFromISR=0x00021f31 +--defsym:xQueueIsQueueFullFromISR=0x00021f55 +--defsym:xQueuePeek=0x00021f7d +--defsym:xQueuePeekFromISR=0x000220a5 +--defsym:xQueueReceive=0x00022111 +--defsym:xQueueReceiveFromISR=0x0002223d +--defsym:xQueueRemoveFromSet=0x000222d1 +--defsym:xQueueSelectFromSet=0x000222f3 +--defsym:xQueueSelectFromSetFromISR=0x00022305 +--defsym:xQueueSemaphoreTake=0x00022319 +--defsym:xQueueTakeMutexRecursive=0x00022485 +--defsym:xTaskCheckForTimeOut=0x000224c9 +--defsym:xTaskCreate=0x00022539 +--defsym:xTaskCreateStatic=0x00022595 +--defsym:xTaskGetCurrentTaskHandle=0x00022605 +--defsym:xTaskGetSchedulerState=0x00022611 +--defsym:xTaskGetTickCount=0x0002262d +--defsym:xTaskIncrementTick=0x00022639 +--defsym:xTaskPriorityDisinherit=0x00022705 +--defsym:xTaskPriorityInherit=0x00022799 +--defsym:xTaskRemoveFromEventList=0x0002282d +--defsym:xTaskResumeAll=0x000228ad +--defsym:xTimerCreate=0x00022975 +--defsym:xTimerCreateStatic=0x000229a9 +--defsym:xTimerCreateTimerTask=0x000229e1 +--defsym:xTimerGenericCommand=0x00022a4d diff --git a/bundles/typical/inc/att_db.h b/bundles/typical/inc/att_db.h index 1766aff40..e9423d68e 100644 --- a/bundles/typical/inc/att_db.h +++ b/bundles/typical/inc/att_db.h @@ -1,15 +1,15 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- + +/** @file +* @brief API for ATT server +* +* INGCHIPS confidential and proprietary. +* COPYRIGHT (c) 2018 by INGCHIPS +* +* All rights are reserved. Reproduction in whole or in part is +* prohibited without the written consent of the copyright owner. +* +* +*/ #ifndef __ATT_H #define __ATT_H @@ -22,6 +22,12 @@ extern "C" { #endif +/** + * @brief Bluetooth + * @defgroup Bluetooth_att_db + * @ingroup bluetooth_host + * @{ + */ // custom BTstack error codes #define ATT_ERROR_HCI_DISCONNECT_RECEIVED 0x1f @@ -29,76 +35,80 @@ extern "C" { #define ATT_ERROR_DATA_MISMATCH 0x7e #define ATT_ERROR_TIMEOUT 0x7F -// ATT Client Read Callback for Dynamic Data +/**@brief ATT Client Read Callback for Dynamic Data // - if buffer == NULL, don't copy data, just return size of value // - if buffer != NULL, copy data and return number bytes copied -// @param con_handle of hci le connection -// @param attribute_handle to be read -// @param offset defines start of attribute value -// @param buffer -// @param buffer_size + * @param con_handle hci le connection + * @param attribute_handle attribute handle in att database + * @param offset defines start of attribute value + * @param buffer buffer to allocate the read value + * @param buffer_size buffer size + * @retrun + */ typedef uint16_t (*att_read_callback_t)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size); -// ATT Client Write Callback for Dynamic Data -// @param con_handle of hci le connection -// @param attribute_handle to be written -// @param transaction - ATT_TRANSACTION_MODE_NONE for regular writes, ATT_TRANSACTION_MODE_ACTIVE for prepared writes and ATT_TRANSACTION_MODE_EXECUTE -// @param offset into the value - used for queued writes and long attributes -// @param buffer -// @param buffer_size -// @param signature used for signed write commmands -// @returns 0 if write was ok, ATT_ERROR_PREPARE_QUEUE_FULL if no space in queue, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer +/** + * @brief ATT Client Write Callback for Dynamic Data + * @param con_handle of hci le connection + * @param attribute_handle the attribute handle in the att database + * @param transaction - ATT_TRANSACTION_MODE_NONE for regular writes, ATT_TRANSACTION_MODE_ACTIVE for prepared writes and ATT_TRANSACTION_MODE_EXECUTE + * @param offset into the value - used for queued writes and long attributes + * @param buffer the data to be written + * @param buffer_size the size of buffer + * @param signature used for signed write commmands + * @returns 0 if write was ok, ATT_ERROR_PREPARE_QUEUE_FULL if no space in queue, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer + */ typedef int (*att_write_callback_t)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size); /* API_START */ /* * @brief setup ATT server - * @param read_callback, see att_db.h, can be NULL - * @param write_callback, see attl.h, can be NULL - * NOTE: this function function must be called before seting up a custom HCI handler (if any) + * @param db attribute database in att server + * @param read_callback see function type @link att_read_callback_t() @endlink + * @param write_callback see function type @link att_write_callback_t() @endlink */ void att_server_init(att_read_callback_t read_callback, att_write_callback_t write_callback); /* * @brief register packet handler for ATT server events: - * - ATT_EVENT_MTU_EXCHANGE_COMPLETE + * - ATT_EVENT_MTU_EXCHANGE_COMPLETE * - ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE - * @param handler + * @param handler see function type @link btstack_packet_handler_t() @endlink */ void att_server_register_packet_handler(btstack_packet_handler_t handler); /* * @brief tests if a notification or indication can be send right now - * @param con_handle + * @param con_handle le connection handle * @return 1, if packet can be sent */ int att_server_can_send_packet_now(hci_con_handle_t con_handle); -/** +/** * @brief Request emission of ATT_EVENT_CAN_SEND_NOW as soon as possible * @note ATT_EVENT_CAN_SEND_NOW might be emitted during call to this function * so packet handler should be ready to handle it - * @param con_handle + * @param con_handle le connection handle */ void att_server_request_can_send_now_event(hci_con_handle_t con_handle); /* * @brief notify client about attribute value change - * @param con_handle - * @param attribute_handle - * @param value - * @param value_len - * @return 0 if ok, error otherwise + * @param con_handle le connection handle + * @param attribute_handle the attribute handle in the att database + * @param value buffer to value + * @param value_len length of value + * @return 0 if ok, error otherwise */ int att_server_notify(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); -/* +/** * @brief indicate value change to client. client is supposed to reply with an indication_response - * @param con_handle - * @param attribute_handle - * @param value - * @param value_len - * @return 0 if ok, error otherwise + * @param con_handle le connection handle + * @param attribute_handle the attribute handle in the att database + * @param value buffer to value + * @param value_len length of value + * @return 0 if ok, error otherwise */ int att_server_indicate(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); @@ -108,10 +118,10 @@ int att_server_indicate(hci_con_handle_t con_handle, uint16_t attribute_handle, */ uint16_t att_server_get_mtu(hci_con_handle_t con_handle); -/* +/** * @brief emit a general event to att handler - * @param event - * @param length + * @param event event to be sent + * @param length length of event * @return void */ void att_emit_general_event(uint8_t *event, uint16_t length); @@ -123,18 +133,21 @@ void att_emit_general_event(uint8_t *event, uint16_t length); */ void att_set_db(hci_con_handle_t con_handle, const uint8_t *db); -/* +/** * @brief set callback for read of dynamic attributes - * @param callback + * @param callback see function type @link att_read_callback_t() @endlink */ void att_set_read_callback(att_read_callback_t callback); -/* +/** * @brief set callback for write of dynamic attributes - * @param callback + * @param callback see function type @link att_write_callback_t() @endlink */ void att_set_write_callback(att_write_callback_t callback); +/** + * @} + */ #ifdef __cplusplus } #endif diff --git a/bundles/typical/inc/att_db.nim b/bundles/typical/inc/att_db.nim index c101b6862..beff39bdf 100644 --- a/bundles/typical/inc/att_db.nim +++ b/bundles/typical/inc/att_db.nim @@ -1,19 +1,24 @@ -## ---------------------------------------------------------------------------- -## Copyright Message -## ---------------------------------------------------------------------------- +## * @file +## @brief API for ATT server ## -## INGCHIPS confidential and proprietary. -## COPYRIGHT (c) 2018 by INGCHIPS +## INGCHIPS confidential and proprietary. +## COPYRIGHT (c) 2018 by INGCHIPS +## +## All rights are reserved. Reproduction in whole or in part is +## prohibited without the written consent of the copyright owner. ## -## All rights are reserved. Reproduction in whole or in part is -## prohibited without the written consent of the copyright owner. ## ## -## ---------------------------------------------------------------------------- import bluetooth, bt_types +## * +## @brief Bluetooth +## @defgroup Bluetooth_att_db +## @ingroup bluetooth_host +## @{ +## ## custom BTstack error codes const @@ -25,29 +30,33 @@ const ATT_ERROR_DATA_MISMATCH* = 0x0000007E ATT_ERROR_TIMEOUT* = 0x0000007F -## ATT Client Read Callback for Dynamic Data -## - if buffer == NULL, don't copy data, just return size of value -## - if buffer != NULL, copy data and return number bytes copied -## @param con_handle of hci le connection -## @param attribute_handle to be read -## @param offset defines start of attribute value -## @param buffer -## @param buffer_size +## *@brief ATT Client Read Callback for Dynamic Data +## // - if buffer == NULL, don't copy data, just return size of value +## // - if buffer != NULL, copy data and return number bytes copied +## @param con_handle hci le connection +## @param attribute_handle attribute handle in att database +## @param offset defines start of attribute value +## @param buffer buffer to allocate the read value +## @param buffer_size buffer size +## @retrun +## type att_read_callback_t* = proc (con_handle: hci_con_handle_t; attribute_handle: uint16; offset: uint16; buffer: ptr uint8; buffer_size: uint16): uint16 {.noconv.} -## ATT Client Write Callback for Dynamic Data +## * +## @brief ATT Client Write Callback for Dynamic Data ## @param con_handle of hci le connection -## @param attribute_handle to be written +## @param attribute_handle the attribute handle in the att database ## @param transaction - ATT_TRANSACTION_MODE_NONE for regular writes, ATT_TRANSACTION_MODE_ACTIVE for prepared writes and ATT_TRANSACTION_MODE_EXECUTE ## @param offset into the value - used for queued writes and long attributes -## @param buffer -## @param buffer_size +## @param buffer the data to be written +## @param buffer_size the size of buffer ## @param signature used for signed write commmands -## @returns 0 if write was ok, ATT_ERROR_PREPARE_QUEUE_FULL if no space in queue, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer +## @returns 0 if write was ok, ATT_ERROR_PREPARE_QUEUE_FULL if no space in queue, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer +## type att_write_callback_t* = proc (con_handle: hci_con_handle_t; @@ -58,9 +67,9 @@ type ## API_START ## ## @brief setup ATT server -## @param read_callback, see att_db.h, can be NULL -## @param write_callback, see attl.h, can be NULL -## NOTE: this function function must be called before seting up a custom HCI handler (if any) +## @param db attribute database in att server +## @param read_callback see function type @link att_read_callback_t() @endlink +## @param write_callback see function type @link att_write_callback_t() @endlink ## proc att_server_init*(read_callback: att_read_callback_t; @@ -70,14 +79,14 @@ proc att_server_init*(read_callback: att_read_callback_t; ## @brief register packet handler for ATT server events: ## - ATT_EVENT_MTU_EXCHANGE_COMPLETE ## - ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE -## @param handler +## @param handler see function type @link btstack_packet_handler_t() @endlink ## proc att_server_register_packet_handler*(handler: btstack_packet_handler_t) {. importc: "att_server_register_packet_handler", header: "att_db.h".} ## ## @brief tests if a notification or indication can be send right now -## @param con_handle +## @param con_handle le connection handle ## @return 1, if packet can be sent ## @@ -87,30 +96,30 @@ proc att_server_can_send_packet_now*(con_handle: hci_con_handle_t): cint {. ## @brief Request emission of ATT_EVENT_CAN_SEND_NOW as soon as possible ## @note ATT_EVENT_CAN_SEND_NOW might be emitted during call to this function ## so packet handler should be ready to handle it -## @param con_handle +## @param con_handle le connection handle ## proc att_server_request_can_send_now_event*(con_handle: hci_con_handle_t) {. importc: "att_server_request_can_send_now_event", header: "att_db.h".} ## ## @brief notify client about attribute value change -## @param con_handle -## @param attribute_handle -## @param value -## @param value_len -## @return 0 if ok, error otherwise +## @param con_handle le connection handle +## @param attribute_handle the attribute handle in the att database +## @param value buffer to value +## @param value_len length of value +## @return 0 if ok, error otherwise ## proc att_server_notify*(con_handle: hci_con_handle_t; attribute_handle: uint16; value: ptr uint8; value_len: uint16): cint {. importc: "att_server_notify", header: "att_db.h".} -## +## * ## @brief indicate value change to client. client is supposed to reply with an indication_response -## @param con_handle -## @param attribute_handle -## @param value -## @param value_len -## @return 0 if ok, error otherwise +## @param con_handle le connection handle +## @param attribute_handle the attribute handle in the att database +## @param value buffer to value +## @param value_len length of value +## @return 0 if ok, error otherwise ## proc att_server_indicate*(con_handle: hci_con_handle_t; attribute_handle: uint16; @@ -123,10 +132,10 @@ proc att_server_indicate*(con_handle: hci_con_handle_t; attribute_handle: uint16 proc att_server_get_mtu*(con_handle: hci_con_handle_t): uint16 {. importc: "att_server_get_mtu", header: "att_db.h".} -## +## * ## @brief emit a general event to att handler -## @param event -## @param length +## @param event event to be sent +## @param length length of event ## @return void ## @@ -140,17 +149,20 @@ proc att_emit_general_event*(event: ptr uint8; length: uint16) {. proc att_set_db*(con_handle: hci_con_handle_t; db: ptr uint8) {.importc: "att_set_db", header: "att_db.h".} -## +## * ## @brief set callback for read of dynamic attributes -## @param callback +## @param callback see function type @link att_read_callback_t() @endlink ## proc att_set_read_callback*(callback: att_read_callback_t) {. importc: "att_set_read_callback", header: "att_db.h".} -## +## * ## @brief set callback for write of dynamic attributes -## @param callback +## @param callback see function type @link att_write_callback_t() @endlink ## proc att_set_write_callback*(callback: att_write_callback_t) {. importc: "att_set_write_callback", header: "att_db.h".} +## * +## @} +## diff --git a/bundles/typical/inc/btstack_event.h b/bundles/typical/inc/btstack_event.h index 515f75390..ebaf921c4 100644 --- a/bundles/typical/inc/btstack_event.h +++ b/bundles/typical/inc/btstack_event.h @@ -1,13 +1,15 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// +/** @file +* @brief basic function APIs and events for bluetooth +* Copyright Message +* +* +* INGCHIPS confidential and proprietary. +* COPYRIGHT (c) 2018 by INGCHIPS +* +* All rights are reserved. Reproduction in whole or in part is +* prohibited without the written consent of the copyright owner. +* +*/ // ---------------------------------------------------------------------------- #ifndef __BTSTACK_EVENT_H @@ -804,6 +806,32 @@ typedef struct le_meta_directed_adv_report le_directed_adv_report_t reports[1]; } le_meta_directed_adv_report_t; +typedef struct le_meta_event_enh_create_conn_complete +{ + //Status of received command + uint8_t status; + //Connection handle + uint16_t handle; + //Device role - 0=Master/ 1=Slave + uint8_t role; + //Peer address type - 0=public/1=random + bd_addr_type_t peer_addr_type; + //Peer address + bd_addr_t peer_addr; + //Local_Resolvable_Private_Address + bd_addr_type_t local_resolv_priv_addr; + //Peer_Resolvable_Private_Address + bd_addr_type_t peer_resolv_priv_addr; + //Connection interval + uint16_t interval; + //Connection latency + uint16_t latency; + //Link supervision timeout + uint16_t sup_timeout; + //Master clock accuracy + uint8_t clk_accuracy; +} le_meta_event_enh_create_conn_complete_t; + // LE PHY Update Complete Event typedef struct le_meta_phy_update_complete { diff --git a/bundles/typical/inc/btstack_event.nim b/bundles/typical/inc/btstack_event.nim index 15091ad40..c10b2ef9e 100644 --- a/bundles/typical/inc/btstack_event.nim +++ b/bundles/typical/inc/btstack_event.nim @@ -1,12 +1,14 @@ -## ---------------------------------------------------------------------------- -## Copyright Message -## ---------------------------------------------------------------------------- +## * @file +## @brief basic function APIs and events for bluetooth +## Copyright Message +## +## +## INGCHIPS confidential and proprietary. +## COPYRIGHT (c) 2018 by INGCHIPS ## -## INGCHIPS confidential and proprietary. -## COPYRIGHT (c) 2018 by INGCHIPS +## All rights are reserved. Reproduction in whole or in part is +## prohibited without the written consent of the copyright owner. ## -## All rights are reserved. Reproduction in whole or in part is -## prohibited without the written consent of the copyright owner. ## ## ---------------------------------------------------------------------------- @@ -847,6 +849,22 @@ type num_of_reports* {.importc: "num_of_reports".}: uint8 reports* {.importc: "reports".}: array[1, le_directed_adv_report_t] + le_meta_event_enh_create_conn_complete_t* {. + importc: "le_meta_event_enh_create_conn_complete_t", + header: "btstack_event.h", bycopy.} = object + status* {.importc: "status".}: uint8 ## Status of received command + ## Connection handle + handle* {.importc: "handle".}: uint16 ## Device role - 0=Master/ 1=Slave + role* {.importc: "role".}: uint8 ## Peer address type - 0=public/1=random + peer_addr_type* {.importc: "peer_addr_type".}: bd_addr_type_t ## Peer address + peer_addr* {.importc: "peer_addr".}: bd_addr_t ## Local_Resolvable_Private_Address + local_resolv_priv_addr* {.importc: "local_resolv_priv_addr".}: bd_addr_type_t ## Peer_Resolvable_Private_Address + peer_resolv_priv_addr* {.importc: "peer_resolv_priv_addr".}: bd_addr_type_t ## Connection interval + interval* {.importc: "interval".}: uint16 ## Connection latency + latency* {.importc: "latency".}: uint16 ## Link supervision timeout + sup_timeout* {.importc: "sup_timeout".}: uint16 ## Master clock accuracy + clk_accuracy* {.importc: "clk_accuracy".}: uint8 + ## LE PHY Update Complete Event diff --git a/bundles/typical/inc/btstack_util.h b/bundles/typical/inc/btstack_util.h index ccd78430e..071765489 100644 --- a/bundles/typical/inc/btstack_util.h +++ b/bundles/typical/inc/btstack_util.h @@ -151,7 +151,7 @@ void uuid_add_bluetooth_prefix(uint8_t * uuid128, uint32_t short_uuid); * @param uui128 to test * @return 1 if it can be expressed as UUID32 */ -int uuid_has_bluetooth_prefix(uint8_t * uuid128); +int uuid_has_bluetooth_prefix(const uint8_t * uuid128); #ifdef __cplusplus } diff --git a/bundles/typical/inc/compiler.h b/bundles/typical/inc/compiler.h deleted file mode 100644 index e17f58fae..000000000 --- a/bundles/typical/inc/compiler.h +++ /dev/null @@ -1,26 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- - -#ifndef _COMPILER_H_ -#define _COMPILER_H_ - -#include - -#ifdef __CC_ARM - #define __INLINE __inline -#else - #define __INLINE inline -#endif - -#define __ASM __asm - -#endif // _COMPILER_H_ diff --git a/bundles/typical/inc/compiler.nim b/bundles/typical/inc/compiler.nim deleted file mode 100644 index bb7db6eed..000000000 --- a/bundles/typical/inc/compiler.nim +++ /dev/null @@ -1,12 +0,0 @@ -## ---------------------------------------------------------------------------- -## Copyright Message -## ---------------------------------------------------------------------------- -## -## INGCHIPS confidential and proprietary. -## COPYRIGHT (c) 2018 by INGCHIPS -## -## All rights are reserved. Reproduction in whole or in part is -## prohibited without the written consent of the copyright owner. -## -## ---------------------------------------------------------------------------- - diff --git a/bundles/typical/inc/gap.h b/bundles/typical/inc/gap.h index c1ece1827..fb17e6a36 100644 --- a/bundles/typical/inc/gap.h +++ b/bundles/typical/inc/gap.h @@ -1,15 +1,12 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- +/** @file +* @brief function API and data structure for BLE +* @version 1.0.0. * +* @date 2019/10/10 * +* * +* Copyright (c) 2019 IngChips corp. * +* * +* * + *************************************************************************************************************/ #ifndef __GAP_EXTERNAL_H #define __GAP_EXTERNAL_H @@ -22,6 +19,12 @@ extern "C" { #endif +/** + * @brief Bluetooth + * @defgroup Bluetooth_gap + * @ingroup bluetooth_host + * @{ + */ typedef struct le_connection_parameter_range{ uint16_t le_conn_interval_min; uint16_t le_conn_interval_max; @@ -40,27 +43,89 @@ typedef enum scan_type SCAN_ACTIVE = 0x01, } scan_type_t; +/** + * @brief set random address device + * + * @param address random address + */ void gap_set_random_device_address(const uint8_t *address); /** - * Disconnect connection with handle + * @brief Disconnect connection with handle * - * @param handle + * @param handle Used to identify an advertising set. Range: 0x00 to 0xEF + * @return 0: Message is sent out or the connection alreay release */ uint8_t gap_disconnect(hci_con_handle_t handle); -void gap_disconnect_all(void); +/** + * @brief disconnect multi-connections + */ +void gap_disconnect_all(void); +/** + * @brief add whitelist to the controller + * + * @param[in] address BLE address + * @param[in] addtype BLE address type + * @return 0: Message is sent to controller + */ uint8_t gap_add_whitelist(const uint8_t *address,bd_addr_type_t addtype); + +/** + * @brief remove whitelist from controller + * + * @param address BLE address + * @param addtype BLE address type + * @return 0: Message is sent to controller + */ uint8_t gap_remove_whitelist(const uint8_t *address,bd_addr_type_t addtype); -// uint8_t gap_clear_white_lists(void); -// WARNING: ^^^ this API is not available in this release +/** + * @brief clear white lists in controller + * + * @return 0: message sent out others: failed + */ +uint8_t gap_clear_white_lists(void); +/** + * @brief read rssi value of a appointed hci connection + * + * @param handle connection handle + * + * @return 0: message sent out others: failed + */ uint8_t gap_read_rssi(hci_con_handle_t handle); + +/** + * @brief read remote features upon hci connection + * + * @param handle connection handle + * + * @return 0: message sent out others: failed + */ uint8_t gap_read_remote_used_features(hci_con_handle_t handle); + +/** + * @brief read remote features upon hci connection + * + * @param handle connection handle + * + * @return 0: message sent out others: failed + */ uint8_t gap_read_remote_info(hci_con_handle_t handle); + +/** + * @brief read the channel map of a hci connection + * + * @param handle connection handle + * + * @return 0: message sent out others: failed + */ uint8_t gap_le_read_channel_map(hci_con_handle_t handle); +/** + * @brief physical channel type + */ typedef enum phy_type { PHY_1M = 0x01, @@ -68,7 +133,9 @@ typedef enum phy_type PHY_CODED = 0x03, } phy_type_t; -/*bit configure for */ +/** + * @brief bit of physical channel type + */ typedef enum phy_bittype { PHY_1M_BIT = BIT(0), @@ -78,6 +145,9 @@ typedef enum phy_bittype typedef uint8_t phy_bittypes_t; +/** + * @brief enum of the definition about advertising event + */ typedef enum { ADV_CONNECTABLE, @@ -104,10 +174,39 @@ typedef uint8_t adv_event_properties_t; #define PERIODIC_ADV_BIT_INC_TX BIT(6) typedef uint8_t periodic_adv_properties_t; +/** + * @brief read physical channel of connected handle + * + * @param con_handle connected handle + * @return 0: Message is sent to controller + */ uint8_t gap_read_phy(const uint16_t con_handle); +/** + * @brief Host to specify its preferred values for the transmitter PHY and receiver PHY + * + * @param all_phys BIT(0): no preference for transmit channel + * BIT(1): no preference for receive channel + * Others: reserved for future + * + * @param tx_phys BIT(0): prefer LE 1M transmitter PHY + * BIT(1): prefer LE 2M transmitter PHY + * BIT(2): prefer LE coded transmitter PHY + * Others: reserved for future + * + * @param rx_phys BIT(0): prefer LE 1M receiver PHY + * BIT(1): prefer LE 2M receiver PHY + * BIT(2): prefer LE coded receiver PHY + * Others: reserved for future + * + * @return 0: Message is sent to controller + */ uint8_t gap_set_def_phy(const uint8_t all_phys, const phy_bittypes_t tx_phys, const phy_bittypes_t rx_phys); +/** + * @brief enum of the PHY option + * + */ typedef enum phy_option { HOST_NO_PREFERRED_CODING, @@ -115,11 +214,44 @@ typedef enum phy_option HOST_PREFER_S8_CODING } phy_option_t; +/** + * @brief Host to set PHY preferences for a connection + * + * @param con_handle connection handl. (0x000--0x0EFF) + * + * @param all_phys BIT(0): no preference for transmit channel + * BIT(1): no preference for receive channel + * Others: reserved for future + * + * @param tx_phys BIT(0): prefer LE 1M transmitter PHY + * BIT(1): prefer LE 2M transmitter PHY + * BIT(2): prefer LE coded transmitter PHY + * Others: reserved for future + * + * @param rx_phys BIT(0): prefer LE 1M receiver PHY + * BIT(1): prefer LE 2M receiver PHY + * BIT(2): prefer LE coded receiver PHY + * Others: reserved for future + * + * @return 0: Message is sent to controller + */ uint8_t gap_set_phy(const uint16_t con_handle, const uint8_t all_phys, const phy_bittypes_t tx_phys, const phy_bittypes_t rx_phys, const phy_option_t phy_opt); +/** + * @brief Host to set a random address for an advertising set + * + * @param adv_handle handle to advertising set + * + * @param random_addr random address + * + * @return 0: Message is sent to controller + */ uint8_t gap_set_adv_set_random_addr(const uint8_t adv_handle, const uint8_t *random_addr); +/** + * @brief Structure of PHY configuration + */ typedef struct scan_phy_config { // Which phy to scan (valid phys: 1M & Coded) @@ -132,13 +264,15 @@ typedef struct scan_phy_config uint16_t window; } scan_phy_config_t; -//Scan filter policy +/** + * @brief enum of definition: Scan filter policy + */ typedef enum scan_filter_policy { // Accept all advertising packets except directed advertising packets not // addressed to this device (default). SCAN_ACCEPT_ALL_EXCEPT_NOT_DIRECTED, - // Accept only advertising packets from devices where the advertiser��s + // Accept only advertising packets from devices where the advertiser¡¯s // address is in the White List. Directed advertising packets which are not // addressed to this device shall be ignored SCAN_ACCEPT_WLIST_EXCEPT_NOT_DIRECTED, @@ -153,12 +287,64 @@ typedef enum scan_filter_policy SCAN_ACCEPT_WLIST_EXCEPT_IDENTITY_NOT_MATCH } scan_filter_policy_t; +/** + * @brief to set the extended scan parameters + * + * @param addr_type address type + * + * @param filter @link #scan_filter_policy_t @endlink + * + * @param config_num configure number 3 at most. It indicates that host would configure how many kinds of PHY + * + * @param configs struture pointer to the configuration of each PHY host specify + * + * @return 0: messgae sent to controller + */ uint8_t gap_set_ext_scan_para(const bd_addr_type_t addr_type, const scan_filter_policy_t filter, const uint8_t config_num, const scan_phy_config_t *configs); +/** + * @brief to set the extended scan response data for an advertising set + * + * @param adv_handle handle of advertising set handle + * + * @param length length of advertising data + * + * @param data pointer to the advertising data. + * + * @return 0: messgae sent to controller + */ uint8_t gap_set_ext_scan_response_data(const uint8_t adv_handle, const uint16_t length, const uint8_t *data); +/** + * @brief to enable or disable scanning + * + * @param enable 0: disable 1: enable + * + * @param filter policy to filter the advertising package + * 0x00: Duplicate filtering disabled + * 0x01: Duplicate filtering enabled + * 0x02: Duplicate filtering enabled, reset for each scan period + * others:Reserved for future + * + * @param duration 0x0000: Scan continuously until explicitly disable + * N=0xXXXX: Scan duration + * Range: 0x0001 to 0xFFFF + * Time = N * 10 ms + * Time Range: 10 ms to 655.35 s + * + * @param period 0x0000: Scan continuously + * N=0xXXXX: Time interval from when the Controller started its last Scan_Duration + * until it begins the subsequent Scan_Duration + * Range: 0x0001 to 0xFFFF + * Time = N * 1.28 sec + * Time Range: 1.28 s to 83,884.8 s + * + * @return 0: messgae sent to controller + */ uint8_t gap_set_ext_scan_enable(const uint8_t enable, const uint8_t filter, const uint16_t duration, const uint16_t period); - +/** + * @brief structure of advertising set information + */ typedef struct ext_adv_set_en { uint8_t handle; @@ -169,9 +355,23 @@ typedef struct ext_adv_set_en uint8_t max_events; } ext_adv_set_en_t; +/** + * @brief to enable or disable an advertising set + * + * @param enalbe 0: disable advertising specified by adv_sets + * 1: enable advertising sepecified by adv_sets + * @param set_number number of advertising set + * + * @param adv_sets see structure @link #ext_adv_set_en_t @endlink + * + * @return 0: message sent to controller + */ uint8_t gap_set_ext_adv_enable(const uint8_t enable, const uint8_t set_number, const ext_adv_set_en_t *adv_sets); -// channel map bit +/** + * @brief channel map bit + * + */ #define PRIMARY_ADV_CH_37 BIT(0) #define PRIMARY_ADV_CH_38 BIT(1) #define PRIMARY_ADV_CH_39 BIT(2) @@ -179,7 +379,10 @@ uint8_t gap_set_ext_adv_enable(const uint8_t enable, const uint8_t set_number, c typedef uint8_t adv_channel_bits_t; -//Advertising filter policy +/** + * @brief Advertising filter policy + * + */ typedef enum adv_filter_policy { //Allow both scan and connection requests from anyone @@ -192,6 +395,49 @@ typedef enum adv_filter_policy ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST } adv_filter_policy_t; +/** + * @brief to set the advertising set parameter + * + * @param adv_handle handle of an advertising set + * 1: enable advertising sepecified by adv_sets + * @param properties see structure @link #adv_event_properties_t @endlink + * + * @param interval_min Range: 0x000020 to 0xFFFFFF + * Time = N * 0.625 ms + * Time Range: 20 ms to 10,485.759375 s + * + * @param interal_max see @link #interval_min @endlink + * + * @param primary_adv_channel_map see structure @link #adv_channel_bits_t @endlink + * + * @param own_addr_type own BLE device address type + * + * @param peer_addr_type peer BLE device address type + * + * @param peer_addr peer BLE device address + * + * @param adv_filter_policy filter policy , see structure @link #adv_filter_policy_t @endlink + * + * @param tx_power tranmission power + * 0xXX : Size: 1 octet (signed integer) + * Range: -127 to +20 + * Units: dBm + * 0x7f : Host has no preference + * + * @param primary_adv_phy see structure @link #phy_type_t @endlink + * + * @param secondary_adv_max_skip 0x00 : AUX_ADV_IND shall be sent prior to the next advertising event + * 0x01-0xFF: Maximum advertising events the Controller can skip + * + * @param secondary_adv_phy see structure @link #phy_type_t @endlink + * + * @param sid 0x00-0x0f:Value of the Advertising SID subfield in the ADI field of the PDU + * + * @param scan_req_notification_enable 0x00: Scan request notifications disabled + * 0x01: Scan request notifications enabled + * + * @return 0: message sent to controller + */ uint8_t gap_set_ext_adv_para(const uint8_t adv_handle, const adv_event_properties_t properties, const uint32_t interval_min, @@ -208,30 +454,116 @@ uint8_t gap_set_ext_adv_para(const uint8_t adv_handle, const uint8_t sid, const uint8_t scan_req_notification_enable); +/** + * @brief structure adv_data_frag_pref_t_t + */ typedef enum adv_data_frag_pref { ADV_DATA_CTRL_MAY_FRAG = 0, ADV_DATA_CTRL_NOT_FRAG = 1 } adv_data_frag_pref_t_t; +/** + * @brief to set extended advertising data + * + * @param adv_handle advertising set handle. + * + * @param length advertising data length + * + * @param data pointer to advertising data + * + * @return 0: message sent to controller + */ uint8_t gap_set_ext_adv_data(const uint8_t adv_handle, uint16_t length, const uint8_t *data); +/** + * @brief LE Set Periodic Advertising Data command + * + * @param adv_handle advertising set handle. + * + * @param length advertising data length + * + * @param data pointer to periodic advertising data + * + * @return 0: message sent to controller + */ uint8_t gap_set_periodic_adv_data(const uint8_t adv_handle, uint16_t length, const uint8_t *data); + +/** + * @brief LE Set Periodic Advertising Enable command + * + * @param enable 0x00: Periodic advertising is disabled (default) + * 0x01: Periodic advertising is enabled + * + * @param adv_handle handle of advertising set + * + * @return 0: message sent to controller + */ uint8_t gap_set_periodic_adv_enable(const uint8_t enable, const uint8_t adv_handle); +/** + * @brief LE Set Periodic Advertising Parameters command + * + * @param adv_handle handle of advertising set + * + * @param interval_min 0xXXXX Range: 0x0006 to 0xFFFF + * Time = N * 1.25 ms + * Time Range: 7.5ms to 81.91875 s + * + * @param interval_max refer to interval_min + * + * @param properties BIT(6): Include TxPower in the advertising PDU + * + * @return 0: message sent to controller + */ uint8_t gap_set_periodic_adv_para(const uint8_t adv_handle, const uint16_t interval_min, const uint16_t interval_max, const periodic_adv_properties_t properties); +/** + * @brief LE Clear Advertising Sets command + * + * @return 0: message sent to controller + */ uint8_t gap_clr_adv_set(void); +/** + * @brief LE Remove Advertising Set command + * + * @param adv_handle handle of advertising set to be removed + * + * @return 0: message sent to controller + */ uint8_t gap_rmv_adv_set(const uint8_t adv_handle); +/** + * @brief enum of periodical advertising filter policy + */ typedef enum periodic_adv_filter_policy { PERIODIC_ADVERTISER_FROM_PARAM = 0, PERIODIC_ADVERTISER_FROM_LIST = 1 } periodic_adv_filter_policy_t; +/** + * @brief LE Periodic Advertising Create Sync command + * + * @param filter_policy see structure periodic_adv_filter_policy_t + * + * @param adv_sid 0x00-0x0f: Advertising SID subfield in the ADI field used to identify the Periodic + * Advertising + * @param addr_type see structure @link #bd_addr_type_t @endlink + * + * @param addr pointer to address + * + * @param skip 0x0000-0x01f3: The number of periodic advertising packets that can be skipped after a + * successful receive + * @param sync_timeout Synchronization timeout for the periodic advertising + * Range: 0x000A to 0x4000 + * Time = N*10 ms + * Time Range: 100 ms to 163.84 s + * + * @return 0: message sent to controller + */ uint8_t gap_periodic_adv_create_sync(const periodic_adv_filter_policy_t filter_policy, const uint8_t adv_sid, const bd_addr_type_t addr_type, @@ -240,19 +572,71 @@ uint8_t gap_periodic_adv_create_sync(const periodic_adv_filter_policy_t filter_p const uint16_t sync_timeout, const uint8_t sync_cte_type ); +/** + * @brief LE Periodic Advertising Create Sync Cancel command + * + * @return 0: message sent to controller + */ uint8_t gap_periodic_adv_create_sync_cancel(void); +/** + * @brief LE Periodic Advertising Terminate Sync command + * + * @param sync_handle Sync_Handle identifying the periodic advertising train + * + * @return 0: message sent to controller + */ uint8_t gap_periodic_adv_term_sync(const uint16_t sync_handle); +/** + * @brief LE Add Device To Periodic Advertiser List command + * + * @param addr_type device address type + * + * @param addr pointer to device address + * + * @param sid 0x00-0x0F: Advertising SID subfield in the ADI field used to identify the Periodic Advertising + * + * @return 0: message sent to controller + */ uint8_t gap_add_dev_to_periodic_list(const uint8_t addr_type, const uint8_t *addr, const uint8_t sid); +/** + * @brief LE Remove Device From Periodic Advertiser List command + * + * @param addr_type device address type + * + * @param addr pointer to device address + * + * @param sid 0x00-0x0F: Advertising SID subfield in the ADI field used to identify the Periodic Advertising + * + * @return 0: message sent to controller + */ uint8_t gap_rmv_dev_from_periodic_list(const uint8_t addr_type, const uint8_t *addr, const uint8_t sid); +/** + * @brief LE Clear Periodic Advertiser List command + * + * @return 0: message sent to controller + */ uint8_t gap_clr_periodic_adv_list(void); +/** + * @brief LE Read Periodic Advertiser List Size command + * + * @return 0: message sent to controller + */ uint8_t gap_read_periodic_adv_list_size(void); +/** + * @brief structure initiating_filter_policy_t + * + */ typedef enum initiating_filter_policy { INITIATING_ADVERTISER_FROM_PARAM = 0, INITIATING_ADVERTISER_FROM_LIST = 1 } initiating_filter_policy_t; +/** + * @brief structure connection parameters + * + */ typedef struct { //Scan interval, units is 625us uint16_t scan_int; @@ -270,13 +654,33 @@ typedef struct { uint16_t max_ce_len; } conn_para_t; +/** + * @brief structure initiating PHY configuration + * + */ typedef struct initiating_phy_config { phy_type_t phy; conn_para_t conn_param; } initiating_phy_config_t; - +/** + * @brief LE Extended Create Connection command + * + * @param filter_policy see structure @link #initiating_filter_policy_t @endlink + * + * @param own_addr_type own device address type + * + * @param peer_addr_type peer device address type + * + * @param peer_addr pointer to peer device address + * + * @param initiating_phy_num PHY numbers configured for initiating process + * + * @param phy_configs see structure @link #initiating_phy_config_t @endlink. phy_configs type array according to initiating_phy_num. + * + * @return 0: message sent to controller + */ uint8_t gap_ext_create_connection(const initiating_filter_policy_t filter_policy, const bd_addr_type_t own_addr_type, const bd_addr_type_t peer_addr_type, @@ -286,9 +690,14 @@ uint8_t gap_ext_create_connection(const initiating_filter_policy_t filter_policy /** * @brief Cancel connection process initiated by gap_ext_create_connection + * */ uint8_t gap_create_connection_cancel(void); +/** + * @brief structure:cte_type_t + * + */ typedef enum { CTE_AOA, @@ -302,7 +711,7 @@ typedef enum * identified by the Advertising_Handle parameter. * * @param adv_handle Used to identify an advertising set. Range: 0x00 to 0xEF - * @param cte_len Constant Tone Extension length in 8 ��s units. Range: 0x02 to 0x14 + * @param cte_len Constant Tone Extension length in 8 us units. Range: 0x02 to 0x14 * @param cte_type CTE Type * @param cte_count The number of Constant Tone Extensions to transmit in each periodic * advertising interval. @@ -334,7 +743,10 @@ typedef enum // const uint8_t cte_enable); // WARNING: ^^^ this API is not available in this release - +/** + * @brief structure:cte_slot_duration_type_t + * + */ typedef enum { CTE_SLOT_DURATION_1US, @@ -421,7 +833,7 @@ typedef enum * Requested interval for initiating the Constant Tone Extension Request * procedure in number of connection events. * @param requested_cte_length Minimum length of the Constant Tone Extension being requested in 8 - * ��s units. Range: 0x02 to 0x14. + * us units. Range: 0x02 to 0x14. * @param requested_cte_type Requested CTE type * @return 0: Message is sent out; Other: Message is not sent out * @@ -599,13 +1011,13 @@ int gap_update_connection_parameters(hci_con_handle_t con_handle, uint16_t conn_ /** * @brief Set accepted connection parameter range - * @param range + * @param range see structure @link #le_connection_parameter_range_t @endlink */ void gap_get_connection_parameter_range(le_connection_parameter_range_t * range); /** * @brief Get accepted connection parameter range - * @param range + * @param range see structure @link #le_connection_parameter_range_t @endlink */ void gap_set_connection_parameter_range(le_connection_parameter_range_t * range); @@ -623,6 +1035,32 @@ uint8_t gap_aes_encrypt(const uint8_t *key, const uint8_t *plaintext); #define HCI_VENDOR_CCM 0xFC01 +/** + * @brief host require controller to do AES-CCM functionality, and CCM referece to + * the document rfc3610:Counter with CBC-MAC (CCM) + * + * @param type 0: encrypt 1:decrypt + * + * @param mic_size 8: mic size in 8 bytes 4: mic size in 4 bytes + * + * @param msg_len messge length to be encrypt or decrypt + * + * @param aad_len Additional authenticated data length + * + * @param tag a value to identify a AES-CCM request. + * + * @param key 128 bits long key as required by AES-CCM + * + * @param nonce random value of each AES-CCM require 13 bytes long + * + * @param msg pointer to the message input + * + * @param aad Additional authenticated data + * + * @param out_msg the output buffer to store the result of the AES-CCM ,calculated by controller. + * + * @return 0: success others: failed + */ uint8_t gap_start_ccm( uint8_t type, // 0: encrypt 1: decrypt uint8_t mic_size, @@ -638,17 +1076,25 @@ uint8_t gap_start_ccm( //HCI func interface /** - * @brief Add event packet handler. + * @brief Add event packet handler into HCI callback queue + * + * @param callback_handler see structure @link #btstack_packet_callback_registration_t @endlink */ void hci_add_event_handler(btstack_packet_callback_registration_t * callback_handler); /** * @brief Registers a packet handler for ACL data. Used by L2CAP + * + * @param handler see function type @link btstack_packet_handler_t() @endlink */ void hci_register_acl_packet_handler(btstack_packet_handler_t handler); /** * @brief Requests the change of BTstack power mode. + * + * @param mode 0:HCI_POWER_OFF ,1:HCI_POWER_ON , 2:HCI_POWER_SLEEP + * + * @return 0: succss */ int hci_power_control(HCI_POWER_MODE mode); @@ -670,6 +1116,9 @@ typedef enum { LEVEL_4, } gap_security_level_t; +/** + * @} + */ #ifdef __cplusplus } #endif diff --git a/bundles/typical/inc/gap.nim b/bundles/typical/inc/gap.nim index a825c870b..190d20337 100644 --- a/bundles/typical/inc/gap.nim +++ b/bundles/typical/inc/gap.nim @@ -1,19 +1,24 @@ -## ---------------------------------------------------------------------------- -## Copyright Message -## ---------------------------------------------------------------------------- +## * @file +## @brief function API and data structure for BLE +## @version 1.0.0. * +## @date 2019/10/10 * +## * +## Copyright (c) 2019 IngChips corp. * +## * +## * ## -## INGCHIPS confidential and proprietary. -## COPYRIGHT (c) 2018 by INGCHIPS -## -## All rights are reserved. Reproduction in whole or in part is -## prohibited without the written consent of the copyright owner. -## -## -## ---------------------------------------------------------------------------- +## *********************************************************************************************************** import bluetooth, bt_types +## * +## @brief Bluetooth +## @defgroup Bluetooth_gap +## @ingroup bluetooth_host +## @{ +## + type le_connection_parameter_range_t* {.importc: "le_connection_parameter_range_t", header: "gap.h", bycopy.} = object @@ -33,37 +38,125 @@ type ## Passive scan SCAN_ACTIVE = 0x00000001 +## * +## @brief set random address device +## +## @param address random address +## + proc gap_set_random_device_address*(address: ptr uint8) {. importc: "gap_set_random_device_address", header: "gap.h".} ## * -## Disconnect connection with handle +## @brief Disconnect connection with handle ## -## @param handle +## @param handle Used to identify an advertising set. Range: 0x00 to 0xEF +## @return 0: Message is sent out or the connection alreay release ## proc gap_disconnect*(handle: hci_con_handle_t): uint8 {.importc: "gap_disconnect", header: "gap.h".} +## * +## @brief disconnect multi-connections +## + +proc gap_disconnect_all*() {.importc: "gap_disconnect_all", header: "gap.h".} +## * +## @brief add whitelist to the controller +## +## @param[in] address BLE address +## @param[in] addtype BLE address type +## @return 0: Message is sent to controller +## + proc gap_add_whitelist*(address: ptr uint8; addtype: bd_addr_type_t): uint8 {. importc: "gap_add_whitelist", header: "gap.h".} +## * +## @brief remove whitelist from controller +## +## @param address BLE address +## @param addtype BLE address type +## @return 0: Message is sent to controller +## + proc gap_remove_whitelist*(address: ptr uint8; addtype: bd_addr_type_t): uint8 {. importc: "gap_remove_whitelist", header: "gap.h".} +## * +## @brief clear white lists in controller +## +## @return 0: message sent out others: failed +## + +proc gap_clear_white_lists*(): uint8 {.importc: "gap_clear_white_lists", + header: "gap.h".} +## * +## @brief read rssi value of a appointed hci connection +## +## @param handle connection handle +## +## @return 0: message sent out others: failed +## + +proc gap_read_rssi*(handle: hci_con_handle_t): uint8 {.importc: "gap_read_rssi", + header: "gap.h".} +## * +## @brief read remote features upon hci connection +## +## @param handle connection handle +## +## @return 0: message sent out others: failed +## + +proc gap_read_remote_used_features*(handle: hci_con_handle_t): uint8 {. + importc: "gap_read_remote_used_features", header: "gap.h".} +## * +## @brief read remote features upon hci connection +## +## @param handle connection handle +## +## @return 0: message sent out others: failed +## + +proc gap_read_remote_info*(handle: hci_con_handle_t): uint8 {. + importc: "gap_read_remote_info", header: "gap.h".} +## * +## @brief read the channel map of a hci connection +## +## @param handle connection handle +## +## @return 0: message sent out others: failed +## + +proc gap_le_read_channel_map*(handle: hci_con_handle_t): uint8 {. + importc: "gap_le_read_channel_map", header: "gap.h".} +## * +## @brief physical channel type +## + type phy_type_t* {.size: sizeof(cint).} = enum PHY_1M = 0x00000001, PHY_2M = 0x00000002, PHY_CODED = 0x00000003 -## bit configure for +## * +## @brief bit of physical channel type +## type phy_bittype_t* {.size: sizeof(cint).} = enum PHY_1M_BIT = BIT(0), PHY_2M_BIT = BIT(1), PHY_CODED_BIT = BIT(2) phy_bittypes_t* = uint8 + + +## * +## @brief enum of the definition about advertising event +## + +type adv_event_property_t* {.size: sizeof(cint).} = enum ADV_CONNECTABLE, ADV_SCANNABLE, ADV_DIRECT, ADV_HIGH_DUTY_DIR_ADV, ADV_LEGACY, ADV_ANONYMOUS, ADV_INC_TX_POWER - type adv_event_properties_t* = uint8 @@ -73,21 +166,89 @@ const type periodic_adv_properties_t* = uint8 +## * +## @brief read physical channel of connected handle +## +## @param con_handle connected handle +## @return 0: Message is sent to controller +## + proc gap_read_phy*(con_handle: uint16): uint8 {.importc: "gap_read_phy", header: "gap.h".} +## * +## @brief Host to specify its preferred values for the transmitter PHY and receiver PHY +## +## @param all_phys BIT(0): no preference for transmit channel +## BIT(1): no preference for receive channel +## Others: reserved for future +## +## @param tx_phys BIT(0): prefer LE 1M transmitter PHY +## BIT(1): prefer LE 2M transmitter PHY +## BIT(2): prefer LE coded transmitter PHY +## Others: reserved for future +## +## @param rx_phys BIT(0): prefer LE 1M receiver PHY +## BIT(1): prefer LE 2M receiver PHY +## BIT(2): prefer LE coded receiver PHY +## Others: reserved for future +## +## @return 0: Message is sent to controller +## + proc gap_set_def_phy*(all_phys: uint8; tx_phys: phy_bittypes_t; rx_phys: phy_bittypes_t): uint8 {.importc: "gap_set_def_phy", header: "gap.h".} +## * +## @brief enum of the PHY option +## +## + type phy_option_t* {.size: sizeof(cint).} = enum HOST_NO_PREFERRED_CODING, HOST_PREFER_S2_CODING, HOST_PREFER_S8_CODING +## * +## @brief Host to set PHY preferences for a connection +## +## @param con_handle connection handl. (0x000--0x0EFF) +## +## @param all_phys BIT(0): no preference for transmit channel +## BIT(1): no preference for receive channel +## Others: reserved for future +## +## @param tx_phys BIT(0): prefer LE 1M transmitter PHY +## BIT(1): prefer LE 2M transmitter PHY +## BIT(2): prefer LE coded transmitter PHY +## Others: reserved for future +## +## @param rx_phys BIT(0): prefer LE 1M receiver PHY +## BIT(1): prefer LE 2M receiver PHY +## BIT(2): prefer LE coded receiver PHY +## Others: reserved for future +## +## @return 0: Message is sent to controller +## + proc gap_set_phy*(con_handle: uint16; all_phys: uint8; tx_phys: phy_bittypes_t; rx_phys: phy_bittypes_t; phy_opt: phy_option_t): uint8 {. importc: "gap_set_phy", header: "gap.h".} +## * +## @brief Host to set a random address for an advertising set +## +## @param adv_handle handle to advertising set +## +## @param random_addr random address +## +## @return 0: Message is sent to controller +## + proc gap_set_adv_set_random_addr*(adv_handle: uint8; random_addr: ptr uint8): uint8 {. importc: "gap_set_adv_set_random_addr", header: "gap.h".} +## * +## @brief Structure of PHY configuration +## + type scan_phy_config_t* {.importc: "scan_phy_config_t", header: "gap.h", bycopy.} = object phy* {.importc: "phy".}: phy_type_t ## Which phy to scan (valid phys: 1M & Coded) @@ -97,12 +258,14 @@ type window* {.importc: "window".}: uint16 -## Scan filter policy +## * +## @brief enum of definition: Scan filter policy +## type ## Accept all advertising packets except directed advertising packets not ## addressed to this device (default). scan_filter_policy_t* {.size: sizeof(cint).} = enum - SCAN_ACCEPT_ALL_EXCEPT_NOT_DIRECTED, ## Accept only advertising packets from devices where the advertiser¡¯s + SCAN_ACCEPT_ALL_EXCEPT_NOT_DIRECTED, ## Accept only advertising packets from devices where the advertiser¡¯s ## address is in the White List. Directed advertising packets which are not ## addressed to this device shall be ignored SCAN_ACCEPT_WLIST_EXCEPT_NOT_DIRECTED, ## Accept all advertising packets except directed advertising packets @@ -115,16 +278,73 @@ type ## Accept all advertising packets except directed advertising packets not SCAN_ACCEPT_WLIST_EXCEPT_IDENTITY_NOT_MATCH +## * +## @brief to set the extended scan parameters +## +## @param addr_type address type +## +## @param filter @link #scan_filter_policy_t @endlink +## +## @param config_num configure number 3 at most. It indicates that host would configure how many kinds of PHY +## +## @param configs struture pointer to the configuration of each PHY host specify +## +## @return 0: messgae sent to controller +## + proc gap_set_ext_scan_para*(addr_type: bd_addr_type_t; filter: scan_filter_policy_t; config_num: uint8; configs: ptr scan_phy_config_t): uint8 {. importc: "gap_set_ext_scan_para", header: "gap.h".} +## * +## @brief to set the extended scan response data for an advertising set +## +## @param adv_handle handle of advertising set handle +## +## @param length length of advertising data +## +## @param data pointer to the advertising data. +## +## @return 0: messgae sent to controller +## + proc gap_set_ext_scan_response_data*(adv_handle: uint8; length: uint16; data: ptr uint8): uint8 {. importc: "gap_set_ext_scan_response_data", header: "gap.h".} +## * +## @brief to enable or disable scanning +## +## @param enable 0: disable 1: enable +## +## @param filter policy to filter the advertising package +## 0x00: Duplicate filtering disabled +## 0x01: Duplicate filtering enabled +## 0x02: Duplicate filtering enabled, reset for each scan period +## others:Reserved for future +## +## @param duration 0x0000: Scan continuously until explicitly disable +## N=0xXXXX: Scan duration +## Range: 0x0001 to 0xFFFF +## Time = N * 10 ms +## Time Range: 10 ms to 655.35 s +## +## @param period 0x0000: Scan continuously +## N=0xXXXX: Time interval from when the Controller started its last Scan_Duration +## until it begins the subsequent Scan_Duration +## Range: 0x0001 to 0xFFFF +## Time = N * 1.28 sec +## Time Range: 1.28 s to 83,884.8 s +## +## @return 0: messgae sent to controller +## + proc gap_set_ext_scan_enable*(enable: uint8; filter: uint8; duration: uint16; period: uint16): uint8 {. importc: "gap_set_ext_scan_enable", header: "gap.h".} +## * +## @brief structure of advertising set information +## + type ext_adv_set_en_t* {.importc: "ext_adv_set_en_t", header: "gap.h", bycopy.} = object handle* {.importc: "handle".}: uint8 ## Advertising duration, unit 10ms. 0 for continuous advertising @@ -133,10 +353,25 @@ type max_events* {.importc: "max_events".}: uint8 +## * +## @brief to enable or disable an advertising set +## +## @param enalbe 0: disable advertising specified by adv_sets +## 1: enable advertising sepecified by adv_sets +## @param set_number number of advertising set +## +## @param adv_sets see structure @link #ext_adv_set_en_t @endlink +## +## @return 0: message sent to controller +## + proc gap_set_ext_adv_enable*(enable: uint8; set_number: uint8; adv_sets: ptr ext_adv_set_en_t): uint8 {. importc: "gap_set_ext_adv_enable", header: "gap.h".} -## channel map bit +## * +## @brief channel map bit +## +## const PRIMARY_ADV_CH_37* = BIT(0) @@ -148,7 +383,10 @@ const type adv_channel_bits_t* = uint8 -## Advertising filter policy +## * +## @brief Advertising filter policy +## +## type ## Allow both scan and connection requests from anyone adv_filter_policy_t* {.size: sizeof(cint).} = enum @@ -158,6 +396,50 @@ type ## Allow both scan and connection requests from an ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST +## * +## @brief to set the advertising set parameter +## +## @param adv_handle handle of an advertising set +## 1: enable advertising sepecified by adv_sets +## @param properties see structure @link #adv_event_properties_t @endlink +## +## @param interval_min Range: 0x000020 to 0xFFFFFF +## Time = N * 0.625 ms +## Time Range: 20 ms to 10,485.759375 s +## +## @param interal_max see @link #interval_min @endlink +## +## @param primary_adv_channel_map see structure @link #adv_channel_bits_t @endlink +## +## @param own_addr_type own BLE device address type +## +## @param peer_addr_type peer BLE device address type +## +## @param peer_addr peer BLE device address +## +## @param adv_filter_policy filter policy , see structure @link #adv_filter_policy_t @endlink +## +## @param tx_power tranmission power +## 0xXX : Size: 1 octet (signed integer) +## Range: -127 to +20 +## Units: dBm +## 0x7f : Host has no preference +## +## @param primary_adv_phy see structure @link #phy_type_t @endlink +## +## @param secondary_adv_max_skip 0x00 : AUX_ADV_IND shall be sent prior to the next advertising event +## 0x01-0xFF: Maximum advertising events the Controller can skip +## +## @param secondary_adv_phy see structure @link #phy_type_t @endlink +## +## @param sid 0x00-0x0f:Value of the Advertising SID subfield in the ADI field of the PDU +## +## @param scan_req_notification_enable 0x00: Scan request notifications disabled +## 0x01: Scan request notifications enabled +## +## @return 0: message sent to controller +## + proc gap_set_ext_adv_para*(adv_handle: uint8; properties: adv_event_properties_t; interval_min: uint32; interval_max: uint32; primary_adv_channel_map: adv_channel_bits_t; @@ -169,49 +451,206 @@ proc gap_set_ext_adv_para*(adv_handle: uint8; properties: adv_event_properties_t secondary_adv_phy: phy_type_t; sid: uint8; scan_req_notification_enable: uint8): uint8 {. importc: "gap_set_ext_adv_para", header: "gap.h".} +## * +## @brief structure adv_data_frag_pref_t_t +## + type adv_data_frag_pref_t_t* {.size: sizeof(cint).} = enum ADV_DATA_CTRL_MAY_FRAG = 0, ADV_DATA_CTRL_NOT_FRAG = 1 +## * +## @brief to set extended advertising data +## +## @param adv_handle advertising set handle. +## +## @param length advertising data length +## +## @param data pointer to advertising data +## +## @return 0: message sent to controller +## + proc gap_set_ext_adv_data*(adv_handle: uint8; length: uint16; data: ptr uint8): uint8 {. importc: "gap_set_ext_adv_data", header: "gap.h".} +## * +## @brief LE Set Periodic Advertising Data command +## +## @param adv_handle advertising set handle. +## +## @param length advertising data length +## +## @param data pointer to periodic advertising data +## +## @return 0: message sent to controller +## + proc gap_set_periodic_adv_data*(adv_handle: uint8; length: uint16; data: ptr uint8): uint8 {. importc: "gap_set_periodic_adv_data", header: "gap.h".} +## * +## @brief LE Set Periodic Advertising Enable command +## +## @param enable 0x00: Periodic advertising is disabled (default) +## 0x01: Periodic advertising is enabled +## +## @param adv_handle handle of advertising set +## +## @return 0: message sent to controller +## + proc gap_set_periodic_adv_enable*(enable: uint8; adv_handle: uint8): uint8 {. importc: "gap_set_periodic_adv_enable", header: "gap.h".} +## * +## @brief LE Set Periodic Advertising Parameters command +## +## @param adv_handle handle of advertising set +## +## @param interval_min 0xXXXX Range: 0x0006 to 0xFFFF +## Time = N * 1.25 ms +## Time Range: 7.5ms to 81.91875 s +## +## @param interval_max refer to interval_min +## +## @param properties BIT(6): Include TxPower in the advertising PDU +## +## @return 0: message sent to controller +## + proc gap_set_periodic_adv_para*(adv_handle: uint8; interval_min: uint16; interval_max: uint16; properties: periodic_adv_properties_t): uint8 {. importc: "gap_set_periodic_adv_para", header: "gap.h".} +## * +## @brief LE Clear Advertising Sets command +## +## @return 0: message sent to controller +## + proc gap_clr_adv_set*(): uint8 {.importc: "gap_clr_adv_set", header: "gap.h".} +## * +## @brief LE Remove Advertising Set command +## +## @param adv_handle handle of advertising set to be removed +## +## @return 0: message sent to controller +## + proc gap_rmv_adv_set*(adv_handle: uint8): uint8 {.importc: "gap_rmv_adv_set", header: "gap.h".} +## * +## @brief enum of periodical advertising filter policy +## + type periodic_adv_filter_policy_t* {.size: sizeof(cint).} = enum PERIODIC_ADVERTISER_FROM_PARAM = 0, PERIODIC_ADVERTISER_FROM_LIST = 1 +## * +## @brief LE Periodic Advertising Create Sync command +## +## @param filter_policy see structure periodic_adv_filter_policy_t +## +## @param adv_sid 0x00-0x0f: Advertising SID subfield in the ADI field used to identify the Periodic +## Advertising +## @param addr_type see structure @link #bd_addr_type_t @endlink +## +## @param addr pointer to address +## +## @param skip 0x0000-0x01f3: The number of periodic advertising packets that can be skipped after a +## successful receive +## @param sync_timeout Synchronization timeout for the periodic advertising +## Range: 0x000A to 0x4000 +## Time = N*10 ms +## Time Range: 100 ms to 163.84 s +## +## @return 0: message sent to controller +## + proc gap_periodic_adv_create_sync*(filter_policy: periodic_adv_filter_policy_t; adv_sid: uint8; addr_type: bd_addr_type_t; `addr`: ptr uint8; skip: uint16; sync_timeout: uint16; sync_cte_type: uint8): uint8 {. importc: "gap_periodic_adv_create_sync", header: "gap.h".} +## * +## @brief LE Periodic Advertising Create Sync Cancel command +## +## @return 0: message sent to controller +## + proc gap_periodic_adv_create_sync_cancel*(): uint8 {. importc: "gap_periodic_adv_create_sync_cancel", header: "gap.h".} +## * +## @brief LE Periodic Advertising Terminate Sync command +## +## @param sync_handle Sync_Handle identifying the periodic advertising train +## +## @return 0: message sent to controller +## + proc gap_periodic_adv_term_sync*(sync_handle: uint16): uint8 {. importc: "gap_periodic_adv_term_sync", header: "gap.h".} +## * +## @brief LE Add Device To Periodic Advertiser List command +## +## @param addr_type device address type +## +## @param addr pointer to device address +## +## @param sid 0x00-0x0F: Advertising SID subfield in the ADI field used to identify the Periodic Advertising +## +## @return 0: message sent to controller +## + proc gap_add_dev_to_periodic_list*(addr_type: uint8; `addr`: ptr uint8; sid: uint8): uint8 {. importc: "gap_add_dev_to_periodic_list", header: "gap.h".} +## * +## @brief LE Remove Device From Periodic Advertiser List command +## +## @param addr_type device address type +## +## @param addr pointer to device address +## +## @param sid 0x00-0x0F: Advertising SID subfield in the ADI field used to identify the Periodic Advertising +## +## @return 0: message sent to controller +## + proc gap_rmv_dev_from_periodic_list*(addr_type: uint8; `addr`: ptr uint8; sid: uint8): uint8 {. importc: "gap_rmv_dev_from_periodic_list", header: "gap.h".} +## * +## @brief LE Clear Periodic Advertiser List command +## +## @return 0: message sent to controller +## + proc gap_clr_periodic_adv_list*(): uint8 {.importc: "gap_clr_periodic_adv_list", header: "gap.h".} +## * +## @brief LE Read Periodic Advertiser List Size command +## +## @return 0: message sent to controller +## + proc gap_read_periodic_adv_list_size*(): uint8 {. importc: "gap_read_periodic_adv_list_size", header: "gap.h".} +## * +## @brief structure initiating_filter_policy_t +## +## + type initiating_filter_policy_t* {.size: sizeof(cint).} = enum INITIATING_ADVERTISER_FROM_PARAM = 0, INITIATING_ADVERTISER_FROM_LIST = 1 + + +## * +## @brief structure connection parameters +## +## + +type conn_para_t* {.importc: "conn_para_t", header: "gap.h", bycopy.} = object scan_int* {.importc: "scan_int".}: uint16 ## Scan interval, units is 625us ## Scan window size, units is 625us @@ -223,12 +662,36 @@ type min_ce_len* {.importc: "min_ce_len".}: uint16 max_ce_len* {.importc: "max_ce_len".}: uint16 + +## * +## @brief structure initiating PHY configuration +## +## + +type initiating_phy_config_t* {.importc: "initiating_phy_config_t", header: "gap.h", bycopy.} = object phy* {.importc: "phy".}: phy_type_t conn_param* {.importc: "conn_param".}: conn_para_t +## * +## @brief LE Extended Create Connection command +## +## @param filter_policy see structure @link #initiating_filter_policy_t @endlink +## +## @param own_addr_type own device address type +## +## @param peer_addr_type peer device address type +## +## @param peer_addr pointer to peer device address +## +## @param initiating_phy_num PHY numbers configured for initiating process +## +## @param phy_configs see structure @link #initiating_phy_config_t @endlink. phy_configs type array according to initiating_phy_num. +## +## @return 0: message sent to controller +## proc gap_ext_create_connection*(filter_policy: initiating_filter_policy_t; own_addr_type: bd_addr_type_t; @@ -239,9 +702,15 @@ proc gap_ext_create_connection*(filter_policy: initiating_filter_policy_t; ## * ## @brief Cancel connection process initiated by gap_ext_create_connection ## +## proc gap_create_connection_cancel*(): uint8 {. importc: "gap_create_connection_cancel", header: "gap.h".} +## * +## @brief structure:cte_type_t +## +## + type cte_type_t* {.size: sizeof(cint).} = enum CTE_AOA, CTE_AOD_1US, CTE_AOD_2US @@ -253,7 +722,7 @@ type ## identified by the Advertising_Handle parameter. ## ## @param adv_handle Used to identify an advertising set. Range: 0x00 to 0xEF -## @param cte_len Constant Tone Extension length in 8 ¦Ìs units. Range: 0x02 to 0x14 +## @param cte_len Constant Tone Extension length in 8 us units. Range: 0x02 to 0x14 ## @param cte_type CTE Type ## @param cte_count The number of Constant Tone Extensions to transmit in each periodic ## advertising interval. @@ -282,6 +751,10 @@ type ## uint8_t gap_set_connectionless_cte_tx_enable(const uint8_t adv_handle, ## const uint8_t cte_enable); ## WARNING: ^^^ this API is not available in this release +## * +## @brief structure:cte_slot_duration_type_t +## +## type cte_slot_duration_type_t* {.size: sizeof(cint).} = enum @@ -361,7 +834,7 @@ type ## Requested interval for initiating the Constant Tone Extension Request ## procedure in number of connection events. ## @param requested_cte_length Minimum length of the Constant Tone Extension being requested in 8 -## ¦Ìs units. Range: 0x02 to 0x14. +## us units. Range: 0x02 to 0x14. ## @param requested_cte_type Requested CTE type ## @return 0: Message is sent out; Other: Message is not sent out ## @@ -526,14 +999,14 @@ proc gap_update_connection_parameters*(con_handle: hci_con_handle_t; importc: "gap_update_connection_parameters", header: "gap.h".} ## * ## @brief Set accepted connection parameter range -## @param range +## @param range see structure @link #le_connection_parameter_range_t @endlink ## proc gap_get_connection_parameter_range*(range: ptr le_connection_parameter_range_t) {. importc: "gap_get_connection_parameter_range", header: "gap.h".} ## * ## @brief Get accepted connection parameter range -## @param range +## @param range see structure @link #le_connection_parameter_range_t @endlink ## proc gap_set_connection_parameter_range*(range: ptr le_connection_parameter_range_t) {. @@ -554,6 +1027,33 @@ proc gap_aes_encrypt*(key: ptr uint8; plaintext: ptr uint8): uint8 {. const HCI_VENDOR_CCM* = 0x0000FC01 +## * +## @brief host require controller to do AES-CCM functionality, and CCM referece to +## the document rfc3610:Counter with CBC-MAC (CCM) +## +## @param type 0: encrypt 1:decrypt +## +## @param mic_size 8: mic size in 8 bytes 4: mic size in 4 bytes +## +## @param msg_len messge length to be encrypt or decrypt +## +## @param aad_len Additional authenticated data length +## +## @param tag a value to identify a AES-CCM request. +## +## @param key 128 bits long key as required by AES-CCM +## +## @param nonce random value of each AES-CCM require 13 bytes long +## +## @param msg pointer to the message input +## +## @param aad Additional authenticated data +## +## @param out_msg the output buffer to store the result of the AES-CCM ,calculated by controller. +## +## @return 0: success others: failed +## + proc gap_start_ccm*(`type`: uint8; mic_size: uint8; msg_len: uint16; aad_len: uint16; tag: uint32; key: ptr uint8; nonce: ptr uint8; msg: ptr uint8; aad: ptr uint8; out_msg: ptr uint8): uint8 {. @@ -562,7 +1062,9 @@ proc gap_start_ccm*(`type`: uint8; mic_size: uint8; msg_len: uint16; aad_len: ui ## same value will be reported in event ## HCI func interface ## * -## @brief Add event packet handler. +## @brief Add event packet handler into HCI callback queue +## +## @param callback_handler see structure @link #btstack_packet_callback_registration_t @endlink ## proc hci_add_event_handler*(callback_handler: ptr btstack_packet_callback_registration_t) {. @@ -570,12 +1072,18 @@ proc hci_add_event_handler*(callback_handler: ptr btstack_packet_callback_regist ## * ## @brief Registers a packet handler for ACL data. Used by L2CAP ## +## @param handler see function type @link btstack_packet_handler_t() @endlink +## proc hci_register_acl_packet_handler*(handler: btstack_packet_handler_t) {. importc: "hci_register_acl_packet_handler", header: "gap.h".} ## * ## @brief Requests the change of BTstack power mode. ## +## @param mode 0:HCI_POWER_OFF ,1:HCI_POWER_ON , 2:HCI_POWER_SLEEP +## +## @return 0: succss +## proc hci_power_control*(mode: HCI_POWER_MODE): cint {.importc: "hci_power_control", header: "gap.h".} @@ -590,3 +1098,7 @@ type ## No security LEVEL_3, ## Authenticated LE Secure Connections pairing with encryption LEVEL_4 + +## * +## @} +## diff --git a/bundles/typical/inc/gatt_client.h b/bundles/typical/inc/gatt_client.h index 36336a7e6..5723f5d79 100644 --- a/bundles/typical/inc/gatt_client.h +++ b/bundles/typical/inc/gatt_client.h @@ -1,14 +1,15 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// +/** @file + * @brief generic access profile + * Copyright Message + * + * INGCHIPS confidential and proprietary. + * COPYRIGHT (c) 2018 by INGCHIPS + * + * All rights are reserved. Reproduction in whole or in part is + * prohibited without the written consent of the copyright owner. + * + * +*/ // ---------------------------------------------------------------------------- #ifndef _GATT_CLIENT_H @@ -25,28 +26,88 @@ extern "C" { #endif -typedef struct { +/** + * @brief Bluetooth + * @defgroup Bluetooth_gatt_client + * @ingroup bluetooth_stack + * @{ + */ + +#define UUID128_LEN (16) + +#pragma pack(push, 1) + +typedef struct +{ + uint16_t handle; + uint8_t value[0]; // length is given in `value_size` +} gatt_event_value_packet_t; + +typedef struct +{ + uint16_t handle; + uint16_t offset; + uint8_t value[0]; // length is given in `value_size` +} gatt_event_long_value_packet_t; + +typedef struct +{ + hci_con_handle_t handle; + uint8_t status; +} gatt_event_query_complete_t; + +typedef struct +{ uint16_t start_group_handle; uint16_t end_group_handle; - uint16_t uuid16; - uint8_t uuid128[16]; + uint8_t uuid128[UUID128_LEN]; } gatt_client_service_t; +typedef struct +{ + hci_con_handle_t handle; + gatt_client_service_t service; +} gatt_event_service_query_result_t; + typedef struct { uint16_t start_handle; uint16_t value_handle; uint16_t end_handle; uint16_t properties; - uint16_t uuid16; - uint8_t uuid128[16]; + uint8_t uuid128[UUID128_LEN]; } gatt_client_characteristic_t; +typedef struct +{ + hci_con_handle_t handle; + gatt_client_characteristic_t characteristic; +} gatt_event_characteristic_query_result_t; + typedef struct { uint16_t handle; - uint16_t uuid16; - uint8_t uuid128[16]; + uint8_t uuid128[UUID128_LEN]; } gatt_client_characteristic_descriptor_t; +typedef struct +{ + hci_con_handle_t handle; + gatt_client_characteristic_descriptor_t descriptor; +} gatt_event_characteristic_descriptor_query_result_t; + +typedef struct +{ + hci_con_handle_t handle; + uint16_t include_handle; + gatt_client_service_t service; +} gatt_event_included_service_query_result_t; + +typedef struct { + hci_con_handle_t handle; + gatt_client_characteristic_descriptor_t descriptor; +} gatt_event_all_characteristic_descriptors_query_result_t; + +#pragma pack(pop) + /** * @brief Discovers all primary services. For each found service, an le_service_event_t with type set to GATT_EVENT_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t, with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. */ @@ -57,27 +118,29 @@ uint8_t gatt_client_discover_primary_services(user_packet_handler_t callback, hc */ uint8_t gatt_client_discover_primary_services_by_uuid16(user_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t uuid16); uint8_t gatt_client_discover_primary_services_by_uuid128(user_packet_handler_t callback, hci_con_handle_t con_handle, const uint8_t * uuid128); -uint8_t gatt_client_discover_characteristics_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); + /** * @brief Finds included services within the specified service. For each found included service, an le_service_event_t with type set to GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. Information about included service type (primary/secondary) can be retrieved either by sending an ATT find information request for the returned start group handle (returning the handle and the UUID for primary or secondary service) or by comparing the service to the list of all primary services. */ -uint8_t gatt_client_find_included_services_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); +uint8_t gatt_client_find_included_services_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, + const uint16_t start_group_handle, const uint16_t end_group_handle); /** - * @brief The following four functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. + * @brief The following function are used to discover all characteristics within the specified service or handle range + */ +uint8_t gatt_client_discover_characteristics_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, + const uint16_t start_group_handle, const uint16_t end_group_handle); + +/** + * @brief The following two functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. */ uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid16(btstack_packet_handler_t callback, const hci_con_handle_t con_handle, const uint16_t start_handle, const uint16_t end_handle, const uint16_t uuid16); uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid128(btstack_packet_handler_t callback, const hci_con_handle_t con_handle, const uint16_t start_handle, const uint16_t end_handle, const uint8_t * uuid128); -uint8_t gatt_client_discover_characteristics_for_service_by_uuid16 (btstack_packet_handler_t callback, - const hci_con_handle_t con_handle, gatt_client_service_t *service, - const uint16_t uuid16); -uint8_t gatt_client_discover_characteristics_for_service_by_uuid128(btstack_packet_handler_t callback, - const hci_con_handle_t con_handle, gatt_client_service_t *service, const uint8_t * uuid128); /** * @brief Discovers attribute handle and UUID of a characteristic descriptor within the specified characteristic. For each found descriptor, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. @@ -87,7 +150,6 @@ uint8_t gatt_client_discover_characteristic_descriptors(btstack_packet_handler_t /** * @brief Reads the characteristic value using the characteristic's value handle. If the characteristic value is found, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. */ -uint8_t gatt_client_read_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); uint8_t gatt_client_read_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); /** @@ -99,7 +161,6 @@ uint8_t gatt_client_read_value_of_characteristics_by_uuid128(btstack_packet_hand /** * @brief Reads the long characteristic value using the characteristic's value handle. The value will be returned in several blobs. For each blob, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT and updated value offset will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, mark the end of read. */ -uint8_t gatt_client_read_long_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset); @@ -135,22 +196,18 @@ uint8_t gatt_client_reliable_write_long_value_of_characteristic(btstack_packet_h /** * @brief Reads the characteristic descriptor using its handle. If the characteristic descriptor is found, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. */ -uint8_t gatt_client_read_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); uint8_t gatt_client_read_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); /** * @brief Reads the long characteristic descriptor using its handle. It will be returned in several blobs. For each blob, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. */ -uint8_t gatt_client_read_long_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset); /** * @brief Writes the characteristic descriptor using its handle. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of write. The write is successfully performed, if the event's status field is set to 0. */ -uint8_t gatt_client_write_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); uint8_t gatt_client_write_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -uint8_t gatt_client_write_long_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset, uint16_t length, uint8_t * data); @@ -174,12 +231,6 @@ uint8_t gatt_client_execute_write(btstack_packet_handler_t callback, hci_con_han * @brief -> gatt complete event */ uint8_t gatt_client_cancel_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle); -void gatt_client_deserialize_service(const uint8_t *packet, int offset, gatt_client_service_t *service); -void gatt_client_deserialize_characteristic(const uint8_t * packet, int offset, gatt_client_characteristic_t * characteristic); -void gatt_client_deserialize_characteristic_descriptor(const uint8_t * packet, int offset, gatt_client_characteristic_descriptor_t * descriptor); - -int ble_gatts_find_svc(const ble_uuid_t *uuid, uint16_t *out_handle); -int ble_gatts_find_chr(uint16_t srv_handle, const ble_uuid_t *uuid,uint16_t *out_att_chr); typedef struct gatt_client_notification { btstack_linked_item_t item; @@ -204,7 +255,7 @@ int gatt_client_is_ready(hci_con_handle_t con_handle); * @param con_handle * @param characteristic */ -void gatt_client_listen_for_characteristic_value_updates(gatt_client_notification_t * notification, btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle, gatt_client_characteristic_t * characteristic); +void gatt_client_listen_for_characteristic_value_updates(gatt_client_notification_t * notification, btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle, uint16_t value_handle); /** * @brief Register for general events @@ -215,125 +266,52 @@ void gatt_client_register_handler(btstack_packet_handler_t handler); // only used for testing void gatt_client_pts_suppress_mtu_exchange(void); -#pragma pack(push, 1) - -typedef struct -{ - uint16_t handle; - uint8_t value[0]; // length is given in `value_size` -} gatt_event_value_packet_t; - -typedef struct -{ - uint16_t handle; - uint16_t offset; - uint8_t value[0]; // length is given in `value_size` -} gatt_event_long_value_packet_t; - -#pragma pack(pop) - /** - * @brief Get field handle from event GATT_EVENT_QUERY_COMPLETE + * @brief Parse event GATT_EVENT_QUERY_COMPLETE * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_query_complete_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field status from event GATT_EVENT_QUERY_COMPLETE - * @param event packet - * @return status - * @note: btstack_type 1 + * @return parsed result */ -static __INLINE uint8_t gatt_event_query_complete_get_status(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); +static __INLINE const gatt_event_query_complete_t * gatt_event_query_complete_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_query_complete_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_SERVICE_QUERY_RESULT - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_service_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field service from event GATT_EVENT_SERVICE_QUERY_RESULT + * @brief Parse event GATT_EVENT_SERVICE_QUERY_RESULT * @param event packet - * @param Pointer to storage for service - * @note: btstack_type X + * @return parsed result */ -static __INLINE void gatt_event_service_query_result_get_service(const uint8_t * event, gatt_client_service_t * service){ - gatt_client_deserialize_service(event, 4, service); +static __INLINE const gatt_event_service_query_result_t * gatt_event_service_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_service_query_result_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT + * @brief Parse event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT * @param event packet * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_characteristic_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field characteristic from event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT - * @param event packet - * @param Pointer to storage for characteristic - * @note: btstack_type Y + * @note: parsed result */ -static __INLINE void gatt_event_characteristic_query_result_get_characteristic(const uint8_t * event, gatt_client_characteristic_t * characteristic){ - gatt_client_deserialize_characteristic(event, 4, characteristic); +static __INLINE const gatt_event_characteristic_query_result_t * gatt_event_characteristic_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_characteristic_query_result_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT + * @brief Parse event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT * @param event packet * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_included_service_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field include_handle from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT - * @param event packet - * @return include_handle - * @note: btstack_type 2 + * @note: parsed result */ -static __INLINE uint16_t gatt_event_included_service_query_result_get_include_handle(const uint8_t * event){ - return little_endian_read_16(event, 4); -} -/** - * @brief Get field service from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT - * @param event packet - * @param Pointer to storage for service - * @note: btstack_type X - */ -static __INLINE void gatt_event_included_service_query_result_get_service(const uint8_t * event, gatt_client_service_t * service){ - gatt_client_deserialize_service(event, 6, service); +static __INLINE const gatt_event_included_service_query_result_t * gatt_event_included_service_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_included_service_query_result_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT + * @brief Parse event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT * @param event packet * @return handle - * @note: btstack_type H + * @note: parsed result */ -static __INLINE hci_con_handle_t gatt_event_all_characteristic_descriptors_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field characteristic_descriptor from event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT - * @param event packet - * @param Pointer to storage for characteristic_descriptor - * @note: btstack_type Z - */ -static __INLINE void gatt_event_all_characteristic_descriptors_query_result_get_characteristic_descriptor(const uint8_t * event, gatt_client_characteristic_descriptor_t * characteristic_descriptor){ - gatt_client_deserialize_characteristic_descriptor(event, 4, characteristic_descriptor); +static __INLINE const gatt_event_all_characteristic_descriptors_query_result_t * gatt_event_all_characteristic_descriptors_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_all_characteristic_descriptors_query_result_t, 2); } /** @@ -433,6 +411,9 @@ static __INLINE uint16_t gatt_event_mtu_get_mtu(const uint8_t * event){ return little_endian_read_16(event, 4); } +/** + * @} +*/ #ifdef __cplusplus } #endif diff --git a/bundles/typical/inc/gatt_client.nim b/bundles/typical/inc/gatt_client.nim index c3a48476e..693441b15 100644 --- a/bundles/typical/inc/gatt_client.nim +++ b/bundles/typical/inc/gatt_client.nim @@ -1,12 +1,13 @@ -## ---------------------------------------------------------------------------- +## * @file +## @brief generic access profile ## Copyright Message -## ---------------------------------------------------------------------------- ## -## INGCHIPS confidential and proprietary. -## COPYRIGHT (c) 2018 by INGCHIPS +## INGCHIPS confidential and proprietary. +## COPYRIGHT (c) 2018 by INGCHIPS +## +## All rights are reserved. Reproduction in whole or in part is +## prohibited without the written consent of the copyright owner. ## -## All rights are reserved. Reproduction in whole or in part is -## prohibited without the written consent of the copyright owner. ## ## ## ---------------------------------------------------------------------------- @@ -14,13 +15,43 @@ import bluetooth, bt_types, btstack_util, btstack_event, btstack_linked_list +## * +## @brief Bluetooth +## @defgroup Bluetooth_gatt_client +## @ingroup bluetooth_stack +## @{ +## + +const + UUID128_LEN* = (16) + type + gatt_event_value_packet_t* {.importc: "gatt_event_value_packet_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: uint16 + value* {.importc: "value".}: UncheckedArray[uint8] ## length is given in `value_size` + + gatt_event_long_value_packet_t* {.importc: "gatt_event_long_value_packet_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: uint16 + offset* {.importc: "offset".}: uint16 + value* {.importc: "value".}: UncheckedArray[uint8] ## length is given in `value_size` + + gatt_event_query_complete_t* {.importc: "gatt_event_query_complete_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: hci_con_handle_t + status* {.importc: "status".}: uint8 + gatt_client_service_t* {.importc: "gatt_client_service_t", header: "gatt_client.h", bycopy.} = object start_group_handle* {.importc: "start_group_handle".}: uint16 end_group_handle* {.importc: "end_group_handle".}: uint16 - uuid16* {.importc: "uuid16".}: uint16 - uuid128* {.importc: "uuid128".}: array[16, uint8] + uuid128* {.importc: "uuid128".}: array[UUID128_LEN, uint8] + + gatt_event_service_query_result_t* {.importc: "gatt_event_service_query_result_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: hci_con_handle_t + service* {.importc: "service".}: gatt_client_service_t gatt_client_characteristic_t* {.importc: "gatt_client_characteristic_t", header: "gatt_client.h", bycopy.} = object @@ -28,15 +59,38 @@ type value_handle* {.importc: "value_handle".}: uint16 end_handle* {.importc: "end_handle".}: uint16 properties* {.importc: "properties".}: uint16 - uuid16* {.importc: "uuid16".}: uint16 - uuid128* {.importc: "uuid128".}: array[16, uint8] + uuid128* {.importc: "uuid128".}: array[UUID128_LEN, uint8] + + gatt_event_characteristic_query_result_t* {. + importc: "gatt_event_characteristic_query_result_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: hci_con_handle_t + characteristic* {.importc: "characteristic".}: gatt_client_characteristic_t gatt_client_characteristic_descriptor_t* {. importc: "gatt_client_characteristic_descriptor_t", header: "gatt_client.h", bycopy.} = object handle* {.importc: "handle".}: uint16 - uuid16* {.importc: "uuid16".}: uint16 - uuid128* {.importc: "uuid128".}: array[16, uint8] + uuid128* {.importc: "uuid128".}: array[UUID128_LEN, uint8] + + gatt_event_characteristic_descriptor_query_result_t* {. + importc: "gatt_event_characteristic_descriptor_query_result_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: hci_con_handle_t + descriptor* {.importc: "descriptor".}: gatt_client_characteristic_descriptor_t + + gatt_event_included_service_query_result_t* {. + importc: "gatt_event_included_service_query_result_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: hci_con_handle_t + include_handle* {.importc: "include_handle".}: uint16 + service* {.importc: "service".}: gatt_client_service_t + + gatt_event_all_characteristic_descriptors_query_result_t* {. + importc: "gatt_event_all_characteristic_descriptors_query_result_t", + header: "gatt_client.h", bycopy.} = object + handle* {.importc: "handle".}: hci_con_handle_t + descriptor* {.importc: "descriptor".}: gatt_client_characteristic_descriptor_t ## * @@ -58,22 +112,26 @@ proc gatt_client_discover_primary_services_by_uuid128*( callback: user_packet_handler_t; con_handle: hci_con_handle_t; uuid128: ptr uint8): uint8 {.importc: "gatt_client_discover_primary_services_by_uuid128", header: "gatt_client.h".} -proc gatt_client_discover_characteristics_for_service*( - callback: user_packet_handler_t; con_handle: hci_con_handle_t; - service: ptr gatt_client_service_t): uint8 {. - importc: "gatt_client_discover_characteristics_for_service", - header: "gatt_client.h".} ## * ## @brief Finds included services within the specified service. For each found included service, an le_service_event_t with type set to GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. Information about included service type (primary/secondary) can be retrieved either by sending an ATT find information request for the returned start group handle (returning the handle and the UUID for primary or secondary service) or by comparing the service to the list of all primary services. ## proc gatt_client_find_included_services_for_service*( callback: user_packet_handler_t; con_handle: hci_con_handle_t; - service: ptr gatt_client_service_t): uint8 {. + start_group_handle: uint16; end_group_handle: uint16): uint8 {. importc: "gatt_client_find_included_services_for_service", header: "gatt_client.h".} ## * -## @brief The following four functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. +## @brief The following function are used to discover all characteristics within the specified service or handle range +## + +proc gatt_client_discover_characteristics_for_service*( + callback: user_packet_handler_t; con_handle: hci_con_handle_t; + start_group_handle: uint16; end_group_handle: uint16): uint8 {. + importc: "gatt_client_discover_characteristics_for_service", + header: "gatt_client.h".} +## * +## @brief The following two functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. ## proc gatt_client_discover_characteristics_for_handle_range_by_uuid16*( @@ -85,16 +143,6 @@ proc gatt_client_discover_characteristics_for_handle_range_by_uuid128*( callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; start_handle: uint16; end_handle: uint16; uuid128: ptr uint8): uint8 {.importc: "gatt_client_discover_characteristics_for_handle_range_by_uuid128", header: "gatt_client.h".} -proc gatt_client_discover_characteristics_for_service_by_uuid16*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - service: ptr gatt_client_service_t; uuid16: uint16): uint8 {. - importc: "gatt_client_discover_characteristics_for_service_by_uuid16", - header: "gatt_client.h".} -proc gatt_client_discover_characteristics_for_service_by_uuid128*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - service: ptr gatt_client_service_t; uuid128: ptr uint8): uint8 {. - importc: "gatt_client_discover_characteristics_for_service_by_uuid128", - header: "gatt_client.h".} ## * ## @brief Discovers attribute handle and UUID of a characteristic descriptor within the specified characteristic. For each found descriptor, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. ## @@ -108,10 +156,6 @@ proc gatt_client_discover_characteristic_descriptors*( ## @brief Reads the characteristic value using the characteristic's value handle. If the characteristic value is found, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. ## -proc gatt_client_read_value_of_characteristic*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - characteristic: ptr gatt_client_characteristic_t): uint8 {. - importc: "gatt_client_read_value_of_characteristic", header: "gatt_client.h".} proc gatt_client_read_value_of_characteristic_using_value_handle*( callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; characteristic_value_handle: uint16): uint8 {. @@ -135,11 +179,6 @@ proc gatt_client_read_value_of_characteristics_by_uuid128*( ## @brief Reads the long characteristic value using the characteristic's value handle. The value will be returned in several blobs. For each blob, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT and updated value offset will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, mark the end of read. ## -proc gatt_client_read_long_value_of_characteristic*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - characteristic: ptr gatt_client_characteristic_t): uint8 {. - importc: "gatt_client_read_long_value_of_characteristic", - header: "gatt_client.h".} proc gatt_client_read_long_value_of_characteristic_using_value_handle*( callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; characteristic_value_handle: uint16): uint8 {.importc: "gatt_client_read_long_value_of_characteristic_using_value_handle", @@ -206,10 +245,6 @@ proc gatt_client_reliable_write_long_value_of_characteristic*( ## @brief Reads the characteristic descriptor using its handle. If the characteristic descriptor is found, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. ## -proc gatt_client_read_characteristic_descriptor*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - descriptor: ptr gatt_client_characteristic_descriptor_t): uint8 {. - importc: "gatt_client_read_characteristic_descriptor", header: "gatt_client.h".} proc gatt_client_read_characteristic_descriptor_using_descriptor_handle*( callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; descriptor_handle: uint16): uint8 {.importc: "gatt_client_read_characteristic_descriptor_using_descriptor_handle", @@ -218,11 +253,6 @@ proc gatt_client_read_characteristic_descriptor_using_descriptor_handle*( ## @brief Reads the long characteristic descriptor using its handle. It will be returned in several blobs. For each blob, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. ## -proc gatt_client_read_long_characteristic_descriptor*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - descriptor: ptr gatt_client_characteristic_descriptor_t): uint8 {. - importc: "gatt_client_read_long_characteristic_descriptor", - header: "gatt_client.h".} proc gatt_client_read_long_characteristic_descriptor_using_descriptor_handle*( callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; descriptor_handle: uint16): uint8 {.importc: "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", @@ -235,20 +265,10 @@ proc gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_wit ## @brief Writes the characteristic descriptor using its handle. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of write. The write is successfully performed, if the event's status field is set to 0. ## -proc gatt_client_write_characteristic_descriptor*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - descriptor: ptr gatt_client_characteristic_descriptor_t; length: uint16; - data: ptr uint8): uint8 {.importc: "gatt_client_write_characteristic_descriptor", - header: "gatt_client.h".} proc gatt_client_write_characteristic_descriptor_using_descriptor_handle*( callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; descriptor_handle: uint16; length: uint16; data: ptr uint8): uint8 {.importc: "gatt_client_write_characteristic_descriptor_using_descriptor_handle", header: "gatt_client.h".} -proc gatt_client_write_long_characteristic_descriptor*( - callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; - descriptor: ptr gatt_client_characteristic_descriptor_t; length: uint16; - data: ptr uint8): uint8 {.importc: "gatt_client_write_long_characteristic_descriptor", - header: "gatt_client.h".} proc gatt_client_write_long_characteristic_descriptor_using_descriptor_handle*( callback: btstack_packet_handler_t; con_handle: hci_con_handle_t; descriptor_handle: uint16; length: uint16; data: ptr uint8): uint8 {.importc: "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", @@ -289,21 +309,6 @@ proc gatt_client_execute_write*(callback: btstack_packet_handler_t; proc gatt_client_cancel_write*(callback: btstack_packet_handler_t; con_handle: hci_con_handle_t): uint8 {. importc: "gatt_client_cancel_write", header: "gatt_client.h".} -proc gatt_client_deserialize_service*(packet: ptr uint8; offset: cint; - service: ptr gatt_client_service_t) {. - importc: "gatt_client_deserialize_service", header: "gatt_client.h".} -proc gatt_client_deserialize_characteristic*(packet: ptr uint8; offset: cint; - characteristic: ptr gatt_client_characteristic_t) {. - importc: "gatt_client_deserialize_characteristic", header: "gatt_client.h".} -proc gatt_client_deserialize_characteristic_descriptor*(packet: ptr uint8; - offset: cint; descriptor: ptr gatt_client_characteristic_descriptor_t) {. - importc: "gatt_client_deserialize_characteristic_descriptor", - header: "gatt_client.h".} -proc ble_gatts_find_svc*(uuid: ptr ble_uuid_t; out_handle: ptr uint16): cint {. - importc: "ble_gatts_find_svc", header: "gatt_client.h".} -proc ble_gatts_find_chr*(srv_handle: uint16; uuid: ptr ble_uuid_t; - out_att_chr: ptr uint16): cint {. - importc: "ble_gatts_find_chr", header: "gatt_client.h".} type gatt_client_notification_t* {.importc: "gatt_client_notification_t", header: "gatt_client.h", bycopy.} = object @@ -335,9 +340,8 @@ proc gatt_client_is_ready*(con_handle: hci_con_handle_t): cint {. proc gatt_client_listen_for_characteristic_value_updates*( notification: ptr gatt_client_notification_t; packet_handler: btstack_packet_handler_t; con_handle: hci_con_handle_t; - characteristic: ptr gatt_client_characteristic_t) {. - importc: "gatt_client_listen_for_characteristic_value_updates", - header: "gatt_client.h".} + value_handle: uint16) {.importc: "gatt_client_listen_for_characteristic_value_updates", + header: "gatt_client.h".} ## * ## @brief Register for general events ## @param handler @@ -349,136 +353,55 @@ proc gatt_client_register_handler*(handler: btstack_packet_handler_t) {. proc gatt_client_pts_suppress_mtu_exchange*() {. importc: "gatt_client_pts_suppress_mtu_exchange", header: "gatt_client.h".} -type - gatt_event_value_packet_t* {.importc: "gatt_event_value_packet_t", - header: "gatt_client.h", bycopy.} = object - handle* {.importc: "handle".}: uint16 - value* {.importc: "value".}: UncheckedArray[uint8] ## length is given in `value_size` - - gatt_event_long_value_packet_t* {.importc: "gatt_event_long_value_packet_t", - header: "gatt_client.h", bycopy.} = object - handle* {.importc: "handle".}: uint16 - offset* {.importc: "offset".}: uint16 - value* {.importc: "value".}: UncheckedArray[uint8] ## length is given in `value_size` - - ## * -## @brief Get field handle from event GATT_EVENT_QUERY_COMPLETE +## @brief Parse event GATT_EVENT_QUERY_COMPLETE ## @param event packet -## @return handle -## @note: btstack_type H +## @return parsed result ## -proc gatt_event_query_complete_get_handle*(event: ptr uint8): hci_con_handle_t = - return little_endian_read_16(event, 2) +proc gatt_event_query_complete_parse*(event: ptr uint8): ptr gatt_event_query_complete_t = + return decode_event_offset(event, gatt_event_query_complete_t, 2) ## * -## @brief Get field status from event GATT_EVENT_QUERY_COMPLETE +## @brief Parse event GATT_EVENT_SERVICE_QUERY_RESULT ## @param event packet -## @return status -## @note: btstack_type 1 +## @return parsed result ## -proc gatt_event_query_complete_get_status*(event: ptr uint8): uint8 = - return decode_event_offset(event, uint8, 4)[] +proc gatt_event_service_query_result_parse*(event: ptr uint8): ptr gatt_event_service_query_result_t = + return decode_event_offset(event, gatt_event_service_query_result_t, 2) ## * -## @brief Get field handle from event GATT_EVENT_SERVICE_QUERY_RESULT +## @brief Parse event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT ## @param event packet ## @return handle -## @note: btstack_type H +## @note: parsed result ## -proc gatt_event_service_query_result_get_handle*(event: ptr uint8): hci_con_handle_t = - return little_endian_read_16(event, 2) +proc gatt_event_characteristic_query_result_parse*(event: ptr uint8): ptr gatt_event_characteristic_query_result_t = + return decode_event_offset(event, gatt_event_characteristic_query_result_t, 2) ## * -## @brief Get field service from event GATT_EVENT_SERVICE_QUERY_RESULT -## @param event packet -## @param Pointer to storage for service -## @note: btstack_type X -## - -proc gatt_event_service_query_result_get_service*(event: ptr uint8; - service: ptr gatt_client_service_t) = - gatt_client_deserialize_service(event, 4, service) - -## * -## @brief Get field handle from event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT +## @brief Parse event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT ## @param event packet ## @return handle -## @note: btstack_type H -## - -proc gatt_event_characteristic_query_result_get_handle*(event: ptr uint8): hci_con_handle_t = - return little_endian_read_16(event, 2) - -## * -## @brief Get field characteristic from event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT -## @param event packet -## @param Pointer to storage for characteristic -## @note: btstack_type Y +## @note: parsed result ## -proc gatt_event_characteristic_query_result_get_characteristic*(event: ptr uint8; - characteristic: ptr gatt_client_characteristic_t) = - gatt_client_deserialize_characteristic(event, 4, characteristic) +proc gatt_event_included_service_query_result_parse*(event: ptr uint8): ptr gatt_event_included_service_query_result_t = + return decode_event_offset(event, gatt_event_included_service_query_result_t, 2) ## * -## @brief Get field handle from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT +## @brief Parse event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT ## @param event packet ## @return handle -## @note: btstack_type H +## @note: parsed result ## -proc gatt_event_included_service_query_result_get_handle*(event: ptr uint8): hci_con_handle_t = - return little_endian_read_16(event, 2) - -## * -## @brief Get field include_handle from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT -## @param event packet -## @return include_handle -## @note: btstack_type 2 -## - -proc gatt_event_included_service_query_result_get_include_handle*( - event: ptr uint8): uint16 = - return little_endian_read_16(event, 4) - -## * -## @brief Get field service from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT -## @param event packet -## @param Pointer to storage for service -## @note: btstack_type X -## - -proc gatt_event_included_service_query_result_get_service*(event: ptr uint8; - service: ptr gatt_client_service_t) = - gatt_client_deserialize_service(event, 6, service) - -## * -## @brief Get field handle from event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT -## @param event packet -## @return handle -## @note: btstack_type H -## - -proc gatt_event_all_characteristic_descriptors_query_result_get_handle*( - event: ptr uint8): hci_con_handle_t = - return little_endian_read_16(event, 2) - -## * -## @brief Get field characteristic_descriptor from event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT -## @param event packet -## @param Pointer to storage for characteristic_descriptor -## @note: btstack_type Z -## - -proc gatt_event_all_characteristic_descriptors_query_result_get_characteristic_descriptor*( - event: ptr uint8; - characteristic_descriptor: ptr gatt_client_characteristic_descriptor_t) = - gatt_client_deserialize_characteristic_descriptor(event, 4, - characteristic_descriptor) +proc gatt_event_all_characteristic_descriptors_query_result_parse*( + event: ptr uint8): ptr gatt_event_all_characteristic_descriptors_query_result_t = + return decode_event_offset(event, gatt_event_all_characteristic_descriptors_query_result_t, + 2) ## * ## @brief Get value from event GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT @@ -579,3 +502,7 @@ proc gatt_event_mtu_get_handle*(event: ptr uint8): hci_con_handle_t = proc gatt_event_mtu_get_mtu*(event: ptr uint8): uint16 = return little_endian_read_16(event, 4) + +## * +## @} +## diff --git a/bundles/typical/inc/kv_storage.h b/bundles/typical/inc/kv_storage.h index f4f076060..22b34aae6 100644 --- a/bundles/typical/inc/kv_storage.h +++ b/bundles/typical/inc/kv_storage.h @@ -1,21 +1,24 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018-2019 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- +/** @file * +* @brief helper function to cache data into flash * +* @version 1.0.0. * +* @date 2019/10/10 * +* * +* Copyright (c) 2019 IngChips corp. * +* * +* * + *************************************************************************************************************/ #ifndef _KV_STORAGE_H #define _KV_STORAGE_H #include +/** + * @brief Bluetooth + * @defgroup Bluetooth_NVM + * @ingroup bluetooth_stack + * @{ + */ /** * @brief A simple key-value storage * @@ -167,4 +170,8 @@ void kv_visit(f_kv_visitor visitor, void *user_data); // WARNING: ^^^ this API is not available in this release +/* +* @} +*/ + #endif diff --git a/bundles/typical/inc/kv_storage.nim b/bundles/typical/inc/kv_storage.nim index 8da2fde55..9bb3d48f0 100644 --- a/bundles/typical/inc/kv_storage.nim +++ b/bundles/typical/inc/kv_storage.nim @@ -1,16 +1,20 @@ -## ---------------------------------------------------------------------------- -## Copyright Message -## ---------------------------------------------------------------------------- +## * @file * +## @brief helper function to cache data into flash * +## @version 1.0.0. * +## @date 2019/10/10 * +## * +## Copyright (c) 2019 IngChips corp. * +## * +## * ## -## INGCHIPS confidential and proprietary. -## COPYRIGHT (c) 2018-2019 by INGCHIPS -## -## All rights are reserved. Reproduction in whole or in part is -## prohibited without the written consent of the copyright owner. -## -## -## ---------------------------------------------------------------------------- +## *********************************************************************************************************** +## * +## @brief Bluetooth +## @defgroup Bluetooth_NVM +## @ingroup bluetooth_stack +## @{ +## ## * ## @brief A simple key-value storage ## @@ -168,3 +172,6 @@ proc kv_visit*(visitor: f_kv_visitor; user_data: pointer) {.importc: "kv_visit", ## ## int kv_value_trunc(const kvkey_t key, const int16_t new_len); ## WARNING: ^^^ this API is not available in this release +## +## @} +## diff --git a/bundles/typical/inc/os/queue.h b/bundles/typical/inc/os/queue.h index 0f76cc970..c58401171 100644 --- a/bundles/typical/inc/os/queue.h +++ b/bundles/typical/inc/os/queue.h @@ -741,9 +741,7 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQ * \defgroup xQueuePeek xQueuePeek * \ingroup QueueManagement */ -// BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /** * queue. h @@ -776,9 +774,7 @@ BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQ * \defgroup xQueuePeekFromISR xQueuePeekFromISR * \ingroup QueueManagement */ -// BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; /** * queue. h @@ -884,9 +880,7 @@ BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_ * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting * \ingroup QueueManagement */ -// UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** * queue. h @@ -903,9 +897,7 @@ BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_ * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting * \ingroup QueueManagement */ -// UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** * queue. h @@ -919,9 +911,7 @@ BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_ * \defgroup vQueueDelete vQueueDelete * \ingroup QueueManagement */ -// void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /** * queue. h @@ -1392,23 +1382,15 @@ BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherP * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR * \ingroup QueueManagement */ -// BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; /* * Utilities to query queues that are safe to use from an ISR. These utilities * should be used only from witin an ISR, or within a critical section. */ -// BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /* * The functions defined above are for passing data to and from tasks. The @@ -1437,18 +1419,10 @@ BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherP * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling * these functions directly. */ -// QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; // TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; // WARNING: ^^^ this API is not available in this release @@ -1461,12 +1435,8 @@ BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) * For internal use only. Use xSemaphoreTakeMutexRecursive() or * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. */ -// BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; /* * Reset a queue back to its original empty state. The return value is now @@ -1595,9 +1565,7 @@ BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) * @return If the queue set is created successfully then a handle to the created * queue set is returned. Otherwise NULL is returned. */ -// QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; /* * Adds a queue or semaphore to a queue set that was previously created by a @@ -1621,9 +1589,7 @@ BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) * queue set because it is already a member of a different queue set then pdFAIL * is returned. */ -// BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; /* * Removes a queue or semaphore from a queue set. A queue or semaphore can only @@ -1642,9 +1608,7 @@ BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) * then pdPASS is returned. If the queue was not in the queue set, or the * queue (or semaphore) was not empty, then pdFAIL is returned. */ -// BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; /* * xQueueSelectFromSet() selects from the members of a queue set a queue or @@ -1680,16 +1644,12 @@ BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) * in the queue set that is available, or NULL if no such queue or semaphore * exists before before the specified block time expires. */ -// QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; /* * A version of xQueueSelectFromSet() that can be used from an ISR. */ -// QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; /* Not public API functions. */ void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; diff --git a/bundles/typical/inc/os/semphr.h~RF5787eac.TMP b/bundles/typical/inc/os/semphr.h~RF5787eac.TMP new file mode 100644 index 000000000..2c106eac0 --- /dev/null +++ b/bundles/typical/inc/os/semphr.h~RF5787eac.TMP @@ -0,0 +1,1140 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef QueueHandle_t SemaphoreHandle_t; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + + +/** + * semphr. h + *
vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
+ * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
+    // This is a macro so pass the variable in directly.
+    vSemaphoreCreateBinary( xSemaphore );
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateBinary( void )
+ * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore, or NULL if the memory required to + * hold the semaphore's data structures could not be allocated. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateBinary();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
+ * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * NOTE: In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+ StaticSemaphore_t xSemaphoreBuffer;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
+    // The semaphore's data structures will be placed in the xSemaphoreBuffer
+    // variable, the address of which is passed into the function.  The
+    // function's parameter is not NULL, so the function will not attempt any
+    // dynamic memory allocation, and therefore the function will not return
+    // return NULL.
+    xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
+
+    // Rest of task code goes here.
+ }
+ 
+ * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
xSemaphoreTake(
+ *                   SemaphoreHandle_t xSemaphore,
+ *                   TickType_t xBlockTime
+ *               )
+ * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ // A task that creates a semaphore.
+ void vATask( void * pvParameters )
+ {
+    // Create the semaphore to guard a shared resource.
+    xSemaphore = xSemaphoreCreateBinary();
+ }
+
+ // A task that uses the semaphore.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xSemaphore != NULL )
+    {
+        // See if we can obtain the semaphore.  If the semaphore is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the semaphore and can now access the
+            // shared resource.
+
+            // ...
+
+            // We have finished accessing the shared resource.  Release the
+            // semaphore.
+            xSemaphoreGive( xSemaphore );
+        }
+        else
+        {
+            // We could not obtain the semaphore and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) + +/** + * semphr. h + * xSemaphoreTakeRecursive( + * SemaphoreHandle_t xMutex, + * TickType_t xBlockTime + * ) + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: +
+ SemaphoreHandle_t xMutex = NULL;
+
+ // A task that creates a mutex.
+ void vATask( void * pvParameters )
+ {
+    // Create the mutex to guard a shared resource.
+    xMutex = xSemaphoreCreateRecursiveMutex();
+ }
+
+ // A task that uses the mutex.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xMutex != NULL )
+    {
+        // See if we can obtain the mutex.  If the mutex is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the mutex and can now access the
+            // shared resource.
+
+            // ...
+            // For some reason due to the nature of the code further calls to
+            // xSemaphoreTakeRecursive() are made on the same mutex.  In real
+            // code these would not be just sequential calls as this would make
+            // no sense.  Instead the calls are likely to be buried inside
+            // a more complex call structure.
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+
+            // The mutex has now been 'taken' three times, so will not be
+            // available to another task until it has also been given back
+            // three times.  Again it is unlikely that real code would have
+            // these calls sequentially, but instead buried in a more complex
+            // call structure.  This is just for illustrative purposes.
+            xSemaphoreGiveRecursive( xMutex );
+            xSemaphoreGiveRecursive( xMutex );
+            xSemaphoreGiveRecursive( xMutex );
+
+            // Now the mutex can be taken by other tasks.
+        }
+        else
+        {
+            // We could not obtain the mutex and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#endif + +/** + * semphr. h + *
xSemaphoreGive( SemaphoreHandle_t xSemaphore )
+ * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Create the semaphore to guard a shared resource.
+    xSemaphore = vSemaphoreCreateBinary();
+
+    if( xSemaphore != NULL )
+    {
+        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+        {
+            // We would expect this call to fail because we cannot give
+            // a semaphore without first "taking" it!
+        }
+
+        // Obtain the semaphore - don't block if the semaphore is not
+        // immediately available.
+        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
+        {
+            // We now have the semaphore and can access the shared resource.
+
+            // ...
+
+            // We have finished accessing the shared resource so can free the
+            // semaphore.
+            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+            {
+                // We would not expect this call to fail because we must have
+                // obtained the semaphore to get here.
+            }
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + *
xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
+ * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: +
+ SemaphoreHandle_t xMutex = NULL;
+
+ // A task that creates a mutex.
+ void vATask( void * pvParameters )
+ {
+    // Create the mutex to guard a shared resource.
+    xMutex = xSemaphoreCreateRecursiveMutex();
+ }
+
+ // A task that uses the mutex.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xMutex != NULL )
+    {
+        // See if we can obtain the mutex.  If the mutex is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the mutex and can now access the
+            // shared resource.
+
+            // ...
+            // For some reason due to the nature of the code further calls to
+			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
+			// code these would not be just sequential calls as this would make
+			// no sense.  Instead the calls are likely to be buried inside
+			// a more complex call structure.
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
+
+            // The mutex has now been 'taken' three times, so will not be
+			// available to another task until it has also been given back
+			// three times.  Again it is unlikely that real code would have
+			// these calls sequentially, it would be more likely that the calls
+			// to xSemaphoreGiveRecursive() would be called as a call stack
+			// unwound.  This is just for demonstrative purposes.
+            xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+
+			// Now the mutex can be taken by other tasks.
+        }
+        else
+        {
+            // We could not obtain the mutex and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#endif + +/** + * semphr. h + *
+ xSemaphoreGiveFromISR(
+                          SemaphoreHandle_t xSemaphore,
+                          BaseType_t *pxHigherPriorityTaskWoken
+                      )
+ * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: +
+ \#define LONG_TIME 0xffff
+ \#define TICKS_TO_WAIT	10
+ SemaphoreHandle_t xSemaphore = NULL;
+
+ // Repetitive task.
+ void vATask( void * pvParameters )
+ {
+    for( ;; )
+    {
+        // We want this task to run every 10 ticks of a timer.  The semaphore
+        // was created before this task was started.
+
+        // Block waiting for the semaphore to become available.
+        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
+        {
+            // It is time to execute.
+
+            // ...
+
+            // We have finished our task.  Return to the top of the loop where
+            // we will block on the semaphore until it is time to execute
+            // again.  Note when using the semaphore for synchronisation with an
+			// ISR in this manner there is no need to 'give' the semaphore back.
+        }
+    }
+ }
+
+ // Timer ISR
+ void vTimerISR( void * pvParameters )
+ {
+ static uint8_t ucLocalTickCount = 0;
+ static BaseType_t xHigherPriorityTaskWoken;
+
+    // A timer tick has occurred.
+
+    // ... Do other time functions.
+
+    // Is it time for vATask () to run?
+	xHigherPriorityTaskWoken = pdFALSE;
+    ucLocalTickCount++;
+    if( ucLocalTickCount >= TICKS_TO_WAIT )
+    {
+        // Unblock the task by releasing the semaphore.
+        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
+
+        // Reset the count so we release the semaphore again in 10 ticks time.
+        ucLocalTickCount = 0;
+    }
+
+    if( xHigherPriorityTaskWoken != pdFALSE )
+    {
+        // We can force a context switch here.  Context switching from an
+        // ISR uses port specific syntax.  Check the demo task for your port
+        // to find the syntax required.
+    }
+ }
+ 
+ * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
+ xSemaphoreTakeFromISR(
+                          SemaphoreHandle_t xSemaphore,
+                          BaseType_t *pxHigherPriorityTaskWoken
+                      )
+ * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to xSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateMutex( void )
+ * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateMutex();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer )
+ * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+ StaticSemaphore_t xMutexBuffer;
+
+ void vATask( void * pvParameters )
+ {
+    // A mutex cannot be used before it has been created.  xMutexBuffer is
+    // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
+    // attempted.
+    xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
+
+    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
+    // so there is no need to check it.
+ }
+ 
+ * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * \ingroup Semaphores + */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
+ * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateRecursiveMutex();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex + * \ingroup Semaphores + */ +#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer )
+ * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+ StaticSemaphore_t xMutexBuffer;
+
+ void vATask( void * pvParameters )
+ {
+    // A recursive semaphore cannot be used before it is created.  Here a
+    // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
+    // The address of xMutexBuffer is passed into the function, and will hold
+    // the mutexes data structures - so no dynamic memory allocation will be
+    // attempted.
+    xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
+
+    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
+    // so there is no need to check it.
+ }
+ 
+ * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic + * \ingroup Semaphores + */ +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
+ * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer can + * instead optionally provide the memory that will get used by the counting + * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+ SemaphoreHandle_t xSemaphore = NULL;
+
+    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
+    // The max value to which the semaphore can count should be 10, and the
+    // initial value assigned to the count should be 0.
+    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * semphr. h + *
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer )
+ * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer must + * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a + * counting semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: +
+ SemaphoreHandle_t xSemaphore;
+ StaticSemaphore_t xSemaphoreBuffer;
+
+ void vATask( void * pvParameters )
+ {
+ SemaphoreHandle_t xSemaphore = NULL;
+
+    // Counting semaphore cannot be used before they have been created.  Create
+    // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
+    // value to which the semaphore can count is 10, and the initial value
+    // assigned to the count will be 0.  The address of xSemaphoreBuffer is
+    // passed in and will be used to hold the semaphore structure, so no dynamic
+    // memory allocation will be used.
+    xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
+
+    // No memory allocation was attempted so xSemaphore cannot be NULL, so there
+    // is no need to check its value.
+ }
+ 
+ * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
+ * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + *
TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
+ * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) + +/** + * semphr.h + *
TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );
+ * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + */ +#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) + +/** + * semphr.h + *
UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
+ * + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ + + diff --git a/bundles/typical/inc/os/task.h b/bundles/typical/inc/os/task.h index 2885f5665..c1a941879 100644 --- a/bundles/typical/inc/os/task.h +++ b/bundles/typical/inc/os/task.h @@ -2383,9 +2383,7 @@ portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; /* * Return the handle of the calling task. */ -// TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; /* * Capture the current time status for future reference. diff --git a/bundles/typical/inc/platform_api.h b/bundles/typical/inc/platform_api.h index d6fc07f7c..c656c6d6d 100644 --- a/bundles/typical/inc/platform_api.h +++ b/bundles/typical/inc/platform_api.h @@ -74,11 +74,15 @@ typedef enum PLATFORM_CB_EVT_ASSERTION, // when LLE is initializing - PLATFORM_CB_LLE_INIT, + PLATFORM_CB_EVT_LLE_INIT, // when allocation on heap fails (heap out of memory) // if this callback is not defined, CPU enters a dead loop - PLATFORM_CB_HEAP_OOM, + PLATFORM_CB_EVT_HEAP_OOM, + + // platform callback for output or save a trace item + // NOTE: param (void *data) is casted from platform_trace_evt_t * + PLATFORM_CB_EVT_TRACE, PLATFORM_CB_EVT_MAX } platform_evt_callback_type_t; @@ -103,6 +107,28 @@ typedef enum typedef uint32_t (*f_platform_evt_cb)(void *data, void *user_data); typedef uint32_t (*f_platform_irq_cb)(void *user_data); +// A trace item is a combination of data1 and data2. Note: +// 1. len1 or len2 might be 0, but not both +// 2. if callback function finds that it can't output data of size len1 + len2, then, both data1 +// & data2 should be discarded to avoid trace item corruption. +typedef struct +{ + const void *data1; + const void *data2; + uint16_t len1; + uint16_t len2; +} platform_evt_trace_t; + +// A trace item is has an ID +typedef enum +{ + PLATFORM_TRACE_ID_EVENT = 0, + PLATFORM_TRACE_ID_HCI_CMD = 1, + PLATFORM_TRACE_ID_HCI_EVENT = 2, + PLATFORM_TRACE_ID_HCI_ACL = 3, + PLATFORM_TRACE_ID_LLCP = 4 +} platform_trace_item_t; + /** **************************************************************************************** * @brief register callback function for platform events @@ -178,8 +204,9 @@ void platform_switch_app(const uint32_t app_addr); typedef enum { - PLATFORM_CFG_LOG_HCI, // default: disabled - PLATFORM_CFG_POWER_SAVING // default: disabled + PLATFORM_CFG_LOG_HCI, // flag is ENABLE or DISABLE. default: DISABLE + PLATFORM_CFG_POWER_SAVING, // flag is ENABLE or DISABLE. default: DISABLE + PLATFORM_CFG_TRACE_MASK // flag is bitmap of platform_trace_item_t. default: 0 } platform_cfg_item_t; #define PLATFORM_CFG_ENABLE 1 @@ -190,10 +217,10 @@ typedef enum * @brief platform configurations. * * @param[in] item Configuration item - * @param[in] flag PLATFORM_CFG_ENABLE for enable, PLATFORM_CFG_DISABLE for disable + * @param[in] flag see platform_cfg_item_t. **************************************************************************************** */ -void platform_config(const platform_cfg_item_t item, const uint8_t flag); +void platform_config(const platform_cfg_item_t item, const uint32_t flag); /** **************************************************************************************** @@ -234,7 +261,6 @@ void platform_printf(const char *format, ...); // NOTE: for debug only void sysSetPublicDeviceAddr(const unsigned char *addr); -#ifdef OPTIONAL_RF_CLK // set rf source // 0: use external crystal // 1: use internal clock loopback @@ -243,7 +269,6 @@ void platform_set_rf_clk_source(const uint8_t source); void platform_set_rf_init_data(const uint32_t *rf_init_data); void platform_set_rf_power_mapping(const int16_t *rf_power_mapping); -#endif typedef enum coded_scheme_e { diff --git a/bundles/typical/inc/platform_api.nim b/bundles/typical/inc/platform_api.nim index ba6b0fe0d..0d8e1e9fc 100644 --- a/bundles/typical/inc/platform_api.nim +++ b/bundles/typical/inc/platform_api.nim @@ -46,9 +46,11 @@ type ## platform callback for putc (for logging) ## NOTE: param (void *data) is casted from assertion_info_t * ## if this callback is not defined, CPU enters a dead loop PLATFORM_CB_EVT_ASSERTION, ## when LLE is initializing - PLATFORM_CB_LLE_INIT, ## when allocation on heap fails (heap out of memory) - ## if this callback is not defined, CPU enters a dead loop - PLATFORM_CB_HEAP_OOM, PLATFORM_CB_EVT_MAX + PLATFORM_CB_EVT_LLE_INIT, ## when allocation on heap fails (heap out of memory) + ## if this callback is not defined, CPU enters a dead loop + PLATFORM_CB_EVT_HEAP_OOM, ## platform callback for output or save a trace item + ## NOTE: param (void *data) is casted from platform_trace_evt_t * + PLATFORM_CB_EVT_TRACE, PLATFORM_CB_EVT_MAX platform_irq_callback_type_t* {.size: sizeof(cint).} = enum PLATFORM_CB_IRQ_RTC, PLATFORM_CB_IRQ_TIMER0, PLATFORM_CB_IRQ_TIMER1, PLATFORM_CB_IRQ_TIMER2, PLATFORM_CB_IRQ_GPIO, PLATFORM_CB_IRQ_SPI0, @@ -59,6 +61,29 @@ type ## platform callback for putc (for logging) +## A trace item is a combination of data1 and data2. Note: +## 1. len1 or len2 might be 0, but not both +## 2. if callback function finds that it can't output data of size len1 + len2, then, both data1 +## & data2 should be discarded to avoid trace item corruption. + +type + platform_evt_trace_t* {.importc: "platform_evt_trace_t", + header: "platform_api.h", bycopy.} = object + data1* {.importc: "data1".}: pointer + data2* {.importc: "data2".}: pointer + len1* {.importc: "len1".}: uint16 + len2* {.importc: "len2".}: uint16 + + +## A trace item is has an ID + +type + platform_trace_item_t* {.size: sizeof(cint).} = enum + PLATFORM_TRACE_ID_EVENT = 0, PLATFORM_TRACE_ID_HCI_CMD = 1, + PLATFORM_TRACE_ID_HCI_EVENT = 2, PLATFORM_TRACE_ID_HCI_ACL = 3, + PLATFORM_TRACE_ID_LLCP = 4 + + ## * ## *************************************************************************************** ## @brief register callback function for platform events @@ -143,8 +168,9 @@ proc platform_switch_app*(app_addr: uint32) {.importc: "platform_switch_app", header: "platform_api.h".} type platform_cfg_item_t* {.size: sizeof(cint).} = enum - PLATFORM_CFG_LOG_HCI, ## default: disabled - PLATFORM_CFG_POWER_SAVING ## default: disabled + PLATFORM_CFG_LOG_HCI, ## flag is ENABLE or DISABLE. default: DISABLE + PLATFORM_CFG_POWER_SAVING, ## flag is ENABLE or DISABLE. default: DISABLE + PLATFORM_CFG_TRACE_MASK ## flag is bitmap of platform_trace_item_t. default: 0 const @@ -156,27 +182,26 @@ const ## @brief platform configurations. ## ## @param[in] item Configuration item -## @param[in] flag PLATFORM_CFG_ENABLE for enable, PLATFORM_CFG_DISABLE for disable +## @param[in] flag see platform_cfg_item_t. ## *************************************************************************************** ## -proc platform_config*(item: platform_cfg_item_t; flag: uint8) {. +proc platform_config*(item: platform_cfg_item_t; flag: uint32) {. importc: "platform_config", header: "platform_api.h".} ## * ## *************************************************************************************** ## @brief Shutdown the whole system, and power on again after a duration -## specified by duration_ms. +## specified by duration_cycles. ## Optionally, a portion of SYS memory can be retentioned during shutdown. -## Note that: this function will NOT return except that shutdown procedure fails -## to initiate. ## -## @param[in] duration_ms Duration before power on again (in ms) +## @param[in] duration_cycles Duration before power on again (measured in cycles of 32k clock) +## Mininum value: 825 cycles (about 25.18ms) ## @param[in] p_retention_data Pointer to the start of data to be retentioned ## @param[in] data_size Size of the data to be retentioned ## *************************************************************************************** ## -proc platform_shutdown*(duration_ms: uint32; p_retention_data: pointer; +proc platform_shutdown*(duration_cycles: uint32; p_retention_data: pointer; data_size: uint32) {.importc: "platform_shutdown", header: "platform_api.h".} ## * @@ -204,16 +229,16 @@ proc platform_printf*(format: cstring) {.varargs, importc: "platform_printf", proc sysSetPublicDeviceAddr*(`addr`: ptr cuchar) {. importc: "sysSetPublicDeviceAddr", header: "platform_api.h".} -when defined(OPTIONAL_RF_CLK): - ## set rf source - ## 0: use external crystal - ## 1: use internal clock loopback - proc platform_set_rf_clk_source*(source: uint8) {. - importc: "platform_set_rf_clk_source", header: "platform_api.h".} - proc platform_set_rf_init_data*(rf_init_data: ptr uint32) {. - importc: "platform_set_rf_init_data", header: "platform_api.h".} - proc platform_set_rf_power_mapping*(rf_power_mapping: ptr int16) {. - importc: "platform_set_rf_power_mapping", header: "platform_api.h".} +## set rf source +## 0: use external crystal +## 1: use internal clock loopback + +proc platform_set_rf_clk_source*(source: uint8) {. + importc: "platform_set_rf_clk_source", header: "platform_api.h".} +proc platform_set_rf_init_data*(rf_init_data: ptr uint32) {. + importc: "platform_set_rf_init_data", header: "platform_api.h".} +proc platform_set_rf_power_mapping*(rf_power_mapping: ptr int16) {. + importc: "platform_set_rf_power_mapping", header: "platform_api.h".} type coded_scheme_t* {.size: sizeof(cint).} = enum BLE_CODED_S8, BLE_CODED_S2 diff --git a/bundles/typical/platform.bin b/bundles/typical/platform.bin deleted file mode 100644 index b2081113cdcf5f71fdd2a7d1c3cb9b30b5bb7f5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132252 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ȚCaT@0G)Ckkd^b||)d(MYTZ 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 QY%k5)e!WUH?fdNi0Ez7MZ~y=R diff --git a/bundles/typical/symdefs.g b/bundles/typical/symdefs.g deleted file mode 100644 index fb9eaf34d..000000000 --- a/bundles/typical/symdefs.g +++ /dev/null @@ -1,238 +0,0 @@ -att_dispatch_client_can_send_now = 0x00005925; -att_dispatch_client_request_can_send_now_event = 0x0000592d; -att_dispatch_register_client = 0x00005945; -att_dispatch_register_server = 0x00005959; -att_dispatch_server_can_send_now = 0x0000596d; -att_dispatch_server_request_can_send_now_event = 0x00005975; -att_emit_general_event = 0x00005a45; -att_server_can_send_packet_now = 0x0000621d; -att_server_get_mtu = 0x00006221; -att_server_indicate = 0x00006295; -att_server_init = 0x00006319; -att_server_notify = 0x00006355; -att_server_register_packet_handler = 0x0000643d; -att_server_request_can_send_now_event = 0x00006449; -att_set_db = 0x00006465; -att_set_read_callback = 0x00006479; -att_set_write_callback = 0x00006485; -bd_addr_cmp = 0x000065c9; -bd_addr_copy = 0x000065cf; -bd_addr_to_str = 0x000065d9; -big_endian_read_16 = 0x00006611; -big_endian_read_32 = 0x00006619; -big_endian_store_16 = 0x0000662d; -big_endian_store_32 = 0x00006639; -ble_gatts_find_chr = 0x00006765; -ble_gatts_find_svc = 0x000067fd; -btstack_push_user_msg = 0x00006b0d; -char_for_nibble = 0x00006d75; -eTaskConfirmSleepModeStatus = 0x00006ffd; -gap_add_dev_to_periodic_list = 0x00007925; -gap_add_whitelist = 0x0000793d; -gap_aes_encrypt = 0x00007951; -gap_clr_adv_set = 0x00007979; -gap_clr_periodic_adv_list = 0x00007989; -gap_create_connection_cancel = 0x000079e5; -gap_disconnect = 0x000079f5; -gap_disconnect_all = 0x00007a21; -gap_ext_create_connection = 0x00007ac9; -gap_get_connection_parameter_range = 0x00007b8d; -gap_le_read_channel_map = 0x00007bcd; -gap_periodic_adv_create_sync = 0x00007cdd; -gap_periodic_adv_create_sync_cancel = 0x00007d01; -gap_periodic_adv_term_sync = 0x00007d11; -gap_read_periodic_adv_list_size = 0x00007da5; -gap_read_phy = 0x00007db5; -gap_read_remote_info = 0x00007dc9; -gap_read_remote_used_features = 0x00007ddd; -gap_read_rssi = 0x00007df1; -gap_remove_whitelist = 0x00007e05; -gap_rmv_adv_set = 0x00007e91; -gap_rmv_dev_from_periodic_list = 0x00007ea5; -gap_set_adv_set_random_addr = 0x00007ee5; -gap_set_connection_parameter_range = 0x00007f31; -gap_set_def_phy = 0x00007f49; -gap_set_ext_adv_data = 0x00007f61; -gap_set_ext_adv_enable = 0x00007f79; -gap_set_ext_adv_para = 0x00007ff5; -gap_set_ext_scan_enable = 0x000080d5; -gap_set_ext_scan_para = 0x000080ed; -gap_set_ext_scan_response_data = 0x00008195; -gap_set_host_channel_classification = 0x000081ad; -gap_set_periodic_adv_data = 0x000081c1; -gap_set_periodic_adv_enable = 0x00008235; -gap_set_periodic_adv_para = 0x00008249; -gap_set_phy = 0x00008261; -gap_set_random_device_address = 0x0000827d; -gap_start_ccm = 0x000082e1; -gap_update_connection_parameters = 0x00008329; -gatt_client_cancel_write = 0x000087e1; -gatt_client_deserialize_characteristic = 0x00008807; -gatt_client_deserialize_characteristic_descriptor = 0x0000883f; -gatt_client_deserialize_service = 0x0000884d; -gatt_client_discover_characteristic_descriptors = 0x00008879; -gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x000088bb; -gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x0000890b; -gatt_client_discover_characteristics_for_service = 0x0000895b; -gatt_client_discover_characteristics_for_service_by_uuid128 = 0x00008993; -gatt_client_discover_characteristics_for_service_by_uuid16 = 0x000089a1; -gatt_client_discover_primary_services = 0x000089af; -gatt_client_discover_primary_services_by_uuid128 = 0x000089e1; -gatt_client_discover_primary_services_by_uuid16 = 0x00008a25; -gatt_client_execute_write = 0x00008a61; -gatt_client_find_included_services_for_service = 0x00008a87; -gatt_client_get_mtu = 0x00008ab7; -gatt_client_is_ready = 0x00008b61; -gatt_client_listen_for_characteristic_value_updates = 0x00008b77; -gatt_client_prepare_write = 0x00008b9d; -gatt_client_pts_suppress_mtu_exchange = 0x00008bd9; -gatt_client_read_characteristic_descriptor = 0x00008be5; -gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x00008beb; -gatt_client_read_long_characteristic_descriptor = 0x00008c15; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x00008c1d; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00008c23; -gatt_client_read_long_value_of_characteristic = 0x00008c51; -gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00008c59; -gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00008c5f; -gatt_client_read_multiple_characteristic_values = 0x00008c8d; -gatt_client_read_value_of_characteristic = 0x00008cbd; -gatt_client_read_value_of_characteristic_using_value_handle = 0x00008cc3; -gatt_client_read_value_of_characteristics_by_uuid128 = 0x00008cf1; -gatt_client_read_value_of_characteristics_by_uuid16 = 0x00008d3d; -gatt_client_register_handler = 0x00008d89; -gatt_client_reliable_write_long_value_of_characteristic = 0x00008d95; -gatt_client_signed_write_without_response = 0x000091c1; -gatt_client_write_characteristic_descriptor = 0x00009285; -gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x00009293; -gatt_client_write_client_characteristic_configuration = 0x000092cd; -gatt_client_write_long_characteristic_descriptor = 0x0000931f; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x00009331; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00009341; -gatt_client_write_long_value_of_characteristic = 0x0000937d; -gatt_client_write_long_value_of_characteristic_with_offset = 0x0000938d; -gatt_client_write_value_of_characteristic = 0x000093c9; -gatt_client_write_value_of_characteristic_without_response = 0x000093ff; -hci_add_event_handler = 0x0000b6b9; -hci_power_control = 0x0000be2d; -hci_register_acl_packet_handler = 0x0000bfe1; -kv_get = 0x0000c665; -kv_init = 0x0000c67d; -kv_put = 0x0000c6cd; -kv_remove = 0x0000c745; -kv_value_modified = 0x0000c7b5; -kv_visit = 0x0000c7b9; -l2cap_can_send_fixed_channel_packet_now = 0x0000c879; -l2cap_can_send_packet_now = 0x0000c87d; -l2cap_create_channel = 0x0000ca2d; -l2cap_disconnect = 0x0000cb65; -l2cap_get_remote_mtu_for_local_cid = 0x0000ce09; -l2cap_init = 0x0000d279; -l2cap_le_send_flow_control_credit = 0x0000d2c1; -l2cap_max_le_mtu = 0x0000d521; -l2cap_max_mtu = 0x0000d525; -l2cap_next_local_cid = 0x0000d529; -l2cap_next_sig_id = 0x0000d539; -l2cap_register_fixed_channel = 0x0000d5d1; -l2cap_register_packet_handler = 0x0000d5ed; -l2cap_register_service = 0x0000d5f9; -l2cap_request_can_send_fix_channel_now_event = 0x0000d6e1; -l2cap_request_can_send_now_event = 0x0000d705; -l2cap_request_connection_parameter_update = 0x0000d71f; -l2cap_require_security_level_2_for_outgoing_sdp = 0x0000d751; -l2cap_send = 0x0000db15; -l2cap_send_connectionless = 0x0000db8d; -l2cap_send_connectionless3 = 0x0000dc1d; -l2cap_send_echo_request = 0x0000dcb5; -l2cap_send_signaling_le = 0x0000dd19; -l2cap_unregister_service = 0x0000dd71; -ll_hint_on_ce_len = 0x0000df55; -ll_set_adv_coded_scheme = 0x0000e21d; -ll_set_initiating_coded_scheme = 0x0000e241; -nibble_for_char = 0x0001ca51; -platform_config = 0x0001caf5; -platform_get_heap_status = 0x0001cb1d; -platform_get_version = 0x0001cb35; -platform_printf = 0x0001cb3d; -platform_raise_assertion = 0x0001cb51; -platform_reset = 0x0001cb65; -platform_set_evt_callback = 0x0001cb99; -platform_set_irq_callback = 0x0001cbad; -platform_set_rf_clk_source = 0x0001cbe5; -platform_set_rf_init_data = 0x0001cbf1; -platform_set_rf_power_mapping = 0x0001cbfd; -platform_shutdown = 0x0001cc09; -platform_switch_app = 0x0001cc0d; -printf_hexdump = 0x0001d8ed; -pvPortMalloc = 0x0001e3d5; -pvTaskIncrementMutexHeldCount = 0x0001e4bd; -pvTimerGetTimerID = 0x0001e4d5; -pxPortInitialiseStack = 0x0001e501; -reverse_128 = 0x0001e6a9; -reverse_24 = 0x0001e6af; -reverse_48 = 0x0001e6b5; -reverse_56 = 0x0001e6bb; -reverse_64 = 0x0001e6c1; -reverse_bd_addr = 0x0001e6c7; -reverse_bytes = 0x0001e6cd; -sm_add_event_handler = 0x0001e82d; -sm_address_resolution_lookup = 0x0001e961; -sm_authenticated = 0x0001ea3b; -sm_authorization_decline = 0x0001ea51; -sm_authorization_grant = 0x0001ea71; -sm_authorization_state = 0x0001ea91; -sm_bonding_decline = 0x0001eaad; -sm_config = 0x0001ee85; -sm_encryption_key_size = 0x0001ef91; -sm_just_works_confirm = 0x0001f70d; -sm_le_device_key = 0x0001f95d; -sm_passkey_input = 0x0001f9f5; -sm_private_random_address_generation_get = 0x0001fd81; -sm_private_random_address_generation_get_mode = 0x0001fd89; -sm_private_random_address_generation_set_mode = 0x0001fd95; -sm_private_random_address_generation_set_update_period = 0x0001fdbd; -sm_register_oob_data_callback = 0x0001fdf5; -sm_request_pairing = 0x0001fe01; -sm_send_security_request = 0x00020833; -sm_set_accepted_stk_generation_methods = 0x00020859; -sm_set_authentication_requirements = 0x00020865; -sm_set_encryption_key_size_range = 0x00020871; -sscanf_bd_addr = 0x00020b65; -sysSetPublicDeviceAddr = 0x00020ea1; -uuid128_to_str = 0x00021231; -uuid_add_bluetooth_prefix = 0x00021289; -uuid_has_bluetooth_prefix = 0x000212a9; -vPortFree = 0x000213f1; -vQueueWaitForMessageRestricted = 0x000215c1; -vTaskDelay = 0x00021609; -vTaskInternalSetTimeOutState = 0x00021655; -vTaskMissedYield = 0x00021665; -vTaskPlaceOnEventList = 0x00021671; -vTaskPlaceOnEventListRestricted = 0x000216a9; -vTaskPriorityDisinheritAfterTimeout = 0x000216e9; -vTaskStartScheduler = 0x00021795; -vTaskStepTick = 0x00021825; -vTaskSuspendAll = 0x00021855; -vTaskSwitchContext = 0x00021865; -xPortStartScheduler = 0x000218fd; -xQueueGenericCreate = 0x000219b9; -xQueueGenericCreateStatic = 0x00021a05; -xQueueGenericReset = 0x00021a6d; -xQueueGenericSend = 0x00021af9; -xQueueGenericSendFromISR = 0x00021c65; -xQueueGiveFromISR = 0x00021d25; -xQueueReceive = 0x00021dc9; -xQueueSemaphoreTake = 0x00021ef5; -xTaskCheckForTimeOut = 0x00022061; -xTaskCreate = 0x000220d1; -xTaskCreateStatic = 0x0002212d; -xTaskGetSchedulerState = 0x0002219d; -xTaskGetTickCount = 0x000221b9; -xTaskIncrementTick = 0x000221c5; -xTaskPriorityDisinherit = 0x00022291; -xTaskPriorityInherit = 0x00022325; -xTaskRemoveFromEventList = 0x000223b9; -xTaskResumeAll = 0x00022439; -xTimerCreate = 0x00022501; -xTimerCreateStatic = 0x00022535; -xTimerCreateTimerTask = 0x0002256d; -xTimerGenericCommand = 0x000225d9; diff --git a/bundles/typical/symdefs.i b/bundles/typical/symdefs.i deleted file mode 100644 index 40afef777..000000000 --- a/bundles/typical/symdefs.i +++ /dev/null @@ -1,238 +0,0 @@ ---define_symbol att_dispatch_client_can_send_now=0x00005925 ---define_symbol att_dispatch_client_request_can_send_now_event=0x0000592d ---define_symbol att_dispatch_register_client=0x00005945 ---define_symbol att_dispatch_register_server=0x00005959 ---define_symbol att_dispatch_server_can_send_now=0x0000596d ---define_symbol att_dispatch_server_request_can_send_now_event=0x00005975 ---define_symbol att_emit_general_event=0x00005a45 ---define_symbol att_server_can_send_packet_now=0x0000621d ---define_symbol att_server_get_mtu=0x00006221 ---define_symbol att_server_indicate=0x00006295 ---define_symbol att_server_init=0x00006319 ---define_symbol att_server_notify=0x00006355 ---define_symbol att_server_register_packet_handler=0x0000643d ---define_symbol att_server_request_can_send_now_event=0x00006449 ---define_symbol att_set_db=0x00006465 ---define_symbol att_set_read_callback=0x00006479 ---define_symbol att_set_write_callback=0x00006485 ---define_symbol bd_addr_cmp=0x000065c9 ---define_symbol bd_addr_copy=0x000065cf ---define_symbol bd_addr_to_str=0x000065d9 ---define_symbol big_endian_read_16=0x00006611 ---define_symbol big_endian_read_32=0x00006619 ---define_symbol big_endian_store_16=0x0000662d ---define_symbol big_endian_store_32=0x00006639 ---define_symbol ble_gatts_find_chr=0x00006765 ---define_symbol ble_gatts_find_svc=0x000067fd ---define_symbol btstack_push_user_msg=0x00006b0d ---define_symbol char_for_nibble=0x00006d75 ---define_symbol eTaskConfirmSleepModeStatus=0x00006ffd ---define_symbol gap_add_dev_to_periodic_list=0x00007925 ---define_symbol gap_add_whitelist=0x0000793d ---define_symbol gap_aes_encrypt=0x00007951 ---define_symbol gap_clr_adv_set=0x00007979 ---define_symbol gap_clr_periodic_adv_list=0x00007989 ---define_symbol gap_create_connection_cancel=0x000079e5 ---define_symbol gap_disconnect=0x000079f5 ---define_symbol gap_disconnect_all=0x00007a21 ---define_symbol gap_ext_create_connection=0x00007ac9 ---define_symbol gap_get_connection_parameter_range=0x00007b8d ---define_symbol gap_le_read_channel_map=0x00007bcd ---define_symbol gap_periodic_adv_create_sync=0x00007cdd ---define_symbol gap_periodic_adv_create_sync_cancel=0x00007d01 ---define_symbol gap_periodic_adv_term_sync=0x00007d11 ---define_symbol gap_read_periodic_adv_list_size=0x00007da5 ---define_symbol gap_read_phy=0x00007db5 ---define_symbol gap_read_remote_info=0x00007dc9 ---define_symbol gap_read_remote_used_features=0x00007ddd ---define_symbol gap_read_rssi=0x00007df1 ---define_symbol gap_remove_whitelist=0x00007e05 ---define_symbol gap_rmv_adv_set=0x00007e91 ---define_symbol gap_rmv_dev_from_periodic_list=0x00007ea5 ---define_symbol gap_set_adv_set_random_addr=0x00007ee5 ---define_symbol gap_set_connection_parameter_range=0x00007f31 ---define_symbol gap_set_def_phy=0x00007f49 ---define_symbol gap_set_ext_adv_data=0x00007f61 ---define_symbol gap_set_ext_adv_enable=0x00007f79 ---define_symbol gap_set_ext_adv_para=0x00007ff5 ---define_symbol gap_set_ext_scan_enable=0x000080d5 ---define_symbol gap_set_ext_scan_para=0x000080ed ---define_symbol gap_set_ext_scan_response_data=0x00008195 ---define_symbol gap_set_host_channel_classification=0x000081ad ---define_symbol gap_set_periodic_adv_data=0x000081c1 ---define_symbol gap_set_periodic_adv_enable=0x00008235 ---define_symbol gap_set_periodic_adv_para=0x00008249 ---define_symbol gap_set_phy=0x00008261 ---define_symbol gap_set_random_device_address=0x0000827d ---define_symbol gap_start_ccm=0x000082e1 ---define_symbol gap_update_connection_parameters=0x00008329 ---define_symbol gatt_client_cancel_write=0x000087e1 ---define_symbol gatt_client_deserialize_characteristic=0x00008807 ---define_symbol gatt_client_deserialize_characteristic_descriptor=0x0000883f ---define_symbol gatt_client_deserialize_service=0x0000884d ---define_symbol gatt_client_discover_characteristic_descriptors=0x00008879 ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000088bb ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000890b ---define_symbol gatt_client_discover_characteristics_for_service=0x0000895b ---define_symbol gatt_client_discover_characteristics_for_service_by_uuid128=0x00008993 ---define_symbol gatt_client_discover_characteristics_for_service_by_uuid16=0x000089a1 ---define_symbol gatt_client_discover_primary_services=0x000089af ---define_symbol gatt_client_discover_primary_services_by_uuid128=0x000089e1 ---define_symbol gatt_client_discover_primary_services_by_uuid16=0x00008a25 ---define_symbol gatt_client_execute_write=0x00008a61 ---define_symbol gatt_client_find_included_services_for_service=0x00008a87 ---define_symbol gatt_client_get_mtu=0x00008ab7 ---define_symbol gatt_client_is_ready=0x00008b61 ---define_symbol gatt_client_listen_for_characteristic_value_updates=0x00008b77 ---define_symbol gatt_client_prepare_write=0x00008b9d ---define_symbol gatt_client_pts_suppress_mtu_exchange=0x00008bd9 ---define_symbol gatt_client_read_characteristic_descriptor=0x00008be5 ---define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00008beb ---define_symbol gatt_client_read_long_characteristic_descriptor=0x00008c15 ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00008c1d ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008c23 ---define_symbol gatt_client_read_long_value_of_characteristic=0x00008c51 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008c59 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008c5f ---define_symbol gatt_client_read_multiple_characteristic_values=0x00008c8d ---define_symbol gatt_client_read_value_of_characteristic=0x00008cbd ---define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x00008cc3 ---define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00008cf1 ---define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00008d3d ---define_symbol gatt_client_register_handler=0x00008d89 ---define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x00008d95 ---define_symbol gatt_client_signed_write_without_response=0x000091c1 ---define_symbol gatt_client_write_characteristic_descriptor=0x00009285 ---define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009293 ---define_symbol gatt_client_write_client_characteristic_configuration=0x000092cd ---define_symbol gatt_client_write_long_characteristic_descriptor=0x0000931f ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009331 ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009341 ---define_symbol gatt_client_write_long_value_of_characteristic=0x0000937d ---define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x0000938d ---define_symbol gatt_client_write_value_of_characteristic=0x000093c9 ---define_symbol gatt_client_write_value_of_characteristic_without_response=0x000093ff ---define_symbol hci_add_event_handler=0x0000b6b9 ---define_symbol hci_power_control=0x0000be2d ---define_symbol hci_register_acl_packet_handler=0x0000bfe1 ---define_symbol kv_get=0x0000c665 ---define_symbol kv_init=0x0000c67d ---define_symbol kv_put=0x0000c6cd ---define_symbol kv_remove=0x0000c745 ---define_symbol kv_value_modified=0x0000c7b5 ---define_symbol kv_visit=0x0000c7b9 ---define_symbol l2cap_can_send_fixed_channel_packet_now=0x0000c879 ---define_symbol l2cap_can_send_packet_now=0x0000c87d ---define_symbol l2cap_create_channel=0x0000ca2d ---define_symbol l2cap_disconnect=0x0000cb65 ---define_symbol l2cap_get_remote_mtu_for_local_cid=0x0000ce09 ---define_symbol l2cap_init=0x0000d279 ---define_symbol l2cap_le_send_flow_control_credit=0x0000d2c1 ---define_symbol l2cap_max_le_mtu=0x0000d521 ---define_symbol l2cap_max_mtu=0x0000d525 ---define_symbol l2cap_next_local_cid=0x0000d529 ---define_symbol l2cap_next_sig_id=0x0000d539 ---define_symbol l2cap_register_fixed_channel=0x0000d5d1 ---define_symbol l2cap_register_packet_handler=0x0000d5ed ---define_symbol l2cap_register_service=0x0000d5f9 ---define_symbol l2cap_request_can_send_fix_channel_now_event=0x0000d6e1 ---define_symbol l2cap_request_can_send_now_event=0x0000d705 ---define_symbol l2cap_request_connection_parameter_update=0x0000d71f ---define_symbol l2cap_require_security_level_2_for_outgoing_sdp=0x0000d751 ---define_symbol l2cap_send=0x0000db15 ---define_symbol l2cap_send_connectionless=0x0000db8d ---define_symbol l2cap_send_connectionless3=0x0000dc1d ---define_symbol l2cap_send_echo_request=0x0000dcb5 ---define_symbol l2cap_send_signaling_le=0x0000dd19 ---define_symbol l2cap_unregister_service=0x0000dd71 ---define_symbol ll_hint_on_ce_len=0x0000df55 ---define_symbol ll_set_adv_coded_scheme=0x0000e21d ---define_symbol ll_set_initiating_coded_scheme=0x0000e241 ---define_symbol nibble_for_char=0x0001ca51 ---define_symbol platform_config=0x0001caf5 ---define_symbol platform_get_heap_status=0x0001cb1d ---define_symbol platform_get_version=0x0001cb35 ---define_symbol platform_printf=0x0001cb3d ---define_symbol platform_raise_assertion=0x0001cb51 ---define_symbol platform_reset=0x0001cb65 ---define_symbol platform_set_evt_callback=0x0001cb99 ---define_symbol platform_set_irq_callback=0x0001cbad ---define_symbol platform_set_rf_clk_source=0x0001cbe5 ---define_symbol platform_set_rf_init_data=0x0001cbf1 ---define_symbol platform_set_rf_power_mapping=0x0001cbfd ---define_symbol platform_shutdown=0x0001cc09 ---define_symbol platform_switch_app=0x0001cc0d ---define_symbol printf_hexdump=0x0001d8ed ---define_symbol pvPortMalloc=0x0001e3d5 ---define_symbol pvTaskIncrementMutexHeldCount=0x0001e4bd ---define_symbol pvTimerGetTimerID=0x0001e4d5 ---define_symbol pxPortInitialiseStack=0x0001e501 ---define_symbol reverse_128=0x0001e6a9 ---define_symbol reverse_24=0x0001e6af ---define_symbol reverse_48=0x0001e6b5 ---define_symbol reverse_56=0x0001e6bb ---define_symbol reverse_64=0x0001e6c1 ---define_symbol reverse_bd_addr=0x0001e6c7 ---define_symbol reverse_bytes=0x0001e6cd ---define_symbol sm_add_event_handler=0x0001e82d ---define_symbol sm_address_resolution_lookup=0x0001e961 ---define_symbol sm_authenticated=0x0001ea3b ---define_symbol sm_authorization_decline=0x0001ea51 ---define_symbol sm_authorization_grant=0x0001ea71 ---define_symbol sm_authorization_state=0x0001ea91 ---define_symbol sm_bonding_decline=0x0001eaad ---define_symbol sm_config=0x0001ee85 ---define_symbol sm_encryption_key_size=0x0001ef91 ---define_symbol sm_just_works_confirm=0x0001f70d ---define_symbol sm_le_device_key=0x0001f95d ---define_symbol sm_passkey_input=0x0001f9f5 ---define_symbol sm_private_random_address_generation_get=0x0001fd81 ---define_symbol sm_private_random_address_generation_get_mode=0x0001fd89 ---define_symbol sm_private_random_address_generation_set_mode=0x0001fd95 ---define_symbol sm_private_random_address_generation_set_update_period=0x0001fdbd ---define_symbol sm_register_oob_data_callback=0x0001fdf5 ---define_symbol sm_request_pairing=0x0001fe01 ---define_symbol sm_send_security_request=0x00020833 ---define_symbol sm_set_accepted_stk_generation_methods=0x00020859 ---define_symbol sm_set_authentication_requirements=0x00020865 ---define_symbol sm_set_encryption_key_size_range=0x00020871 ---define_symbol sscanf_bd_addr=0x00020b65 ---define_symbol sysSetPublicDeviceAddr=0x00020ea1 ---define_symbol uuid128_to_str=0x00021231 ---define_symbol uuid_add_bluetooth_prefix=0x00021289 ---define_symbol uuid_has_bluetooth_prefix=0x000212a9 ---define_symbol vPortFree=0x000213f1 ---define_symbol vQueueWaitForMessageRestricted=0x000215c1 ---define_symbol vTaskDelay=0x00021609 ---define_symbol vTaskInternalSetTimeOutState=0x00021655 ---define_symbol vTaskMissedYield=0x00021665 ---define_symbol vTaskPlaceOnEventList=0x00021671 ---define_symbol vTaskPlaceOnEventListRestricted=0x000216a9 ---define_symbol vTaskPriorityDisinheritAfterTimeout=0x000216e9 ---define_symbol vTaskStartScheduler=0x00021795 ---define_symbol vTaskStepTick=0x00021825 ---define_symbol vTaskSuspendAll=0x00021855 ---define_symbol vTaskSwitchContext=0x00021865 ---define_symbol xPortStartScheduler=0x000218fd ---define_symbol xQueueGenericCreate=0x000219b9 ---define_symbol xQueueGenericCreateStatic=0x00021a05 ---define_symbol xQueueGenericReset=0x00021a6d ---define_symbol xQueueGenericSend=0x00021af9 ---define_symbol xQueueGenericSendFromISR=0x00021c65 ---define_symbol xQueueGiveFromISR=0x00021d25 ---define_symbol xQueueReceive=0x00021dc9 ---define_symbol xQueueSemaphoreTake=0x00021ef5 ---define_symbol xTaskCheckForTimeOut=0x00022061 ---define_symbol xTaskCreate=0x000220d1 ---define_symbol xTaskCreateStatic=0x0002212d ---define_symbol xTaskGetSchedulerState=0x0002219d ---define_symbol xTaskGetTickCount=0x000221b9 ---define_symbol xTaskIncrementTick=0x000221c5 ---define_symbol xTaskPriorityDisinherit=0x00022291 ---define_symbol xTaskPriorityInherit=0x00022325 ---define_symbol xTaskRemoveFromEventList=0x000223b9 ---define_symbol xTaskResumeAll=0x00022439 ---define_symbol xTimerCreate=0x00022501 ---define_symbol xTimerCreateStatic=0x00022535 ---define_symbol xTimerCreateTimerTask=0x0002256d ---define_symbol xTimerGenericCommand=0x000225d9 diff --git a/bundles/typical/symdefs.m b/bundles/typical/symdefs.m deleted file mode 100644 index 4c49f7042..000000000 --- a/bundles/typical/symdefs.m +++ /dev/null @@ -1,239 +0,0 @@ -## ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 -0x00005925 T att_dispatch_client_can_send_now -0x0000592d T att_dispatch_client_request_can_send_now_event -0x00005945 T att_dispatch_register_client -0x00005959 T att_dispatch_register_server -0x0000596d T att_dispatch_server_can_send_now -0x00005975 T att_dispatch_server_request_can_send_now_event -0x00005a45 T att_emit_general_event -0x0000621d T att_server_can_send_packet_now -0x00006221 T att_server_get_mtu -0x00006295 T att_server_indicate -0x00006319 T att_server_init -0x00006355 T att_server_notify -0x0000643d T att_server_register_packet_handler -0x00006449 T att_server_request_can_send_now_event -0x00006465 T att_set_db -0x00006479 T att_set_read_callback -0x00006485 T att_set_write_callback -0x000065c9 T bd_addr_cmp -0x000065cf T bd_addr_copy -0x000065d9 T bd_addr_to_str -0x00006611 T big_endian_read_16 -0x00006619 T big_endian_read_32 -0x0000662d T big_endian_store_16 -0x00006639 T big_endian_store_32 -0x00006765 T ble_gatts_find_chr -0x000067fd T ble_gatts_find_svc -0x00006b0d T btstack_push_user_msg -0x00006d75 T char_for_nibble -0x00006ffd T eTaskConfirmSleepModeStatus -0x00007925 T gap_add_dev_to_periodic_list -0x0000793d T gap_add_whitelist -0x00007951 T gap_aes_encrypt -0x00007979 T gap_clr_adv_set -0x00007989 T gap_clr_periodic_adv_list -0x000079e5 T gap_create_connection_cancel -0x000079f5 T gap_disconnect -0x00007a21 T gap_disconnect_all -0x00007ac9 T gap_ext_create_connection -0x00007b8d T gap_get_connection_parameter_range -0x00007bcd T gap_le_read_channel_map -0x00007cdd T gap_periodic_adv_create_sync -0x00007d01 T gap_periodic_adv_create_sync_cancel -0x00007d11 T gap_periodic_adv_term_sync -0x00007da5 T gap_read_periodic_adv_list_size -0x00007db5 T gap_read_phy -0x00007dc9 T gap_read_remote_info -0x00007ddd T gap_read_remote_used_features -0x00007df1 T gap_read_rssi -0x00007e05 T gap_remove_whitelist -0x00007e91 T gap_rmv_adv_set -0x00007ea5 T gap_rmv_dev_from_periodic_list -0x00007ee5 T gap_set_adv_set_random_addr -0x00007f31 T gap_set_connection_parameter_range -0x00007f49 T gap_set_def_phy -0x00007f61 T gap_set_ext_adv_data -0x00007f79 T gap_set_ext_adv_enable -0x00007ff5 T gap_set_ext_adv_para -0x000080d5 T gap_set_ext_scan_enable -0x000080ed T gap_set_ext_scan_para -0x00008195 T gap_set_ext_scan_response_data -0x000081ad T gap_set_host_channel_classification -0x000081c1 T gap_set_periodic_adv_data -0x00008235 T gap_set_periodic_adv_enable -0x00008249 T gap_set_periodic_adv_para -0x00008261 T gap_set_phy -0x0000827d T gap_set_random_device_address -0x000082e1 T gap_start_ccm -0x00008329 T gap_update_connection_parameters -0x000087e1 T gatt_client_cancel_write -0x00008807 T gatt_client_deserialize_characteristic -0x0000883f T gatt_client_deserialize_characteristic_descriptor -0x0000884d T gatt_client_deserialize_service -0x00008879 T gatt_client_discover_characteristic_descriptors -0x000088bb T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x0000890b T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x0000895b T gatt_client_discover_characteristics_for_service -0x00008993 T gatt_client_discover_characteristics_for_service_by_uuid128 -0x000089a1 T gatt_client_discover_characteristics_for_service_by_uuid16 -0x000089af T gatt_client_discover_primary_services -0x000089e1 T gatt_client_discover_primary_services_by_uuid128 -0x00008a25 T gatt_client_discover_primary_services_by_uuid16 -0x00008a61 T gatt_client_execute_write -0x00008a87 T gatt_client_find_included_services_for_service -0x00008ab7 T gatt_client_get_mtu -0x00008b61 T gatt_client_is_ready -0x00008b77 T gatt_client_listen_for_characteristic_value_updates -0x00008b9d T gatt_client_prepare_write -0x00008bd9 T gatt_client_pts_suppress_mtu_exchange -0x00008be5 T gatt_client_read_characteristic_descriptor -0x00008beb T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x00008c15 T gatt_client_read_long_characteristic_descriptor -0x00008c1d T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x00008c23 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00008c51 T gatt_client_read_long_value_of_characteristic -0x00008c59 T gatt_client_read_long_value_of_characteristic_using_value_handle -0x00008c5f T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x00008c8d T gatt_client_read_multiple_characteristic_values -0x00008cbd T gatt_client_read_value_of_characteristic -0x00008cc3 T gatt_client_read_value_of_characteristic_using_value_handle -0x00008cf1 T gatt_client_read_value_of_characteristics_by_uuid128 -0x00008d3d T gatt_client_read_value_of_characteristics_by_uuid16 -0x00008d89 T gatt_client_register_handler -0x00008d95 T gatt_client_reliable_write_long_value_of_characteristic -0x000091c1 T gatt_client_signed_write_without_response -0x00009285 T gatt_client_write_characteristic_descriptor -0x00009293 T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x000092cd T gatt_client_write_client_characteristic_configuration -0x0000931f T gatt_client_write_long_characteristic_descriptor -0x00009331 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x00009341 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x0000937d T gatt_client_write_long_value_of_characteristic -0x0000938d T gatt_client_write_long_value_of_characteristic_with_offset -0x000093c9 T gatt_client_write_value_of_characteristic -0x000093ff T gatt_client_write_value_of_characteristic_without_response -0x0000b6b9 T hci_add_event_handler -0x0000be2d T hci_power_control -0x0000bfe1 T hci_register_acl_packet_handler -0x0000c665 T kv_get -0x0000c67d T kv_init -0x0000c6cd T kv_put -0x0000c745 T kv_remove -0x0000c7b5 T kv_value_modified -0x0000c7b9 T kv_visit -0x0000c879 T l2cap_can_send_fixed_channel_packet_now -0x0000c87d T l2cap_can_send_packet_now -0x0000ca2d T l2cap_create_channel -0x0000cb65 T l2cap_disconnect -0x0000ce09 T l2cap_get_remote_mtu_for_local_cid -0x0000d279 T l2cap_init -0x0000d2c1 T l2cap_le_send_flow_control_credit -0x0000d521 T l2cap_max_le_mtu -0x0000d525 T l2cap_max_mtu -0x0000d529 T l2cap_next_local_cid -0x0000d539 T l2cap_next_sig_id -0x0000d5d1 T l2cap_register_fixed_channel -0x0000d5ed T l2cap_register_packet_handler -0x0000d5f9 T l2cap_register_service -0x0000d6e1 T l2cap_request_can_send_fix_channel_now_event -0x0000d705 T l2cap_request_can_send_now_event -0x0000d71f T l2cap_request_connection_parameter_update -0x0000d751 T l2cap_require_security_level_2_for_outgoing_sdp -0x0000db15 T l2cap_send -0x0000db8d T l2cap_send_connectionless -0x0000dc1d T l2cap_send_connectionless3 -0x0000dcb5 T l2cap_send_echo_request -0x0000dd19 T l2cap_send_signaling_le -0x0000dd71 T l2cap_unregister_service -0x0000df55 T ll_hint_on_ce_len -0x0000e21d T ll_set_adv_coded_scheme -0x0000e241 T ll_set_initiating_coded_scheme -0x0001ca51 T nibble_for_char -0x0001caf5 T platform_config -0x0001cb1d T platform_get_heap_status -0x0001cb35 T platform_get_version -0x0001cb3d T platform_printf -0x0001cb51 T platform_raise_assertion -0x0001cb65 T platform_reset -0x0001cb99 T platform_set_evt_callback -0x0001cbad T platform_set_irq_callback -0x0001cbe5 T platform_set_rf_clk_source -0x0001cbf1 T platform_set_rf_init_data -0x0001cbfd T platform_set_rf_power_mapping -0x0001cc09 T platform_shutdown -0x0001cc0d T platform_switch_app -0x0001d8ed T printf_hexdump -0x0001e3d5 T pvPortMalloc -0x0001e4bd T pvTaskIncrementMutexHeldCount -0x0001e4d5 T pvTimerGetTimerID -0x0001e501 T pxPortInitialiseStack -0x0001e6a9 T reverse_128 -0x0001e6af T reverse_24 -0x0001e6b5 T reverse_48 -0x0001e6bb T reverse_56 -0x0001e6c1 T reverse_64 -0x0001e6c7 T reverse_bd_addr -0x0001e6cd T reverse_bytes -0x0001e82d T sm_add_event_handler -0x0001e961 T sm_address_resolution_lookup -0x0001ea3b T sm_authenticated -0x0001ea51 T sm_authorization_decline -0x0001ea71 T sm_authorization_grant -0x0001ea91 T sm_authorization_state -0x0001eaad T sm_bonding_decline -0x0001ee85 T sm_config -0x0001ef91 T sm_encryption_key_size -0x0001f70d T sm_just_works_confirm -0x0001f95d T sm_le_device_key -0x0001f9f5 T sm_passkey_input -0x0001fd81 T sm_private_random_address_generation_get -0x0001fd89 T sm_private_random_address_generation_get_mode -0x0001fd95 T sm_private_random_address_generation_set_mode -0x0001fdbd T sm_private_random_address_generation_set_update_period -0x0001fdf5 T sm_register_oob_data_callback -0x0001fe01 T sm_request_pairing -0x00020833 T sm_send_security_request -0x00020859 T sm_set_accepted_stk_generation_methods -0x00020865 T sm_set_authentication_requirements -0x00020871 T sm_set_encryption_key_size_range -0x00020b65 T sscanf_bd_addr -0x00020ea1 T sysSetPublicDeviceAddr -0x00021231 T uuid128_to_str -0x00021289 T uuid_add_bluetooth_prefix -0x000212a9 T uuid_has_bluetooth_prefix -0x000213f1 T vPortFree -0x000215c1 T vQueueWaitForMessageRestricted -0x00021609 T vTaskDelay -0x00021655 T vTaskInternalSetTimeOutState -0x00021665 T vTaskMissedYield -0x00021671 T vTaskPlaceOnEventList -0x000216a9 T vTaskPlaceOnEventListRestricted -0x000216e9 T vTaskPriorityDisinheritAfterTimeout -0x00021795 T vTaskStartScheduler -0x00021825 T vTaskStepTick -0x00021855 T vTaskSuspendAll -0x00021865 T vTaskSwitchContext -0x000218fd T xPortStartScheduler -0x000219b9 T xQueueGenericCreate -0x00021a05 T xQueueGenericCreateStatic -0x00021a6d T xQueueGenericReset -0x00021af9 T xQueueGenericSend -0x00021c65 T xQueueGenericSendFromISR -0x00021d25 T xQueueGiveFromISR -0x00021dc9 T xQueueReceive -0x00021ef5 T xQueueSemaphoreTake -0x00022061 T xTaskCheckForTimeOut -0x000220d1 T xTaskCreate -0x0002212d T xTaskCreateStatic -0x0002219d T xTaskGetSchedulerState -0x000221b9 T xTaskGetTickCount -0x000221c5 T xTaskIncrementTick -0x00022291 T xTaskPriorityDisinherit -0x00022325 T xTaskPriorityInherit -0x000223b9 T xTaskRemoveFromEventList -0x00022439 T xTaskResumeAll -0x00022501 T xTimerCreate -0x00022535 T xTimerCreateStatic -0x0002256d T xTimerCreateTimerTask -0x000225d9 T xTimerGenericCommand diff --git a/bundles/typical/symdefs.s b/bundles/typical/symdefs.s deleted file mode 100644 index 4c9552e9e..000000000 --- a/bundles/typical/symdefs.s +++ /dev/null @@ -1,238 +0,0 @@ ---defsym:att_dispatch_client_can_send_now=0x00005925 ---defsym:att_dispatch_client_request_can_send_now_event=0x0000592d ---defsym:att_dispatch_register_client=0x00005945 ---defsym:att_dispatch_register_server=0x00005959 ---defsym:att_dispatch_server_can_send_now=0x0000596d ---defsym:att_dispatch_server_request_can_send_now_event=0x00005975 ---defsym:att_emit_general_event=0x00005a45 ---defsym:att_server_can_send_packet_now=0x0000621d ---defsym:att_server_get_mtu=0x00006221 ---defsym:att_server_indicate=0x00006295 ---defsym:att_server_init=0x00006319 ---defsym:att_server_notify=0x00006355 ---defsym:att_server_register_packet_handler=0x0000643d ---defsym:att_server_request_can_send_now_event=0x00006449 ---defsym:att_set_db=0x00006465 ---defsym:att_set_read_callback=0x00006479 ---defsym:att_set_write_callback=0x00006485 ---defsym:bd_addr_cmp=0x000065c9 ---defsym:bd_addr_copy=0x000065cf ---defsym:bd_addr_to_str=0x000065d9 ---defsym:big_endian_read_16=0x00006611 ---defsym:big_endian_read_32=0x00006619 ---defsym:big_endian_store_16=0x0000662d ---defsym:big_endian_store_32=0x00006639 ---defsym:ble_gatts_find_chr=0x00006765 ---defsym:ble_gatts_find_svc=0x000067fd ---defsym:btstack_push_user_msg=0x00006b0d ---defsym:char_for_nibble=0x00006d75 ---defsym:eTaskConfirmSleepModeStatus=0x00006ffd ---defsym:gap_add_dev_to_periodic_list=0x00007925 ---defsym:gap_add_whitelist=0x0000793d ---defsym:gap_aes_encrypt=0x00007951 ---defsym:gap_clr_adv_set=0x00007979 ---defsym:gap_clr_periodic_adv_list=0x00007989 ---defsym:gap_create_connection_cancel=0x000079e5 ---defsym:gap_disconnect=0x000079f5 ---defsym:gap_disconnect_all=0x00007a21 ---defsym:gap_ext_create_connection=0x00007ac9 ---defsym:gap_get_connection_parameter_range=0x00007b8d ---defsym:gap_le_read_channel_map=0x00007bcd ---defsym:gap_periodic_adv_create_sync=0x00007cdd ---defsym:gap_periodic_adv_create_sync_cancel=0x00007d01 ---defsym:gap_periodic_adv_term_sync=0x00007d11 ---defsym:gap_read_periodic_adv_list_size=0x00007da5 ---defsym:gap_read_phy=0x00007db5 ---defsym:gap_read_remote_info=0x00007dc9 ---defsym:gap_read_remote_used_features=0x00007ddd ---defsym:gap_read_rssi=0x00007df1 ---defsym:gap_remove_whitelist=0x00007e05 ---defsym:gap_rmv_adv_set=0x00007e91 ---defsym:gap_rmv_dev_from_periodic_list=0x00007ea5 ---defsym:gap_set_adv_set_random_addr=0x00007ee5 ---defsym:gap_set_connection_parameter_range=0x00007f31 ---defsym:gap_set_def_phy=0x00007f49 ---defsym:gap_set_ext_adv_data=0x00007f61 ---defsym:gap_set_ext_adv_enable=0x00007f79 ---defsym:gap_set_ext_adv_para=0x00007ff5 ---defsym:gap_set_ext_scan_enable=0x000080d5 ---defsym:gap_set_ext_scan_para=0x000080ed ---defsym:gap_set_ext_scan_response_data=0x00008195 ---defsym:gap_set_host_channel_classification=0x000081ad ---defsym:gap_set_periodic_adv_data=0x000081c1 ---defsym:gap_set_periodic_adv_enable=0x00008235 ---defsym:gap_set_periodic_adv_para=0x00008249 ---defsym:gap_set_phy=0x00008261 ---defsym:gap_set_random_device_address=0x0000827d ---defsym:gap_start_ccm=0x000082e1 ---defsym:gap_update_connection_parameters=0x00008329 ---defsym:gatt_client_cancel_write=0x000087e1 ---defsym:gatt_client_deserialize_characteristic=0x00008807 ---defsym:gatt_client_deserialize_characteristic_descriptor=0x0000883f ---defsym:gatt_client_deserialize_service=0x0000884d ---defsym:gatt_client_discover_characteristic_descriptors=0x00008879 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000088bb ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000890b ---defsym:gatt_client_discover_characteristics_for_service=0x0000895b ---defsym:gatt_client_discover_characteristics_for_service_by_uuid128=0x00008993 ---defsym:gatt_client_discover_characteristics_for_service_by_uuid16=0x000089a1 ---defsym:gatt_client_discover_primary_services=0x000089af ---defsym:gatt_client_discover_primary_services_by_uuid128=0x000089e1 ---defsym:gatt_client_discover_primary_services_by_uuid16=0x00008a25 ---defsym:gatt_client_execute_write=0x00008a61 ---defsym:gatt_client_find_included_services_for_service=0x00008a87 ---defsym:gatt_client_get_mtu=0x00008ab7 ---defsym:gatt_client_is_ready=0x00008b61 ---defsym:gatt_client_listen_for_characteristic_value_updates=0x00008b77 ---defsym:gatt_client_prepare_write=0x00008b9d ---defsym:gatt_client_pts_suppress_mtu_exchange=0x00008bd9 ---defsym:gatt_client_read_characteristic_descriptor=0x00008be5 ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00008beb ---defsym:gatt_client_read_long_characteristic_descriptor=0x00008c15 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00008c1d ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008c23 ---defsym:gatt_client_read_long_value_of_characteristic=0x00008c51 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008c59 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008c5f ---defsym:gatt_client_read_multiple_characteristic_values=0x00008c8d ---defsym:gatt_client_read_value_of_characteristic=0x00008cbd ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00008cc3 ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00008cf1 ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00008d3d ---defsym:gatt_client_register_handler=0x00008d89 ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00008d95 ---defsym:gatt_client_signed_write_without_response=0x000091c1 ---defsym:gatt_client_write_characteristic_descriptor=0x00009285 ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009293 ---defsym:gatt_client_write_client_characteristic_configuration=0x000092cd ---defsym:gatt_client_write_long_characteristic_descriptor=0x0000931f ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009331 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009341 ---defsym:gatt_client_write_long_value_of_characteristic=0x0000937d ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x0000938d ---defsym:gatt_client_write_value_of_characteristic=0x000093c9 ---defsym:gatt_client_write_value_of_characteristic_without_response=0x000093ff ---defsym:hci_add_event_handler=0x0000b6b9 ---defsym:hci_power_control=0x0000be2d ---defsym:hci_register_acl_packet_handler=0x0000bfe1 ---defsym:kv_get=0x0000c665 ---defsym:kv_init=0x0000c67d ---defsym:kv_put=0x0000c6cd ---defsym:kv_remove=0x0000c745 ---defsym:kv_value_modified=0x0000c7b5 ---defsym:kv_visit=0x0000c7b9 ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c879 ---defsym:l2cap_can_send_packet_now=0x0000c87d ---defsym:l2cap_create_channel=0x0000ca2d ---defsym:l2cap_disconnect=0x0000cb65 ---defsym:l2cap_get_remote_mtu_for_local_cid=0x0000ce09 ---defsym:l2cap_init=0x0000d279 ---defsym:l2cap_le_send_flow_control_credit=0x0000d2c1 ---defsym:l2cap_max_le_mtu=0x0000d521 ---defsym:l2cap_max_mtu=0x0000d525 ---defsym:l2cap_next_local_cid=0x0000d529 ---defsym:l2cap_next_sig_id=0x0000d539 ---defsym:l2cap_register_fixed_channel=0x0000d5d1 ---defsym:l2cap_register_packet_handler=0x0000d5ed ---defsym:l2cap_register_service=0x0000d5f9 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d6e1 ---defsym:l2cap_request_can_send_now_event=0x0000d705 ---defsym:l2cap_request_connection_parameter_update=0x0000d71f ---defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d751 ---defsym:l2cap_send=0x0000db15 ---defsym:l2cap_send_connectionless=0x0000db8d ---defsym:l2cap_send_connectionless3=0x0000dc1d ---defsym:l2cap_send_echo_request=0x0000dcb5 ---defsym:l2cap_send_signaling_le=0x0000dd19 ---defsym:l2cap_unregister_service=0x0000dd71 ---defsym:ll_hint_on_ce_len=0x0000df55 ---defsym:ll_set_adv_coded_scheme=0x0000e21d ---defsym:ll_set_initiating_coded_scheme=0x0000e241 ---defsym:nibble_for_char=0x0001ca51 ---defsym:platform_config=0x0001caf5 ---defsym:platform_get_heap_status=0x0001cb1d ---defsym:platform_get_version=0x0001cb35 ---defsym:platform_printf=0x0001cb3d ---defsym:platform_raise_assertion=0x0001cb51 ---defsym:platform_reset=0x0001cb65 ---defsym:platform_set_evt_callback=0x0001cb99 ---defsym:platform_set_irq_callback=0x0001cbad ---defsym:platform_set_rf_clk_source=0x0001cbe5 ---defsym:platform_set_rf_init_data=0x0001cbf1 ---defsym:platform_set_rf_power_mapping=0x0001cbfd ---defsym:platform_shutdown=0x0001cc09 ---defsym:platform_switch_app=0x0001cc0d ---defsym:printf_hexdump=0x0001d8ed ---defsym:pvPortMalloc=0x0001e3d5 ---defsym:pvTaskIncrementMutexHeldCount=0x0001e4bd ---defsym:pvTimerGetTimerID=0x0001e4d5 ---defsym:pxPortInitialiseStack=0x0001e501 ---defsym:reverse_128=0x0001e6a9 ---defsym:reverse_24=0x0001e6af ---defsym:reverse_48=0x0001e6b5 ---defsym:reverse_56=0x0001e6bb ---defsym:reverse_64=0x0001e6c1 ---defsym:reverse_bd_addr=0x0001e6c7 ---defsym:reverse_bytes=0x0001e6cd ---defsym:sm_add_event_handler=0x0001e82d ---defsym:sm_address_resolution_lookup=0x0001e961 ---defsym:sm_authenticated=0x0001ea3b ---defsym:sm_authorization_decline=0x0001ea51 ---defsym:sm_authorization_grant=0x0001ea71 ---defsym:sm_authorization_state=0x0001ea91 ---defsym:sm_bonding_decline=0x0001eaad ---defsym:sm_config=0x0001ee85 ---defsym:sm_encryption_key_size=0x0001ef91 ---defsym:sm_just_works_confirm=0x0001f70d ---defsym:sm_le_device_key=0x0001f95d ---defsym:sm_passkey_input=0x0001f9f5 ---defsym:sm_private_random_address_generation_get=0x0001fd81 ---defsym:sm_private_random_address_generation_get_mode=0x0001fd89 ---defsym:sm_private_random_address_generation_set_mode=0x0001fd95 ---defsym:sm_private_random_address_generation_set_update_period=0x0001fdbd ---defsym:sm_register_oob_data_callback=0x0001fdf5 ---defsym:sm_request_pairing=0x0001fe01 ---defsym:sm_send_security_request=0x00020833 ---defsym:sm_set_accepted_stk_generation_methods=0x00020859 ---defsym:sm_set_authentication_requirements=0x00020865 ---defsym:sm_set_encryption_key_size_range=0x00020871 ---defsym:sscanf_bd_addr=0x00020b65 ---defsym:sysSetPublicDeviceAddr=0x00020ea1 ---defsym:uuid128_to_str=0x00021231 ---defsym:uuid_add_bluetooth_prefix=0x00021289 ---defsym:uuid_has_bluetooth_prefix=0x000212a9 ---defsym:vPortFree=0x000213f1 ---defsym:vQueueWaitForMessageRestricted=0x000215c1 ---defsym:vTaskDelay=0x00021609 ---defsym:vTaskInternalSetTimeOutState=0x00021655 ---defsym:vTaskMissedYield=0x00021665 ---defsym:vTaskPlaceOnEventList=0x00021671 ---defsym:vTaskPlaceOnEventListRestricted=0x000216a9 ---defsym:vTaskPriorityDisinheritAfterTimeout=0x000216e9 ---defsym:vTaskStartScheduler=0x00021795 ---defsym:vTaskStepTick=0x00021825 ---defsym:vTaskSuspendAll=0x00021855 ---defsym:vTaskSwitchContext=0x00021865 ---defsym:xPortStartScheduler=0x000218fd ---defsym:xQueueGenericCreate=0x000219b9 ---defsym:xQueueGenericCreateStatic=0x00021a05 ---defsym:xQueueGenericReset=0x00021a6d ---defsym:xQueueGenericSend=0x00021af9 ---defsym:xQueueGenericSendFromISR=0x00021c65 ---defsym:xQueueGiveFromISR=0x00021d25 ---defsym:xQueueReceive=0x00021dc9 ---defsym:xQueueSemaphoreTake=0x00021ef5 ---defsym:xTaskCheckForTimeOut=0x00022061 ---defsym:xTaskCreate=0x000220d1 ---defsym:xTaskCreateStatic=0x0002212d ---defsym:xTaskGetSchedulerState=0x0002219d ---defsym:xTaskGetTickCount=0x000221b9 ---defsym:xTaskIncrementTick=0x000221c5 ---defsym:xTaskPriorityDisinherit=0x00022291 ---defsym:xTaskPriorityInherit=0x00022325 ---defsym:xTaskRemoveFromEventList=0x000223b9 ---defsym:xTaskResumeAll=0x00022439 ---defsym:xTimerCreate=0x00022501 ---defsym:xTimerCreateStatic=0x00022535 ---defsym:xTimerCreateTimerTask=0x0002256d ---defsym:xTimerGenericCommand=0x000225d9 diff --git a/examples-gcc/peripheral_ibeacon/Makefile b/examples-gcc/peripheral_ibeacon/Makefile index b7ecf2080..178abd495 100644 --- a/examples-gcc/peripheral_ibeacon/Makefile +++ b/examples-gcc/peripheral_ibeacon/Makefile @@ -6,6 +6,6 @@ APPNAME=peripheral_ibeacon PROJECT_FILES=src/main.c ../../examples/${APPNAME}/src/profile.c ${ING_REL}/src/FWlib/peripheral_uart.c -SYMDEFS=-Wl,--just-symbols=../../bundles/typical/symdefs.g +SYMDEFS=-Wl,--just-symbols=../../bundles/typical/ING9188xx/symdefs.g include makefile.conf diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw index d5b65dfb8..dac990d92 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,59 +1,288 @@ { - "bundle_meta": { - "rom": { - "size": 132252, - "base": 16384 + "bundle_meta": { + "rom": { + "size": 131788, + "base": 16384 + }, + "ram": { + "size": 30560, + "base": 536880208 + }, + "app": { + "base": 155648 + }, + "api": [ + "att_server_init", + "att_server_register_packet_handler", + "att_server_can_send_packet_now", + "att_server_request_can_send_now_event", + "att_server_notify", + "att_server_indicate", + "att_server_get_mtu", + "att_emit_general_event", + "att_set_db", + "att_set_read_callback", + "att_set_write_callback", + "att_dispatch_register_client", + "att_dispatch_register_server", + "att_dispatch_client_can_send_now", + "att_dispatch_server_can_send_now", + "att_dispatch_client_request_can_send_now_event", + "att_dispatch_server_request_can_send_now_event", + "gatt_client_discover_primary_services", + "gatt_client_discover_primary_services_by_uuid16", + "gatt_client_discover_primary_services_by_uuid128", + "gatt_client_find_included_services_for_service", + "gatt_client_discover_characteristics_for_service", + "gatt_client_discover_characteristics_for_handle_range_by_uuid16", + "gatt_client_discover_characteristics_for_handle_range_by_uuid128", + "gatt_client_discover_characteristic_descriptors", + "gatt_client_read_value_of_characteristic_using_value_handle", + "gatt_client_read_value_of_characteristics_by_uuid16", + "gatt_client_read_value_of_characteristics_by_uuid128", + "gatt_client_read_long_value_of_characteristic_using_value_handle", + "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", + "gatt_client_read_multiple_characteristic_values", + "gatt_client_write_value_of_characteristic_without_response", + "gatt_client_signed_write_without_response", + "gatt_client_write_value_of_characteristic", + "gatt_client_write_long_value_of_characteristic", + "gatt_client_write_long_value_of_characteristic_with_offset", + "gatt_client_reliable_write_long_value_of_characteristic", + "gatt_client_read_characteristic_descriptor_using_descriptor_handle", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", + "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", + "gatt_client_write_characteristic_descriptor_using_descriptor_handle", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", + "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", + "gatt_client_write_client_characteristic_configuration", + "gatt_client_prepare_write", + "gatt_client_execute_write", + "gatt_client_cancel_write", + "gatt_client_get_mtu", + "gatt_client_is_ready", + "gatt_client_listen_for_characteristic_value_updates", + "gatt_client_register_handler", + "gatt_client_pts_suppress_mtu_exchange", + "gap_set_random_device_address", + "gap_disconnect", + "gap_disconnect_all", + "gap_add_whitelist", + "gap_remove_whitelist", + "gap_read_rssi", + "gap_read_remote_used_features", + "gap_read_remote_info", + "gap_le_read_channel_map", + "gap_read_phy", + "gap_set_def_phy", + "gap_set_phy", + "gap_set_adv_set_random_addr", + "gap_set_ext_scan_para", + "gap_set_ext_scan_response_data", + "gap_set_ext_scan_enable", + "gap_set_ext_adv_enable", + "gap_set_ext_adv_para", + "gap_set_ext_adv_data", + "gap_set_periodic_adv_data", + "gap_set_periodic_adv_enable", + "gap_set_periodic_adv_para", + "gap_clr_adv_set", + "gap_rmv_adv_set", + "gap_periodic_adv_create_sync", + "gap_periodic_adv_create_sync_cancel", + "gap_periodic_adv_term_sync", + "gap_add_dev_to_periodic_list", + "gap_rmv_dev_from_periodic_list", + "gap_clr_periodic_adv_list", + "gap_read_periodic_adv_list_size", + "gap_ext_create_connection", + "gap_create_connection_cancel", + "gap_set_host_channel_classification", + "gap_update_connection_parameters", + "gap_get_connection_parameter_range", + "gap_set_connection_parameter_range", + "gap_aes_encrypt", + "gap_start_ccm", + "hci_add_event_handler", + "hci_register_acl_packet_handler", + "hci_power_control", + "platform_set_evt_callback", + "platform_set_irq_callback", + "platform_get_version", + "platform_raise_assertion", + "platform_get_heap_status", + "platform_reset", + "platform_switch_app", + "platform_config", + "platform_shutdown", + "platform_printf", + "sysSetPublicDeviceAddr", + "platform_set_rf_clk_source", + "platform_set_rf_init_data", + "platform_set_rf_power_mapping", + "ll_set_adv_coded_scheme", + "ll_set_initiating_coded_scheme", + "ll_hint_on_ce_len", + "big_endian_read_16", + "big_endian_read_32", + "big_endian_store_16", + "big_endian_store_32", + "reverse_bytes", + "reverse_24", + "reverse_48", + "reverse_56", + "reverse_64", + "reverse_128", + "reverse_bd_addr", + "char_for_nibble", + "nibble_for_char", + "bd_addr_cmp", + "bd_addr_copy", + "printf_hexdump", + "uuid128_to_str", + "bd_addr_to_str", + "sscanf_bd_addr", + "uuid_add_bluetooth_prefix", + "uuid_has_bluetooth_prefix", + "btstack_push_user_msg", + "l2cap_register_fixed_channel", + "l2cap_can_send_fixed_channel_packet_now", + "l2cap_request_can_send_fix_channel_now_event", + "l2cap_send_connectionless", + "l2cap_send_connectionless3", + "l2cap_le_send_flow_control_credit", + "l2cap_send_echo_request", + "l2cap_require_security_level_2_for_outgoing_sdp", + "l2cap_init", + "l2cap_register_packet_handler", + "l2cap_max_mtu", + "l2cap_max_le_mtu", + "l2cap_create_channel", + "l2cap_disconnect", + "l2cap_get_remote_mtu_for_local_cid", + "l2cap_send", + "l2cap_register_service", + "l2cap_unregister_service", + "l2cap_can_send_packet_now", + "l2cap_request_can_send_now_event", + "l2cap_request_connection_parameter_update", + "l2cap_send_signaling_le", + "l2cap_next_sig_id", + "l2cap_next_local_cid", + "sm_config", + "sm_add_event_handler", + "sm_private_random_address_generation_set_mode", + "sm_private_random_address_generation_get_mode", + "sm_private_random_address_generation_set_update_period", + "sm_private_random_address_generation_get", + "sm_register_oob_data_callback", + "sm_bonding_decline", + "sm_just_works_confirm", + "sm_passkey_input", + "sm_set_accepted_stk_generation_methods", + "sm_set_encryption_key_size_range", + "sm_set_authentication_requirements", + "sm_send_security_request", + "sm_encryption_key_size", + "sm_authenticated", + "sm_authorization_state", + "sm_request_pairing", + "sm_authorization_decline", + "sm_authorization_grant", + "sm_address_resolution_lookup", + "sm_le_device_key", + "kv_init", + "kv_remove", + "kv_put", + "kv_get", + "kv_value_modified", + "kv_visit", + "xQueueGenericSend", + "xQueueReceive", + "xQueueGenericSendFromISR", + "xQueueGiveFromISR", + "xQueueSemaphoreTake", + "xQueueGenericCreate", + "xQueueGenericCreateStatic", + "vQueueWaitForMessageRestricted", + "xQueueGenericReset", + "xTaskCreate", + "xTaskCreateStatic", + "vTaskDelay", + "vTaskStartScheduler", + "vTaskSuspendAll", + "xTaskResumeAll", + "xTaskGetTickCount", + "xTaskIncrementTick", + "vTaskPlaceOnEventList", + "vTaskPlaceOnEventListRestricted", + "xTaskRemoveFromEventList", + "vTaskSwitchContext", + "xTaskCheckForTimeOut", + "vTaskMissedYield", + "xTaskGetSchedulerState", + "xTaskPriorityInherit", + "xTaskPriorityDisinherit", + "vTaskPriorityDisinheritAfterTimeout", + "vTaskStepTick", + "eTaskConfirmSleepModeStatus", + "pvTaskIncrementMutexHeldCount", + "vTaskInternalSetTimeOutState", + "xTimerCreate", + "xTimerCreateStatic", + "pvTimerGetTimerID", + "xTimerCreateTimerTask", + "xTimerGenericCommand", + "pxPortInitialiseStack", + "pvPortMalloc", + "vPortFree", + "xPortStartScheduler" + ], + "version": [ + 0, + 15, + 0 + ] }, - "ram": { - "size": 30560, - "base": 536880208 + "tc_dir": "C:/Program Files(2)/gcc-arm-none-eabi-8-2018-q4-major-win32/bin", + "ide_ver": "", + "ide_exe": "C:/Program Files(2)/gcc-arm-none-eabi-8-2018-q4-major-win32/bin/arm-none-eabi-gcc.exe", + "ota": false, + "ide": "gcc", + "git": false, + "gcc": true, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "proj_name": "peripheral_ibeacon", + "sdk_release_path": "../..", + "legacy_adv": true, + "adv_data": "0\r\n", + "wizard_dir": "C:/projects/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:/projects/svn/SDK_Release/examples-gcc\\peripheral_ibeacon", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], - "version": [ - 0,14,7] - }, - "tc_dir": "C:\/Program Files(2)\/gcc-arm-none-eabi-8-2018-q4-major-win32\/bin", - "ide_ver": "", - "ide_exe": "C:\/Program Files(2)\/gcc-arm-none-eabi-8-2018-q4-major-win32\/bin\/arm-none-eabi-gcc.exe", - "ota": false, - "ide": "gcc", - "git": false, - "gcc": true, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_ibeacon", - "sdk_release_path": "..\/..", - "legacy_adv": true, - "adv_data": "0\r\n", - "wizard_dir": "C:\/projects\/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples-gcc\\peripheral_ibeacon", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true - }, - "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false -} \ No newline at end of file + "cmsis": "C:/projects/ingWizard/CMSIS", + "app_ram_size": 25680, + "app_ram_addr": 536910768, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false, + "series": "ING9188xx" +} diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index 34ba61cc9..4676a1ce6 100644 --- a/examples-iar/peripheral_ibeacon/generic_cortex.icf +++ b/examples-iar/peripheral_ibeacon/generic_cortex.icf @@ -2,9 +2,9 @@ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ /*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 155648; +define symbol __ICFEDIT_intvec_start__ = 155648; /*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 155648; +define symbol __ICFEDIT_region_IROM1_start__ = 155648; define symbol __ICFEDIT_region_IROM1_end__ = 0x00084000; define symbol __ICFEDIT_region_IROM2_start__ = 0x0; define symbol __ICFEDIT_region_IROM2_end__ = 0x0; @@ -14,7 +14,7 @@ define symbol __ICFEDIT_region_EROM2_start__ = 0x0; define symbol __ICFEDIT_region_EROM2_end__ = 0x0; define symbol __ICFEDIT_region_EROM3_start__ = 0x0; define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 536910768; +define symbol __ICFEDIT_region_IRAM1_start__ = 536910768; define symbol __ICFEDIT_region_IRAM1_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; diff --git a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ewp b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ewp index 9def0ed85..4ca310ef4 100644 --- a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ewp +++ b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ewp @@ -812,7 +812,7 @@
K%D@X@5PF$_9m>+y)@_GLA;M z$~qA?f`ni8ROd}ATW z=t{y9$?&de1uOTRfQ*=fqFfCkR89T61DsH8I(${3PvPo7Hpz66KmiKk=*m;v1~5R+ zBImoZa0S8L6A~)CUAtWMYsEvTwce(XpI}#n^CQU2?xuz({TLWu4aaQ7{ATxB$dj++ zDz6O1%vP_k%G+9haDq)C>mA_6w9dD{79S4@3`&Pedt5Dzp#KY8KM{J$0k*pbH~?#h zGW8~4i#3W`UXGcQnBM{?YcU)b39{{0q}SQ=xyptsX_yA|M}j1$y!Ix6CxzGw1!!~M z2`iT8WWk)3Xp&)&3E<~t?MYMB+Ud}R9JVvv*4G5$Q)}DOOMob!@v(M#5APAW{+9Kc zu-2!sV|KczQ8$WrgIhC#zs*ZgNC6zKq+*)e0S9?PC?G`nKp}DO(J+vbkiIt^#M8*V zxvCG`Qt-J&@R4M}UVYrn>Jj>Dupn6>w$ZjXj_DK0hkLaR=iPbG;SA`|v{c7caw8#7 z8^(VO!@STJ6xMiY+>#EKg@)G7P<}&b{<_63*s%#t);?Mr4StsUgG@*Y7I-yw`J^Cw z8$itG>{cD5-f3VUUSSI0J)l*?id08(D*HLnPX4torlDCJ*!?$&onKFh{hCj~71&3? zxZy|_w9oO>I#_O?w|wZ$1VjAY6YIJYIOe7ham!%?AYFWDO9h0Ny+Giw0VqLN0darZ z=YnVff-}3AT_?`N*Kbk>>D!k8$w&Tu(`J3{T?2yF03NoFf(7=W(6=@;=QLICFA+<( zHywik=sG;N1?W20_yX8?sd^(94jFzeKnNpY>yGH9o9@oN;F}0-QcQOCz$pnYInk4y zH`yz7DO~i(=sY*lOEi?tkMtD464Ze33FF@%SmyPGM6*9B<4rgxf#L8&p(Dt;tXi;H zF<%hcK9ng=-#-&{?GN^6H`F$^pA&y*lWdLP4qgq{N3FO^)VCb9YnxDRH;C_;s=Zue zB|ZgQ+=U?DVcN3AZP$fjzY82%mB~<7T`GP${>9WV8@+eg9il~}u7cx8*xZ!tIMhMY zY}KA@%Ns6KZ0&W~4_;lbuIQL$Y8NZ9vg#ek9XXI0p%Q6hFy+KKm^^l14EXOqI*`>c z#w2+m0$fS(5=mZgigr!8$(SC&?{u>iOEuyp%2qqwiBv&pf($5>WrGypu6`UH=4A4e z&aQq*bY^diiz**1C?EMQLk(3{;z7}n_NyiNkR5~Jus9sGa%thsQMuyJH@E@ZXlnj; z@P1K%Dp(#x2;eDjHBoYV(to^f;O?PdwxtBU)sN*jIvTFc_#n$MHZ z$dB=%kU&TV)41BlE=1k>IoAZW@0uX>nHQ?NWqdLiKGy_=j~qTU3_nAJLo*@yVA|ng z)o4-LpNwR{Vw(=@;A0v)4;Lr=>Mnp!4J-hu1kNZw^_No$>pz^v^!iEE$EjFH@;*+> z9pLQr+XGlH)5tDMwOSo~=YW65UuEM~4d_JSJVO?JJaKexkRC?}2yc1~E?6hv1_43i z(Yl_6-GL0PPiUOw4)9irnA>h)R?NPN8D^>Z30js;E`MB{EB*7$>d+fx_zAoyZir{y ztbc}bDN=DH*D!T3{4N2Wv;s6hiYL{Ts1yK|7_=8zj+7Vuq~%CFo=M(3GL`wtL#`cR zr|$KXa@+ec3gY=-zdd05cEgUkj9iw*)vq1y$L?`SbfFU;)4pTB@%>&61c3 zUX5+=caTev*`LJWwdCPX^!UHzrB6y@rVZ*?JY>v=Q@qI8PpV}n!Tv8Kd7n1rW&2$V zr7Z?~S`FF+-;6Lzo}((tgZyWVEt#q*#w+jME`3+VUnXZhEyAA@)n{1=(_`qkgjxpl zoTs=Gm%`Nv+~;KMXSIrVr>U#Z^$!U7Y%G43^nR8Rc@qwW@o(b&Y`n_ik#03!S*rP* zO!!+u`ftLYE)pl?s&%P^q4*{$fPgS7M9zI?paGv712!45yNGkcr3NYy~Z;p+@tMB&?J_N`CvI z7&}PDmq|=aklga+DA*KBzf8h}G<~U$ckR)KFjhl#;QZO){ArOK{?d?3k0}4s$cv0k zXuBr78_;o7C{+OJej$Oxd^HOW`Y!z{3ExkezIrqI7jTOXsLgQD9rUZQ$12b zNJPn1VThMlju~RQJp=kVUp__}1`qn>cnNY0pk0@yB81Rp*%cgjGuG2U2NQ4YBdL;fM+3Spo{mweTm z!Q%u&)koxn!Ln@nIv4LJ-CvKuV@dzl^V6!lR7A$(I%xm8_}ZYV@YH6y9!tN`l{^eK zHq49cPsVj+Z)`Zs%Sqqg&5)>&aiQWr50WF_1QvfM=7V)XWAytyQr%sQOrr2dX-gR-5eyBL7m4S5gB>dgvvtAAUh+OI&5!WovfGu9bQGulfffWvRciFc( z#SHP+5YxHm+tQ*9u(_$)o3+5thRB5H4$6EEHQpg_I|6+UMrgCVEAkc z<-ga3*S$x?>=wG=k6e<%w>fCpcU~ero*mQWE{6=)(Lg50L}ZgfD(=YR`m%4uj|Rs% zz}KQ63j&Te1|U7VKSB}Wat0RBbg|lN%(6Hb>yKp9@tWK%|F@$727i-3%4r%Nz!^{Q zi6qD!N;&a(>UX2?Ml$`o(Ie`{!r{lsSj${S+S{qN3w|=2cyA2WsJSrS)kDJ@ z1MCFp3pt!4zbu7CpFuwRE)PtD{_jRayx~UKGVpj_5pD^PVgDIZI8a>=Q_9grpqyVZ#R3Dh$DLExHLYm7bacn9|AN{ks_{U+k{` z3u@F4`HGDJ0}SkLGX95Z@ZPQe;Y-M4zWr>0>Q}#cak4|o8_D{!V^iMt(hnn@xD<<( z6L9a5OR-J#B$$%lO3t3041>x0?+7_v+DS#^zW>UiopjK@2EsTzxmM559L_zH~%^&iVt@mluJ)aufJ%e_i|UZNnbO%Jj_x#x5?qFzcRWP>?5qIB`vPEKj z_p{6_?89mwLB|JQ$tPCuxpPK?nl_;PWhqfjs#5U0NU+`cm<~ zc~|yq1Np4tUw5w@>`mR-1|>B7jkI#`@%>Ja9Z0aelbpUZKfL@; zEwql*{89#~aevVQe7Au=Pnv&u2xk&}S*JhXrh?)#pr?Les*mbgRp1H{g>!?x0ZLV7 zQgb;s0|UP}0`;hyXd)O`5V(ap)}9Fc^*%FczMRsq#uMYJ;2FG1Jf$AUwO7ClKjB88 zRvE7>n+>X!TE(A)RyQegDA1Xji=L$J+zf5LRLGnW+R7`Vu_)Z@iT)cb2Gn*r!1`AR zmJ$wosDMZO1*eR{A^Kkv#*PZLQx4*Avt3!Joh;O@`ETup({`OQT?!Wg&{^{6ulj~1 zgYR#FcXTzao%GZ|B)mtUH%CmR!uVOS3P zn_+`6z*DPH0>#c0L15jGR7hA+I0+dNbRMjosZ$a;q~9W*LX`?RN&D?z4X=WxJg^g~ zLre|w#v5b|Y;VluUE&P1OT44*2!69teOe8BL@k;e)Nv`(gaM9g#Tb}v6@T6x6gGMl zF3jG!Txyz=Rtk|s6%S`Z2jPwY%tFq#DHQrw06nI6TfbUX3g@KnU|A)A+5nX;%jstk z83XRc{O4}OyFx~hnZ*2FRCZ9bIL!6y#cIrkJgKeqO8!GQ;@S#jCXDoyP#}#T2t_xj z_=C#+`%HW%`SSPixQm4Uk)=2cL`BJ`^p6BACDnfvV}?BXM?rNwd{K~rlgvBd6CagV zDlm3cUJ1uE3t$DbxHu@b6g4!hS-D&S({MZhrzs#IOz&>lM|IJ7XmNAf zsykCS6>L3)Ny(3Z?|mqN`(vJ-FQst+72izm;dMBPH1ctiV<0VKOK4&L>z}7-@%Hl; zD*{8p0QKhn4d%EI5v6cafGY>M*8{WQ+>uv9$(@qE3PQK%_=KV70}4nFKPY0h27YCO z?`{D|>YgzGg9WyA6TdKkb2LD5`ZF_9LKP6If+{ZnC!ro3IG2`DOv-^|oQo_+w z3S=VGpcH!(2p#06|3{}v{z9n!1gLKq?3AJW22NrxOO2<^ke5euOh-+Le2muDlhUiR za39%pHKXE`hh3EHknn}#5wQdkkQn}0(8gnAyfHKOT;IUE%+R|PO|4Hi!Y2rosq_#F z1G#+E%knw-WrnuPYh>)Thvc+&N*ej_8V6@p z{MV*Mf2A@!QK1U5k$jsM^?y$8xjxbGId}sx|DGRdnJthsm!o(g?Xn6@tDveb!{6Zx zou_;4g}2BT*R{-NUh@0(QHn)=*8el2F|es7vcrKs`#1pOk{MGiv2E#&lk&2^lslEM;n_@(`%(g4oqf`c*-L zopAWYothmS6k)}K@WKFIB)ld7j_%zE{`(+#+08O%;S*Qxs>wh3er8<{Z%-Rh^$8>b zT?)uioHIpR!krTDR`cK-VD0ovE37SwRZzZWfO4d8D*0D|We#}Z;4`s%lFOBREt%@k z;P=Uco_ADj9+nGn5~A^zfxw^cEoD030E#zTD(80vNxOGDl+N@OV{TWIZv=*iL;jIW zo1ggn+ryiKD97oLK#%v44*~_nx4JLPhXeLYlFJo56Z#O*fVh!z2bUoDjsdMX4j6M{ zZv;g7|4mdueOk8r=l`#+FM*4y-2XnmS(srTKm`=^4C|n%gNb5p1Lz2DpqXjiYH-N` zHBnnIEg-e9vb4p=>UM+5QqvpbQsQo_c5hvC$zL6j#Tr`x;ebt9=(g(}(v8=K zQ)<5huJ4^O;321$IHXTpDJ9=K<8{$#qR}BWyWVN&YfHqNo;n?#H@~)$9`8G3KMbNB z3P`UW;w=mjvE{W@y*t{>ad&?0c1UIy%OEnPuEcTOw3_q9cZq$IiaQ0R$t*B(Jnp*L zZejIAiGytWs>h9&Cqp3305YIM8ti%jID$hO>Qa^Pt5ey{rx(9~DhzDdib8k2%)Z8W zO!{TdXOD8lu^<))ovjd|P2>0g8(2nL!er8OYK&Lv<>_eQAx@-))Gja+!o}Dtm3rgs z7huZMCq2UEDM(MbY>k3?4P1ou1#L5&Sx`XnN@v~c_VI8qwW>8rZ$#RD-fVm28cwMj z#lBO}l9Z@1^NDQfDaVRBhowp2~&koaQsB>sxgI+fD<2I`3ggRw z4|^tOTW2Mj%bi)K1{{JKN4dv}v57>PB6V`2$P~2Cp(=`FH zM-EJtxAv94ej2#eu4d^PN*s98C!}*4X922l-i>P&t|KSGyXI&je>cF>)~=Bgy&d=z zy;-TD)cgJJjVL?rFJL44(f5Wo%0EYnY*Jd3tiS4ZOi7G&D=zb zj?eUiARJ$Ah3w!!(Og;Mm7Ze1YbaaugS(A)1B=sAFZz)6*HUt~o)C$Bs*Nx}Z+nt< z@~Qrbo87CWQTl$a>2}c^i{;epn}Sf!v>WYwNhYOjH0GGENo!e)mge_=ovSy14V!~< zTV_Gg`Q(E|QH6_evJx#%h3ln@yUrTiRoHmbgXEefXxB<0Yp_%1zSKGAR0!hXc0P1`2>D{^S}HqT9q6=P=(OZE73ywtvjGv5Mip#I z1a*)6*6VENlbSbraRem}3x}pK1pZtKLwH+9O*~{-gM&wY*xD95fMEtX*u1R2mQ%rw zL{PtkWT(dd$5O=I54JH_AcC?j+dML{Sgu_+nV=qL4lfCVi923i9~UkOz|_>G0dWdA zp+|wmdZf?grQg*mF2xiDjjlex$k4j1ICBrAe=)#Ud%($_iKMB$yY{PSNIUT!h%@IP z&UDBQVM03D?MPZOa%kXe`WHd2!cJvR(IegKyK#_JP5jW;V?%r^TkjO4Pe=^G`jc=9~a!> zDY*4fkHihdw#xf^aH{Zw^cs|h!$6H`1VQ(jl9qjD3K1a3vo1T$UB~E(s7TjL}d-PZ!79zg!~)&sSfE?PX=s`-Du-% zWG(9FhB9Tf>6-NUJ_e>{H`>D%##4WaXK%*S{ny%nqp9C7&Q~gKe2stwE#FWXAj!rjwEP=AOoM?;-@2QG#nTC83XotjLoKbVC1p2%SrUb|Y-R(y(b(uu za6^4t)-$>$?PK-bXjo*1)3}BVbP5Vr?2B%csUR=A+>Nr*U-iSFam`_krggA$LG0lh znzW|nToCI8x54}`tb}mW9+uyoYU9cw$85rlj8Ipu>R!&i=uR`!pK+Jn3|kylaup(D z0qLuN;0T9pdL4M2TObQqjs)ebum>g3yX@{BbdDyo;SiXjHLO07x@R|fqJ~WVwytBc z5aw`u=cHup=#eXYCuHn)byGAJop0OZ>`{ap0XvXL!;n-;q@3s`5GrBt2`1~uwCrL1 zlc<Y7yQWK)x= zAhQOOW3Y3i?V6O0c!jueeT6suoHc6I2@J?MzOc>gqhv~^pV_fws-Uf`Ur(x~D)wPd zx<@f8@QJDy#n6N2y#}i|$AF@AjGv+0F-6qojb{7N_2%cySEZAF=n{eF8ITV6ao@V9 z7@`hS%!&{d!T$PUdyV)$z_td?Ncaa~Y7+F7oT#Jq}hmEHWZLPP_@Tx>uZjiBe){4{!@LdI2Tphr_eR<*sM3PzLKut(a%twN5}c2&xi%U~dk8tDW}&Y+>; z1F={Z;UM~v9qCDltU7}t=m)kugOc;3-JBtbLA7v|t~dO@_3j>n# zAWzKxo=JmJ54#Ru5X`;5(HeUn=9#NSwWH=>PyuBJyOc@!G?VGGC|OaymyO7xJEIB? zg0HC8h_|FW4zj1SXmHPyzA$sgvRL%JQXyLFpWF;VC5AaCS zZsVL1TiC|Ky$XB9U5X%1bBXqw%%8WHIf}LJ_F&&|j7JTGa`!D^k;-4f2vog_Oi46X&V;Y`T^8EMsTI!-pE-( zerdXk?HWMS6S?#y*Q|^p)#u#+yM32Pv#rZ zWUa|7&i6~vPWF#HN;4kwsmIu#v)Y6-^{ow$!hs5y5r^b=b*VyH-HtdIx)jnjFfu`{Awf9uKAU<66(#m@MVb{*K*e4if1yeN{ZCHh{gi!p2aUs$I5rsf1RaYV zOrz<3RyLRhCT(>_nj^N7oTBrO6qB56!(bYOdhsL!Hv!{Qz{bA~rz@`lu!3=6W_^i} z2?r)tepGBW3%NsDEmcNnPX5Fa@@XM~w2)6@6%Pd1(R^%Z69VjNK0QF^*rXv?k@vAR zLvY)_%sw1KrHb_~c6$iWi=8ZWDCPH_1zmZ}`?$B9vxSJB!lg(mPKH>wkTmA9^qikn z52aj8tG9;Yu0FuU_7A0U{Y)RUA_SlG5@0vLZ*YrIIaI(-4HkZ1u(19GlvsEH0(80f zT#0B#z(s%sfZG90fLnaxLLpNJhV_44nR6}Rx~m+gTyy8z7jU~4D#v$hbpbY#PuWKW zD7>4WeOo|Du@TS$zb&1T8Gg8$d~&OR24b)G7@_m?z4HZ3*7Y7i4zEM_c{cJ+(nngo zW6U#vyTTGUtGts^v#0IneT(Ij7GKIuns0Ds=;KN*OUXX1C^+<(x$&aPaSz*mCk>o_ z5@cTLOH`w7N9st;gI4;l_~b&`)8HdUA-L6GoB2|l)CIF%%9a|)dsH1_4#3u&`e zNcBm-v*;0|Pk8zN`f!XD;zO^!ejV^z&O;<%2iy!x7Z=aMo*V&O*TP;KL6h#=3~|8- z5Hd2s5RP!puoXb-^RiC~sYZ}QM1|v7;LALhsPtQ*35Yh2m zi?MZFX7?0RcIHjYa16xTL2@5Y3^zArtDB)`xlzc%ip|zK2C;XGfxhLlW5x7V&nJ8$ z)(+<-{0fn&iFL`ivWN>WgB!)_#^Ctq$82M$JCMS!#!#O)E>=}uXI~(;@VTx;UeXwP z1sm7%W6@W3_R(1C)9W2ikbPtUi%IF=v=h(y;I>rGE{sL5M6y&fO(Hj&Z>D*%<8iUu z@|VV*Hsd&YnZ=Hyp^6v$tYjRO$F*Z#IC1oJO|NpcWgLy9EY?1bW=FzlkNAD4tL`qr z&VP#4mtgkJW3QLc9o@%yEOQU<90rN&7I<%ISysRJl5~ijE};htSGnGUgCtF6Q)t@C zM-wh3oQ2LQ&D_|U4vm=W#sV1s`3()E@I_4CFQ9MCCGb&DX>j_!QA*Pa_IPGEvxQaj z2h}W2;k(@>snBPvX=tE z>=JE7SegSdLQk^$Ctzr>R3=cdZm4U_&Oa+R!^^&(K!1x3R)X(rya+cNJrM`mRJM2` zu!0}i>WMgvrm`<4V#|D+-I_=z^0WMqdcEU zXzOo#;)!(h2Vb@Y!4*;;oRGZlU?Lw@ySXVa=yp42Y>sD$VRsBo{x_)v;`tjI~$S zXdLlAX1t5afz;IBMI+-@czGSHwz7*_5iZ>v&FnvSQL?;$O=VZ^qC{EL>zfZ)#5DRL zVZPr|>5-QB2Q)y&Su_`KUUQV)m`01JmCe4JM#mh@T-z~NNSZJRgscc3YrdOigwcy2 zFTBrUrjv4Y?yY z)^rc8i`?T@g8b~4zIGmESMI^_zM3V@z(jbEjh#XL6pP(#$qc%;56>%sPaL6nXI?3+ zfFx$b6)HnQS z-rVs=MX&TEJ24Z;-gXyr&jdm7sKSEQeZz9@rEEpLi%q?kN;F3Y#l7qWQKac!niNyz zj#*~{CK0>Qi<=?y-b=j|)n1lz9}Oy2cmzGSI_r1i77&qXxhgj@SS$&=3J%-{3XIP; z2hx;!4fdC7?q-`Bcu*!rJPgmzv-S6Z5Et&{o6qN;e0U$s+9sPk0o>Mt6QbO0+{q(z za_7}g{`EJCrr6J19r8PlP_Y6_lcQ+{^k_(2nRMfr6bVmkj31*a|OHU|dJKSi~$ks~80Q zc@~*+CIu`D1l)C(hj!RMZZEjI@O`K2_VPTNIh$6hIYp?Pot{m}_wV(^>#2HG^*G2V zD=lLeW4kOQM=Y$2rI@j!Ikx&#)%;RI4)q`JKnM)I^Bm-4w4k(eIyT%_phdx1{lOGC zF6YqWI5qz>hmH_>buM<#73`zAAPGIlF3csyQIe-0qB-;}YkvqI%b9u}j{5igtY99E zP(15rkIkdOz%xIbhokH$bIqf9>Gy*`=3E(QhbbO;XbUi$zg|$O-jSJl!fS46B3o$% z(`1+*MwhXwov0(shwF}JPEA%%im`Iu-+(!#*2+1;t8OVvj>Y3~T6H~QYG)i36O%d? zT&+S()sR$S*+uD=TU*k{-OzbtR%I2<*-}+F=T37v#N)B+taHPP6|WM{qhPmYqU!Z& z&>}mU2sU4Q@==}%EX=#5>pt$k1uY&`Nj=b*yDPDwma^rQG;`3q&@Dy=zz>64=3lb; zU%9;4l}lI^^;X~SK3#Q`|v#9#|ZZ1LP}I~*@;!`^@TXolh_vvF#rJ{b1tOZ(3hNt>G2pojb6}G z$ptB4ANZdCe3-I~kNdPT;|((AnB3Rhq9WuN4V;qa59ki?Etao+&hEV+{nO1z(GfIGJD!wk*yc;A#vGA^RxA!R&!*8i1*` zwi*-s9cHTry&5gLS`88kuJ?;^`fOnR7gKWLyg;2zth_Cq_X^N+BgbXXi3P_zc0b~% zf8N8dQ%^1idBwusT1@rDoBcY>eaI_dwJ2Z+EZ8hc3rNck@wmVy1X%2o6>L?w%k1^? zb;1>FFG#~%MvPVbqE=axNKeW zAf(e)6aY~Q-ebryj2&1)i9L9EUHbs{4>ooOd?W8*7nk7HxQHb#rGAMsVK1knZBEMB z9j`h6E;JUkpXAD~}*`^rt zdYF~xrjSH-V=3volSk2C+p4qkDn5&CRF6*lisd|luC=hSkKn5R1AF!npkbTXzaGJ% zzl+hMIO8U>#g9@>%ubq`1RD}}@UHLeW1Al(ldR`6Y!AEoD7J;%0Ly)hlDfYJO-s>Q zV6j+hEWliGTndg$Z02LQl7}ynqZ=r6&EsUl-DY?V_MVIE(HhE3eATzN zy>kbpnSij2@xruK^-kVYW~-qOsgm8l3^cNGwt5-rcPHDoj8YTgxRo1GZ4b!C6Otk7 z@&miHj7n?2@}9g9ulxK$H(g_cy)LufX#PwVDuz2V7&RdCt_=0Y_+)t_SnrblCNJUG z@vV!FJLkmJ?Vy|0g{F(7gS*4@SVOoqs zL8vwDGJ(|q3t2D`c|n>Bs?#Gd9K$C&d?!M#Q`LAux*ObVKFu&S9a#r6`wv+vBI%Nk z%Wl>c3gQLnTUR9b7TRi+V+(A-hRav(HxSYS@l`oq3pn6O@}lJO2Vg)(fIS<3doEV> zr1^qy;0P~AW$us?--E9uN_)pd*7e0?;l*{pjBF$8znps2e&$p|d9KE$HD8j#o&77h zGUnr+M{ONexEO%~y%I}dlPAp1js3vXk7FXtTB;yG#g8JvF$P3pN4*uh$cZXJ_|$sT zs_WU@DU=Zm*aVk$P`y`;dQ1mzTxoB#emU*Fls9+S*K90uo>a51mQ$>DvdqV`Z(#pj zPCXNOcE(+eok=RC?On^~@OWn252<(-yMp@Z?EbRrv4XX3V1tm+Aw>q*_!V^LzQYJ?jplQO_=1y7a+?bA!@gyhgCbc!+I$l6ns?_%XRItrEsqqin&988kyK zNGX2%n&zUeYHUo4#=CewJNqP!=wp{R+Rt}z{aH;e9sjecv50k+jeZI{+K)c_8j#li zXvgq)B|iR}EqaQ&hw~hCyE~+7Z0%E&IO_^-3Asw0e1z(D7eKzhLsEG-n+Rl9nN=h> zlCcT$s;A&&=#XyhZIrWs?;?!pH!eOAarZiy%mU3yy;=YY(xoS{iS7 z9qMq$; zW+VHxjuNBydDBZSN+ZDQ?7;n%>M0>K3cLOqR6)yuuZYw{RsnjxP#ynhP$(6O;kgH-S)TlO?=U>~zLp9V_O z$c{Ws+4(PdqFOqngPsVi?5$YYaah^>%^}Z4X@a}@fC|o1c^j&iESf!c=~9_W-pEo{ zQu^fCo?fBp``6i4cJqZLd=gLdbWLj0_2hUyg(rA;yo6JY)-lOloKe$teS8?cjr6b= zSAtQ3rMqJ#WoVLM&R8D#m9)qZ3n>q7w+sHx(0hXq@vWi;eap9s*IP*5oxlu(YT+#|Q^BI~_JFc{0 zzG9sKmP@RlG4yOxY&0#a3+r*>3ujc5c7Y3KJ4Tl%Ue_66^~{xG=WnYQ^{@{wJ$54! zvKS&9fF<^ggbNMT7Rb~ZT~d9Z&(00b1%eXJd?V%fLM2z=qii0h21c)|16SK6sn}I( zv#Yxe{{G>GVHdSwM%2#XF1oG~RuvB}HeJt-C;JGy+Md?*`3-)0)VZE&x2P2-c=w-V z_diSdwfO-{Sk#FVVC)6Wm=i8z~(gQ(`G#5Y!B?fXn zQEg$RNua{I_o&C~tZ_CI0GiwT?%YwslvXh=7nj8Qxpwv6uH{?s);bg?$Yg6Zc%LPkaQm1{`;NXJjhRW zECA#e@&VVRFZa(uUYtsO_=XbYg$cqOQkhr-q!3bf%3He1!S^ubgkq;rr-Y%!BDoqH z**9x&+UG$0AO(CZzSRxi8-)F^`%gs8&ktv3E8T!65q^ywX6&ueqe z(U;w62yU8KCI(5p0gn1`v>)`ove=v%6@lMQ^1} zC=efSoGvh<--06NSC3e8= z@6t<@5bf5NbTca9EWA&N0dSK$wPXZfle-r@*DD=wx!IoAX>izPH}vw{?E34}cZ!e; z?RF z1kPJvQaU#7ZAKlZv4wBoYI%#Te*<%|oo&Zc>|75-lEp?#jNM{AFMZ2?dxMI5>ke`K zz)2w#UFj%+i*~dVhB)|n${u+W(vjSrKmludlg8Dq7$Ast6wqyQ_lfV{+Vyyuqi)7; z&WY>dA?U1heCl#ozpxt6!I`c`pb(9?7@2xoEK0`-j7dOh2w1>*y4Y4=C4=kKF_23S z-6(tM(2YeeU2n&UiVol%%sW8wqgA=@9pLizcS@^b5Ih(Cch~+F}xYjuM+XED8}dyavwd zTl5f^8NRnD4`LNuf`s=S-z(7+XCpL!!NgN39lto)#D7rl@$dK==bxV6P^9|KblaS# zYxGO6hu%aTf7La%{7y`Kj{XewhncM@>ehuRtDIxY`L)bUtu2yb~9+Dq;e#8n>N)Hjy~H875d2jzC~x?}a;r{+EBj z&N2kuX;C<$18@c6f7Lan9IC0BaJyJp0#2pM!Q>R@Ln&_jvdTFIi^5T;aNIn|IV=$H z$x=d29mBu7>Um8t-JY-U0FC8TRfwl%HDZjA>Cg?(|n{ zRIOz<>lZ6g-wF>OP)B_$yM-uGMIMD?y#H*a!hxIBkaua2;?#dx)w?t*jvpfm_z5me zDdeu-g>9_mT~KNcu~Y8?;a$k0-=pmK^RP+U*rK*;8mu@B6pnBoGrvc(#NEE!F=NJF z`gtE*h^m^^jVSTK^FTl95l`Vb>SagYqo)Q9-ml$#WUa7%<=Us$6x~*mR&1Bn`n3n@ z*HBs#!WsL)7A#bmpIsC7(%6?2jv1gyY{Dh5kDI-*iTdV-yZgX5%%3?Z;&={|kb`zN zEkM36DPF2y6EAj1?>m`e6Fq0SvgasF7IW%Lo%xyOe4smbc?Or&o9B!cvi2-ru^``k za4ErUsKQ`u%W5bz4`@6u{T*%}hDPk^6k?UI8$_|`vc#)pX%Y#@kq9 z+{ezmPZNi)+!KwHS#C@;O46Z z#|?KFN8_H=vC0oC6tPjLJEVc>QOspq7x{f##M{(fNXSKB(I$u1J2 zTVGgWu$EXhH)!km1+yPi%o)TLMjf~tzv=i1!p%$;wwVm`o`ZegIl?vRIrj%kxwXSm z^XJYnbtrh;52(aV(Ac)2dyKo36DZ@Cr9aIv?!O=@_V9N>Te8vEv(9l}v9RA4Eo`o_ zFXgxy#BE?RUT8hMT!)Sq923}En<+8;BiVBgC?4zpe|#H{JZ?Ys>t^buNcA%JX3EM| z@2x(-3&2Q^TLaQ@)H7;`I#+_78IUge7MM?`mLPPFjoU(xDpL2cgIj27bS9+F0yxij z!V;FcmF`P8w3i!du%dc*`j8s5zisS!$fMwDwtXwDPx!@qxt+`>F2ukk(?6GR<7V5~ zln-fWkAfEkF%}w&g zZ$mTg@v`yT$Q-xRwTYYJ97m3lJqG0XDQntBLsNK4-R`)F5m18E)o7rwsT1vswb;!> zH@mrwjJZ5UuydhNs@I|Z8gH7J>!q|y<9vNVAm=zvjJ{nm9bo0#DWcs}4*$@{)> z)^wNv7Z7*PIR2&q7)j8Z(x18Nz9YygcUek*`@6iU7OpcuSv{iley+!nd1&^ znIkR2n6nuETGcs=TD9;q9FudoO?~>s5?JPn7?raQGc}>rl5?hQeT^dLw>DFXvef}s zk4lkSy%+2x8kaod3~v-13j!W{Qw_Y6x2kgrV47ZPJ6!`eGDz`Q>jw?oXZM3Hb**r@ zbzoiNvdz`@W!A-8Qn}gcfK=kyT%)xuZ4&H{G(C!8-0ocMj9ItZ8H-=iI_|t>^QzU( z=*G=8B{suy!SHokGva5U_;k^*^ss%kGpg=@eHTO)1V?|DTG-o~v%He8ZKq**F61G& zec%RLH~W3|+9&K;_HIaItXc>1F({+@3ri6a=OFqL=bQG5RQRm>+bnR!Qpl1DK}R=F zY+ad&G`z#rcG#UaT=_W*&xVHPr=JcLd)=uPRHWTZO#D1}G}|hrs!S)|S0=kR9(D2l8r` zL)A7Q{RCMqh`6#ZKB7K_|MXvxF1S&`x=mo`=ed=JOnd@NfKd zyDvivj9qM|H2wE3Wg1MTbyf)HBmus=)!5#yN)GUXusz^{yoU9+(S!#fh%46Et)*n2 zSE?Jv4V=A<3Iqz(DK`AtCjeNWH?T0M}CfMoD~+#c7rsI`0F9c_fg z2;T%Q{fg<0=cFrsLzRBTE3mBbIs4H@eIEFmtLw!_oeQT3kG4P7k zEHx<<-;f>d06u)X0K${3Q^o+BQc&PnM9&hw7PD9n!OEyuikN(ZbwIBoy8zVai4J z35;hmVjeGp8aYi-E+dZDge zS^#}`19kyZTmfdqyWWX5QBFGsQrtW?FsyYQ?KxHJohB-1QEa8_g>g{Rg69a80GdY? zgu`#GTf)EcFIPb#Q;iVDv>KKfY=)|Tr|I-(jAx;!)2JX8`gtJnoU&#JoF3(aF z4ueR>E4Xp7s&g>D{mxE*3{fAPOYVuRFcdu>+#*z+cP;(@(7x3-^k$=Ql#-jI7 za@@4QH%J=$$Ll$4=pK;nS%5vThk9a2mhFKU!b%T&XAfBwlRYe|g^ck(x=c3HTBB{3 zD?|4bdal2RO>UtKeM%t7cG4;8w2#fO1430ZL*Nu1Y(MKb1-F^K(n2{2%X|qU!>x@+ zwWci1^Gnt2KP|w-?_so;o}>&`yBD%mQH<@S)RZV+B+pEzt>RX!wX=AC{odXm#V&BO z*1fp14`o;O09RGY)h5@N4nX85Wn6OqA;*SN=!r3};h{M10c#2Z(Tt&$x=_}~G@OONF zqtcSxS$`H5kV?VM>CrlSdD`-(ng~9}Tq@DBv=OH#?~m?m(SE8-;HiPvmaT2R1btS) zaBr)NUD{7Wr}^Q?qFtKev{wn(OmxQ8zxy%w1o8A4`|<)?;}c{U2tmL8t!hJFTVMNc zC6(qGM!z)M=a)1dp5m911;77PGQ)UY`prw`Qz$>##U49AhT3L0*}^vdl6^S=LGVl8 z`fj&3E*G){!$WOhn=eT}dBG$H^m>KPd(~FN(zNpD?@_($ZH>#zZBy;SYdH+K(xl%TX8zM7Uz3wD;|nEBI0pRi%`6O`UJmHTt}&TBBAua&g^#^nwB zM%lNP%rRb(W^;cXspqBTUf6W6*^Y|tavEwXmNyiIwKbK7r9F^mNIfgf_SD%d%h%a> zrITCVL~|cNbAN`2k*SfNBoQz(@cS8VgzmH_-2RH3^Qgdj84iN>WCjS?M+RMt-WV+vrpnH-eUh)Vf({e>i9ahsad>VB=ZHu?`To!9GtwS`7N4 z;CR4WAimc=@0}`qI~izvZV$g^paBQ5xz*mh`y>8l^v(bLGfdwIshMn#!?p)j`vZ~% z2+DOCFFGsj4;YsBGT?ChrKiDk{I?FlF*Esoey`(s$YzTq}D;eT9s!C;4pavT$x>AZy%<_)Yt5<*lnj1&v;IMXU{#I zfBHxJ2K%S>u9K(jFvKor{{pJwlI z`XBa3>|fgF+i#(@NBm-ypcihfsy;8h#Vs{gsX|X1;0==JbB7se3Hu)9H0W8`rTA}T^Yb!|FR{eWC@1wREP;SD#NF4d*^a`bGl+*3x>9T8=yL;F(QNuX5C-nKr*3C7z zs=^+FC@5Qn&ZTI9!Y*{)MN5tFBrOxij=OlKJchkJSeaR^=%p=RBc}$rvPa|?%i!zk ztZUm@rQ9Q874MJPh?DE&h-*JlU^73b#JCh^4~$}>osY*W_}q=ve@@+}zv8Yv+x1Eb z^q!B2X6pkOm1o>b&IZfvfpVLntv(Zjz0kLK;(wpB11nYdp=#y#!dTq|x#`jCh0X=nsrID9cZxUJya9eCyz)|ulA9BOB=-D`0Sd=L0b z4$JzI{$|O=B~IDOj|#y-I4TGiuk;*cTZW#N2Bc&dSik|Xxa)iX13+d5@a><*w=Q0f zFFb7AwWjy47ZhU^)rHl?b*jaMsRpxgzfZb;ke&IGGUz1Jdr>N^cW7$I?3I1W{>U=bR#9a#Q#+T~7K*O^*J%-sM%; zfG)Gj7V`sA23vWQ^dluFq`a%nOWBw?+EO0+gH*2PPimJ~#gWAG(s7weF*XdxXNiC> zKkeDZP9LS=v3&x?Kg4ezEN$7VgB^*ctX>hYY?!6qG}fr_<0_S7-3ZeX0?81)Gs z9tblR)Oe(!?AS3HSH8l>@BBeWsmR#MyL|*FjFpau$W-{6`nu|I{F%R3lq#&_Ep;Hn z1mFE{_Rdl0HnJJtQlsjublJtc-;!8613VpWCECBcn>lhk*A>=$y|zOmoJoOuGx4nS zFBh%b?hLoAbw--f&8mrgK^d51wZc`r|G=F8Puh1vX}7!9$|)n{l(ep|d5$#_w+EiK zI+&J4wvxW~BpLvf%i1ORjxXG-3=*EL;T8E6w z=U9u(5ps4=+g!OKRGFZ`3hplYF2AXF-Hz2o+T$WFENkH_ijR~4Hpwe3mX{1;EYHI7 z9*7Z9(QrPcHaEdIIfmECs#_^(@F$*%m$Zn&5geOGYvWNf@#Dnp!)qIgv?qC{_sW@K zp&(OB3)|lcZMiE_lau|o73vS0{JVzzP?VR>D%&fuPqQ%wNYt@cD$xS6HDl;IZaSnl%3NAt)))nJj`u5ST|{qJrplVP>LP! z9lfjoJMGi&z}^4G%g%pCLuzea(JI-?HDUGGrdsm!OI=7MjT(_|HH+AToAPVpVhbbYs8 zfo~7)X9rJ^m@wHJw1J^&3o-x$(rVUug1U39HSG`7yLegvY>XCeGJ~@o1jlr+Ie2Y- zQX(*P-g9xS(Ivus-r^BcB9S$WqB{t@KHjolJ><}^${*;ip1*mt(2Et#Nx11B1m!|* zGAvkZ+Q)wQfkg3BPdL6Cw}H`CamdUTO6{*5gNXa+8PM`6G1DUi2^vAVC52 zN6MdbKb(gB$#mj8AkGjo?tZpe$WXqj-m2Q7+^l*PVif*gFDOZX#VME|OYh#4SfYLd zvef<_lORPnt4}LAzH^cx94-ly;ad&{eBo}(Xo^Lv2JU0MPf}XK{5{+Wtss<+nK+h@ z&h}HpR-U9uiYsn*91&7@!Cl<1x*dv$&vvXyIl3bm=hB9KOm~WsR30FJEcX4m`X>p;#J6&TZ31t@xX)VJ1IXvvf_l*{nA*vMu3~}+O&{OV4s|u1M zWj8l2<`eBPxA=qrC*N?sWuc9R>L~PP;Y|yX1<+wBBnv1;(4etc&cHb@xR4+ucAlbM zBWC&<7ie1==VQHOkbTn}%79KXbnbYM%Ii&D8zw#%hXflW_yS4dG?o6N8$z9P zcOt|Q)F`Ly=Dx+z$l({)KWu7Gm}4RY^`rb7ex@Xa$-{d7Ono2nNIP5^VE(+lm=DV~ zS8v-`JT)y=*fTK&i{tprZ*on}gp)bL^448=c-fL`8ZRGK8>x=QOr>nRuNVBb*&T~!ivW8zMt=21T zb~P<1wJG{5+BmC22Wbqxgv=hby`m}^E@t@h+m4IOs6Uu$0V&oC`!F)&A|Qo((?ItC zsUGYS(gq~*!X|<*fJF#a7j$3=M8z@dz-J7F$F2)V*F35%R&4SAnF^0Mytq%WdRs6} zzK08vBc33;GNBD_Ol32!s@LHf0VMDF7ht;Uu{d9ST3?1eWyko;A)^1n13$;Uwx`oEC0{UNa7H}D%j z4lvVi*g)P3usOfcfRYyie^$zLeL=;@Mo8~LI&_eyYq%Cy6yRM=pnwk-$m_x3dcxf} ze~+ycLvzl`&A70iegj8f6{M-ud>B@$Hfn9DwlF(4wU{jr$8-;62Bf9X^dE)+DRcj2 zFzWs?71<26;O0(a7ihElLoA zarD5g{@uR}$6M`uC_qDSgtOP|q)&JIhqQi~iSq-QZHo z^Yt-wN3e_TcY_}xPr7%&liL~UqQ5)W$z7yI7ga$v!5ao54rh$TouTd;uQVJFBU%45 zl%Cw*|JRw|tw=_L($N=9tnv)JutJgJg)=lG;tDjc8s}h@x!Bb+xY8f=1t;TcQ_7Iw z6CVh3uCA%`#+31Rx83)fGq=90XZTwGCu9PS+91|2TeRw0u(sWe7O}D%HPvBl-wpEl zQKwMd#WD{_A3Og#ttLa3lJ9Y+r`*x#u7%eW7+rQgAkVR}C4(IbMFG1Fg6b{s z?Cxx|3XZY6UED9}L(sy`5cotagFSQD&q8KKOy4zae{IRr@=O%*EzP~6U2TWri@wnc zLI_)Y7D`i*KDOa3jfv~(?qXicd{AhsCRb}I4O<*Y>XQ z$k*NNk<|(3sde?HqgG(tKwtjBq{g_kO1Gx{uzMUj!&20sbh2Lw-27 zw^!xJl}$JW`77W$j(T49i@wuUeJjJ<K1 zZcug#FMM3Ti9+T8vpAnOZ#Cth0=M1ptj)gapltnAp8>g-`8ul7Dz$E*v#ayML!I{x zi@gBTV8i^ID#zN!VU(X?120f^;txJqV&d8V*_jYgxX(L7pZ~gJfge8t{!cMktF-EnFhr_1J7d z{Tmx~k^1Jir8IXuva7S9NUMT{4bc4*kiLdRL~IL6Z7V158n6(KvGo_Jd&(oO8@zKX z7tUQ06h@Xa%{wdzsfXF87ikm;pG03GjWS+Xg-)mBp4kRLAg>^-FnyAB6~?NHo;4|i zIF%qg2bciJpL>O#Q$vuV1Ys54D*^f6?9lTHz!ywxuY-E0@$@7H<0%07A7tL;KQ-Vw z6LUK#tM(5JW8R6hyH^6up&yOQp;iX!!0t$$c2hpZKNET z^}S7Lvv}cQVl2)vj4Q$#Q4nJBo&RY?Q6xbAJ{)01C>$a3N(J9XiW*H~sPHIJp@0mY z96wr2PDZN{X8*iR18R95@ra8S%ij~kn3ymj*vM|8S{)vG-yL~qLhpMZtPO<|QGQ$~ zZ$1y>Lv>6RQ&Pf1ae9jJ@e!eLFQknOg;V%^O9&-M6-gP1!lJhbLT^#2!rTP4heCT+bVPaZZ z9KyV(`9kRxssvvwDQu>bVrzLczE%Evj^w5$KXPl@_(Dn{RD#0x5BZryW zNq5S#gS@?aCx^a!Fzvd3AP9cId`xi-1Uq+9k+#4l9n0gp z@Iwrt=DhD}&FZ4nl<{1Y?6RE-?sW$=kh_cWro5@I`n^2o4NFb$Sp| zh78@<&v;L{v6pe^QT2~%;Vn_AyL|}AEA|TJlONyLhMsTn3Zuv7^7pD_aUte|AIHc_ zKo8>Aj^-^;FPFQ_jq^y(SleB^0}0(Yhk^wrhlVIYoXuMv)kD0GXB;gE&xd*<4$q#* zG;xvKBZ2_>I`TEj73USZ#NPvs#TLrpTS3@cScm|RAcZpW0UF?dsRX}q>>Cf=r*4I+ za@i;Sz4W%a_Q*%jeZUrvHVLi^f?z}_Dk>PxLzr*u{QV$=71%a;_zr{?f?p_9Tme}WFkj+c zVo9h6 zi7*vvNjO$S@;sPSj6(6@zyy-VKXoDreC)Ra@^OC+-!bOG6+k}RlS)b8LwyX85A*6t zXf@!Y<4NGdn}>Y((Avx-@L|0&4x2b2>=((yxut}J;%RshjSToO9zo6c5N<(*`0%YC zLjoVVxnoJ-!xoN=N&yS;-h|Fyc$>FS5OSh<%LJkRF%o7B2lm4BK4{@oBRCYV)d}6Y z_skhCV-w*6;Up4CpEP2f09N2R8gLC@4B#fb*8$E1=I;Y0?eCm>~_y@0PHK1XZrMgbh9Q3LW*@I-$;s!9Qt^aOrb@rv?;Hm@%UDS%J* z#mMqgz9p9g5%3Bk=mEb#gjB#uC@>8$8jzocPvSd23Af`p9dIpL%#YIi9FmXGD}daK zRVwl;1zZNm?Zj6i-UPrLeCN}%Z4hsmLYSEX*H?T&9YBp|VE5u9HPNIH9>K4U{Til7 zOy6YVaaF=tK%RCa)bn|wLO`DMh>iGACfDA?mWMSfq`*GFVEm>7qgA3md7@)$gNb~A zJdy1=o|z!5Z{Y6*VfC}TpRtzkj2%!|xP}ioRB@l=Lk?uQo-j2ai}@5EdK_je`OpLB zsN+Kq9m*#$lpIm%zJiavAQV2s$6gS=S;fa*5MEo&+aL%_m-C^+cR*~B!W9&VZB__J zL3x0_C-~gJu7d9xz!p67CX7V|BLMZNILE&hq8x1D!al(MfWI~*2fOG0(Nej4;wPd@ zf|xR*<8RJrwnVE~Qmrji$QpAgXm{&4L70K(1?akrM+M=jNvKIp&#gq(o&nhRt5g+M zYQqx;$Hkkv{cck9+^XvNnyTj+)xD>6IjVcls_tEzl9Q1Wb?>XHoQ&kLFa%KjqT+92 T&e>k}!3}vmEn3CETH*fy$6JBj delta 49432 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 diff --git a/bundles/typical/ING9188xx/symdefs.g b/bundles/typical/ING9188xx/symdefs.g index be443af76..5fd27d4c8 100644 --- a/bundles/typical/ING9188xx/symdefs.g +++ b/bundles/typical/ING9188xx/symdefs.g @@ -1,247 +1,247 @@ -att_dispatch_client_can_send_now = 0x00005985; -att_dispatch_client_request_can_send_now_event = 0x0000598d; -att_dispatch_register_client = 0x000059a5; -att_dispatch_register_server = 0x000059b9; -att_dispatch_server_can_send_now = 0x000059cd; -att_dispatch_server_request_can_send_now_event = 0x000059d5; -att_emit_general_event = 0x00005aa5; -att_server_can_send_packet_now = 0x00006235; -att_server_get_mtu = 0x00006239; -att_server_indicate = 0x000062ad; -att_server_init = 0x00006331; -att_server_notify = 0x0000636d; -att_server_register_packet_handler = 0x00006455; -att_server_request_can_send_now_event = 0x00006461; -att_set_db = 0x0000647d; -att_set_read_callback = 0x00006491; -att_set_write_callback = 0x0000649d; -bd_addr_cmp = 0x000065e1; -bd_addr_copy = 0x000065e7; -bd_addr_to_str = 0x000065f1; -big_endian_read_16 = 0x00006629; -big_endian_read_32 = 0x00006631; -big_endian_store_16 = 0x00006645; -big_endian_store_32 = 0x00006651; -btstack_push_user_msg = 0x000069b5; -char_for_nibble = 0x00006c0d; -eTaskConfirmSleepModeStatus = 0x00006e99; -gap_add_dev_to_periodic_list = 0x000077a5; -gap_add_whitelist = 0x000077bd; -gap_aes_encrypt = 0x000077d1; -gap_clear_white_lists = 0x000077f9; -gap_clr_adv_set = 0x00007809; -gap_clr_periodic_adv_list = 0x00007819; -gap_create_connection_cancel = 0x00007875; -gap_disconnect = 0x00007885; -gap_disconnect_all = 0x000078b1; -gap_ext_create_connection = 0x00007959; -gap_get_connection_parameter_range = 0x00007a1d; -gap_le_read_channel_map = 0x00007a5d; -gap_periodic_adv_create_sync = 0x00007b6d; -gap_periodic_adv_create_sync_cancel = 0x00007b91; -gap_periodic_adv_term_sync = 0x00007ba1; -gap_read_periodic_adv_list_size = 0x00007c35; -gap_read_phy = 0x00007c45; -gap_read_remote_info = 0x00007c59; -gap_read_remote_used_features = 0x00007c6d; -gap_read_rssi = 0x00007c81; -gap_remove_whitelist = 0x00007c95; -gap_rmv_adv_set = 0x00007d21; -gap_rmv_dev_from_periodic_list = 0x00007d35; -gap_set_adv_set_random_addr = 0x00007d75; -gap_set_connection_parameter_range = 0x00007dc1; -gap_set_def_phy = 0x00007dd9; -gap_set_ext_adv_data = 0x00007df1; -gap_set_ext_adv_enable = 0x00007e09; -gap_set_ext_adv_para = 0x00007e85; -gap_set_ext_scan_enable = 0x00007f65; -gap_set_ext_scan_para = 0x00007f7d; -gap_set_ext_scan_response_data = 0x00008025; -gap_set_host_channel_classification = 0x0000803d; -gap_set_periodic_adv_data = 0x00008051; -gap_set_periodic_adv_enable = 0x000080c5; -gap_set_periodic_adv_para = 0x000080d9; -gap_set_phy = 0x000080f1; -gap_set_random_device_address = 0x0000810d; -gap_start_ccm = 0x00008171; -gap_update_connection_parameters = 0x000081b9; -gatt_client_cancel_write = 0x00008675; -gatt_client_discover_characteristic_descriptors = 0x0000869b; -gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x000086dd; -gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x0000872d; -gatt_client_discover_characteristics_for_service = 0x0000877d; -gatt_client_discover_primary_services = 0x000087b3; -gatt_client_discover_primary_services_by_uuid128 = 0x000087e5; -gatt_client_discover_primary_services_by_uuid16 = 0x00008829; -gatt_client_execute_write = 0x00008865; -gatt_client_find_included_services_for_service = 0x0000888b; -gatt_client_get_mtu = 0x000088b9; -gatt_client_is_ready = 0x00008961; -gatt_client_listen_for_characteristic_value_updates = 0x00008977; -gatt_client_prepare_write = 0x0000899b; -gatt_client_pts_suppress_mtu_exchange = 0x000089d9; -gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x000089e5; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x00008a0f; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00008a15; -gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00008a43; -gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00008a49; -gatt_client_read_multiple_characteristic_values = 0x00008a77; -gatt_client_read_value_of_characteristic_using_value_handle = 0x00008aa7; -gatt_client_read_value_of_characteristics_by_uuid128 = 0x00008ad5; -gatt_client_read_value_of_characteristics_by_uuid16 = 0x00008b21; -gatt_client_register_handler = 0x00008b6d; -gatt_client_reliable_write_long_value_of_characteristic = 0x00008b79; -gatt_client_signed_write_without_response = 0x00008fa5; -gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x00009069; -gatt_client_write_client_characteristic_configuration = 0x000090a3; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x000090f5; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00009105; -gatt_client_write_long_value_of_characteristic = 0x00009141; -gatt_client_write_long_value_of_characteristic_with_offset = 0x00009151; -gatt_client_write_value_of_characteristic = 0x0000918d; -gatt_client_write_value_of_characteristic_without_response = 0x000091c3; -hci_add_event_handler = 0x0000b429; -hci_power_control = 0x0000bb71; -hci_register_acl_packet_handler = 0x0000bd25; -kv_get = 0x0000c3a5; -kv_init = 0x0000c3bd; -kv_put = 0x0000c40d; -kv_remove = 0x0000c485; -kv_value_modified = 0x0000c4f5; -kv_visit = 0x0000c4f9; -l2cap_can_send_fixed_channel_packet_now = 0x0000c5b9; -l2cap_can_send_packet_now = 0x0000c5bd; -l2cap_create_channel = 0x0000c76d; -l2cap_disconnect = 0x0000c8a5; -l2cap_get_remote_mtu_for_local_cid = 0x0000cb49; -l2cap_init = 0x0000cfb9; -l2cap_le_send_flow_control_credit = 0x0000d001; -l2cap_max_le_mtu = 0x0000d261; -l2cap_max_mtu = 0x0000d265; -l2cap_next_local_cid = 0x0000d269; -l2cap_next_sig_id = 0x0000d279; -l2cap_register_fixed_channel = 0x0000d311; -l2cap_register_packet_handler = 0x0000d32d; -l2cap_register_service = 0x0000d339; -l2cap_request_can_send_fix_channel_now_event = 0x0000d421; -l2cap_request_can_send_now_event = 0x0000d445; -l2cap_request_connection_parameter_update = 0x0000d45f; -l2cap_require_security_level_2_for_outgoing_sdp = 0x0000d491; -l2cap_send = 0x0000d855; -l2cap_send_connectionless = 0x0000d8cd; -l2cap_send_connectionless3 = 0x0000d95d; -l2cap_send_echo_request = 0x0000d9f5; -l2cap_send_signaling_le = 0x0000da59; -l2cap_unregister_service = 0x0000dab1; -ll_hint_on_ce_len = 0x0000dc95; -ll_set_adv_coded_scheme = 0x0000df71; -ll_set_initiating_coded_scheme = 0x0000dfa1; -nibble_for_char = 0x0001c861; -platform_config = 0x0001c905; -platform_get_heap_status = 0x0001c941; -platform_get_version = 0x0001c959; -platform_printf = 0x0001c961; -platform_raise_assertion = 0x0001c975; -platform_reset = 0x0001c989; -platform_set_evt_callback = 0x0001c9bd; -platform_set_irq_callback = 0x0001c9d1; -platform_set_rf_clk_source = 0x0001ca09; -platform_set_rf_init_data = 0x0001ca15; -platform_set_rf_power_mapping = 0x0001ca21; -platform_shutdown = 0x0001ca2d; -platform_switch_app = 0x0001ca31; -printf_hexdump = 0x0001d721; -pvPortMalloc = 0x0001e21d; -pvTaskIncrementMutexHeldCount = 0x0001e305; -pvTimerGetTimerID = 0x0001e31d; -pxPortInitialiseStack = 0x0001e349; -reverse_128 = 0x0001e4f1; -reverse_24 = 0x0001e4f7; -reverse_48 = 0x0001e4fd; -reverse_56 = 0x0001e503; -reverse_64 = 0x0001e509; -reverse_bd_addr = 0x0001e50f; -reverse_bytes = 0x0001e515; -sm_add_event_handler = 0x0001e675; -sm_address_resolution_lookup = 0x0001e7a9; -sm_authenticated = 0x0001e883; -sm_authorization_decline = 0x0001e899; -sm_authorization_grant = 0x0001e8b9; -sm_authorization_state = 0x0001e8d9; -sm_bonding_decline = 0x0001e8f5; -sm_config = 0x0001eccd; -sm_encryption_key_size = 0x0001edd9; -sm_just_works_confirm = 0x0001f559; -sm_le_device_key = 0x0001f7a9; -sm_passkey_input = 0x0001f841; -sm_private_random_address_generation_get = 0x0001fbcd; -sm_private_random_address_generation_get_mode = 0x0001fbd5; -sm_private_random_address_generation_set_mode = 0x0001fbe1; -sm_private_random_address_generation_set_update_period = 0x0001fc09; -sm_register_oob_data_callback = 0x0001fc41; -sm_request_pairing = 0x0001fc4d; -sm_send_security_request = 0x0002067f; -sm_set_accepted_stk_generation_methods = 0x000206a5; -sm_set_authentication_requirements = 0x000206b1; -sm_set_encryption_key_size_range = 0x000206bd; -sscanf_bd_addr = 0x000209b1; -sysSetPublicDeviceAddr = 0x00020ced; -uuid128_to_str = 0x000211d1; -uuid_add_bluetooth_prefix = 0x00021229; -uuid_has_bluetooth_prefix = 0x00021249; -uxQueueMessagesWaiting = 0x0002128d; -uxQueueMessagesWaitingFromISR = 0x000212b5; -uxQueueSpacesAvailable = 0x000212d1; -vPortFree = 0x00021401; -vQueueDelete = 0x000215d1; -vQueueWaitForMessageRestricted = 0x000215fd; -vTaskDelay = 0x00021645; -vTaskInternalSetTimeOutState = 0x00021691; -vTaskMissedYield = 0x000216a1; -vTaskPlaceOnEventList = 0x000216ad; -vTaskPlaceOnEventListRestricted = 0x000216e5; -vTaskPriorityDisinheritAfterTimeout = 0x00021725; -vTaskStartScheduler = 0x000217d1; -vTaskStepTick = 0x00021861; -vTaskSuspendAll = 0x00021891; -vTaskSwitchContext = 0x000218a1; -xPortStartScheduler = 0x00021949; -xQueueAddToSet = 0x00021a05; -xQueueCreateCountingSemaphore = 0x00021a29; -xQueueCreateCountingSemaphoreStatic = 0x00021a65; -xQueueCreateMutex = 0x00021aa9; -xQueueCreateMutexStatic = 0x00021abf; -xQueueCreateSet = 0x00021ad9; -xQueueGenericCreate = 0x00021ae1; -xQueueGenericCreateStatic = 0x00021b2d; -xQueueGenericReset = 0x00021b95; -xQueueGenericSend = 0x00021c21; -xQueueGenericSendFromISR = 0x00021d8d; -xQueueGiveFromISR = 0x00021e4d; -xQueueGiveMutexRecursive = 0x00021ef1; -xQueueIsQueueEmptyFromISR = 0x00021f31; -xQueueIsQueueFullFromISR = 0x00021f55; -xQueuePeek = 0x00021f7d; -xQueuePeekFromISR = 0x000220a5; -xQueueReceive = 0x00022111; -xQueueReceiveFromISR = 0x0002223d; -xQueueRemoveFromSet = 0x000222d1; -xQueueSelectFromSet = 0x000222f3; -xQueueSelectFromSetFromISR = 0x00022305; -xQueueSemaphoreTake = 0x00022319; -xQueueTakeMutexRecursive = 0x00022485; -xTaskCheckForTimeOut = 0x000224c9; -xTaskCreate = 0x00022539; -xTaskCreateStatic = 0x00022595; -xTaskGetCurrentTaskHandle = 0x00022605; -xTaskGetSchedulerState = 0x00022611; -xTaskGetTickCount = 0x0002262d; -xTaskIncrementTick = 0x00022639; -xTaskPriorityDisinherit = 0x00022705; -xTaskPriorityInherit = 0x00022799; -xTaskRemoveFromEventList = 0x0002282d; -xTaskResumeAll = 0x000228ad; -xTimerCreate = 0x00022975; -xTimerCreateStatic = 0x000229a9; -xTimerCreateTimerTask = 0x000229e1; -xTimerGenericCommand = 0x00022a4d; +att_dispatch_client_can_send_now = 0x000058d1; +att_dispatch_client_request_can_send_now_event = 0x000058d9; +att_dispatch_register_client = 0x000058f1; +att_dispatch_register_server = 0x00005905; +att_dispatch_server_can_send_now = 0x00005919; +att_dispatch_server_request_can_send_now_event = 0x00005921; +att_emit_general_event = 0x000059f1; +att_server_can_send_packet_now = 0x00006135; +att_server_get_mtu = 0x00006139; +att_server_indicate = 0x000061ad; +att_server_init = 0x00006231; +att_server_notify = 0x0000626d; +att_server_register_packet_handler = 0x00006355; +att_server_request_can_send_now_event = 0x00006361; +att_set_db = 0x0000637d; +att_set_read_callback = 0x00006391; +att_set_write_callback = 0x0000639d; +bd_addr_cmp = 0x000064e1; +bd_addr_copy = 0x000064e7; +bd_addr_to_str = 0x000064f1; +big_endian_read_16 = 0x00006529; +big_endian_read_32 = 0x00006531; +big_endian_store_16 = 0x00006545; +big_endian_store_32 = 0x00006551; +btstack_push_user_msg = 0x000067fd; +char_for_nibble = 0x00006a55; +gap_add_dev_to_periodic_list = 0x000075b9; +gap_add_whitelist = 0x000075d1; +gap_aes_encrypt = 0x000075e5; +gap_clear_white_lists = 0x0000760d; +gap_clr_adv_set = 0x0000761d; +gap_clr_periodic_adv_list = 0x0000762d; +gap_create_connection_cancel = 0x00007689; +gap_disconnect = 0x00007699; +gap_disconnect_all = 0x000076c5; +gap_ext_create_connection = 0x0000776d; +gap_get_connection_parameter_range = 0x00007831; +gap_le_read_channel_map = 0x00007871; +gap_periodic_adv_create_sync = 0x00007981; +gap_periodic_adv_create_sync_cancel = 0x000079a5; +gap_periodic_adv_term_sync = 0x000079b5; +gap_read_periodic_adv_list_size = 0x00007a49; +gap_read_phy = 0x00007a59; +gap_read_remote_info = 0x00007a6d; +gap_read_remote_used_features = 0x00007a81; +gap_read_rssi = 0x00007a95; +gap_remove_whitelist = 0x00007aa9; +gap_rmv_adv_set = 0x00007b35; +gap_rmv_dev_from_periodic_list = 0x00007b49; +gap_set_adv_set_random_addr = 0x00007b89; +gap_set_connection_parameter_range = 0x00007bd5; +gap_set_def_phy = 0x00007bed; +gap_set_ext_adv_data = 0x00007c05; +gap_set_ext_adv_enable = 0x00007c1d; +gap_set_ext_adv_para = 0x00007c99; +gap_set_ext_scan_enable = 0x00007d79; +gap_set_ext_scan_para = 0x00007d91; +gap_set_ext_scan_response_data = 0x00007e39; +gap_set_host_channel_classification = 0x00007e51; +gap_set_periodic_adv_data = 0x00007e65; +gap_set_periodic_adv_enable = 0x00007ed9; +gap_set_periodic_adv_para = 0x00007eed; +gap_set_phy = 0x00007f05; +gap_set_random_device_address = 0x00007f21; +gap_start_ccm = 0x00007f85; +gap_update_connection_parameters = 0x00007fcd; +gatt_client_cancel_write = 0x000084b5; +gatt_client_discover_characteristic_descriptors = 0x000084db; +gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x0000851d; +gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x0000856d; +gatt_client_discover_characteristics_for_service = 0x000085bd; +gatt_client_discover_primary_services = 0x000085f3; +gatt_client_discover_primary_services_by_uuid128 = 0x00008625; +gatt_client_discover_primary_services_by_uuid16 = 0x00008669; +gatt_client_execute_write = 0x000086a5; +gatt_client_find_included_services_for_service = 0x000086cb; +gatt_client_get_mtu = 0x000086f9; +gatt_client_is_ready = 0x000087a1; +gatt_client_listen_for_characteristic_value_updates = 0x000087b7; +gatt_client_prepare_write = 0x000087db; +gatt_client_pts_suppress_mtu_exchange = 0x00008819; +gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x00008825; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x0000884f; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00008855; +gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00008883; +gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00008889; +gatt_client_read_multiple_characteristic_values = 0x000088b7; +gatt_client_read_value_of_characteristic_using_value_handle = 0x000088e7; +gatt_client_read_value_of_characteristics_by_uuid128 = 0x00008915; +gatt_client_read_value_of_characteristics_by_uuid16 = 0x00008961; +gatt_client_register_handler = 0x000089ad; +gatt_client_reliable_write_long_value_of_characteristic = 0x000089b9; +gatt_client_signed_write_without_response = 0x00008de5; +gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x00008ea9; +gatt_client_write_client_characteristic_configuration = 0x00008ee3; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x00008f35; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00008f45; +gatt_client_write_long_value_of_characteristic = 0x00008f81; +gatt_client_write_long_value_of_characteristic_with_offset = 0x00008f91; +gatt_client_write_value_of_characteristic = 0x00008fcd; +gatt_client_write_value_of_characteristic_without_response = 0x00009003; +hci_add_event_handler = 0x0000b29d; +hci_power_control = 0x0000b9e5; +hci_register_acl_packet_handler = 0x0000bb99; +kv_get = 0x0000c219; +kv_init = 0x0000c231; +kv_put = 0x0000c281; +kv_remove = 0x0000c2f9; +kv_value_modified = 0x0000c369; +kv_visit = 0x0000c36d; +l2cap_can_send_fixed_channel_packet_now = 0x0000c42d; +l2cap_can_send_packet_now = 0x0000c431; +l2cap_create_channel = 0x0000c5e9; +l2cap_disconnect = 0x0000c721; +l2cap_get_remote_mtu_for_local_cid = 0x0000c9c5; +l2cap_init = 0x0000ce45; +l2cap_le_send_flow_control_credit = 0x0000ce8d; +l2cap_max_le_mtu = 0x0000d0f1; +l2cap_max_mtu = 0x0000d0f5; +l2cap_next_local_cid = 0x0000d0f9; +l2cap_next_sig_id = 0x0000d109; +l2cap_register_fixed_channel = 0x0000d1a1; +l2cap_register_packet_handler = 0x0000d1bd; +l2cap_register_service = 0x0000d1c9; +l2cap_request_can_send_fix_channel_now_event = 0x0000d2b1; +l2cap_request_can_send_now_event = 0x0000d2d5; +l2cap_request_connection_parameter_update = 0x0000d2ef; +l2cap_require_security_level_2_for_outgoing_sdp = 0x0000d321; +l2cap_send = 0x0000d6e5; +l2cap_send_connectionless = 0x0000d75d; +l2cap_send_connectionless3 = 0x0000d7ed; +l2cap_send_echo_request = 0x0000d885; +l2cap_send_signaling_le = 0x0000d8e9; +l2cap_unregister_service = 0x0000d941; +ll_hint_on_ce_len = 0x0000db25; +ll_set_adv_coded_scheme = 0x0000de01; +ll_set_initiating_coded_scheme = 0x0000de31; +nibble_for_char = 0x0001c60d; +platform_config = 0x0001c6b1; +platform_get_heap_status = 0x0001c6e5; +platform_get_version = 0x0001c6fd; +platform_patch_rf_init_data = 0x0001c705; +platform_printf = 0x0001c721; +platform_raise_assertion = 0x0001c735; +platform_read_persistent_reg = 0x0001c749; +platform_reset = 0x0001c759; +platform_set_evt_callback = 0x0001c78d; +platform_set_irq_callback = 0x0001c7a1; +platform_set_rf_clk_source = 0x0001c7d9; +platform_set_rf_init_data = 0x0001c7e5; +platform_set_rf_power_mapping = 0x0001c7f1; +platform_switch_app = 0x0001c7fd; +platform_write_persistent_reg = 0x0001c821; +printf_hexdump = 0x0001d511; +pvPortMalloc = 0x0001dfa1; +pvTaskIncrementMutexHeldCount = 0x0001e089; +pvTimerGetTimerID = 0x0001e0a1; +pxPortInitialiseStack = 0x0001e0cd; +reverse_128 = 0x0001e275; +reverse_24 = 0x0001e27b; +reverse_48 = 0x0001e281; +reverse_56 = 0x0001e287; +reverse_64 = 0x0001e28d; +reverse_bd_addr = 0x0001e293; +reverse_bytes = 0x0001e299; +sm_add_event_handler = 0x0001e3f9; +sm_address_resolution_lookup = 0x0001e525; +sm_authenticated = 0x0001e5ff; +sm_authorization_decline = 0x0001e60d; +sm_authorization_grant = 0x0001e62d; +sm_authorization_state = 0x0001e64d; +sm_bonding_decline = 0x0001e669; +sm_config = 0x0001ea41; +sm_encryption_key_size = 0x0001eb4d; +sm_just_works_confirm = 0x0001f31d; +sm_le_device_key = 0x0001f56d; +sm_passkey_input = 0x0001f605; +sm_private_random_address_generation_get = 0x0001f991; +sm_private_random_address_generation_get_mode = 0x0001f999; +sm_private_random_address_generation_set_mode = 0x0001f9a5; +sm_private_random_address_generation_set_update_period = 0x0001f9cd; +sm_register_oob_data_callback = 0x0001fa05; +sm_request_pairing = 0x0001fa11; +sm_send_security_request = 0x0002044b; +sm_set_accepted_stk_generation_methods = 0x00020471; +sm_set_authentication_requirements = 0x0002047d; +sm_set_encryption_key_size_range = 0x00020489; +sscanf_bd_addr = 0x00020785; +sysSetPublicDeviceAddr = 0x00020811; +uuid128_to_str = 0x00020b85; +uuid_add_bluetooth_prefix = 0x00020bdd; +uuid_has_bluetooth_prefix = 0x00020bfd; +uxQueueMessagesWaiting = 0x00020c41; +uxQueueMessagesWaitingFromISR = 0x00020c69; +uxQueueSpacesAvailable = 0x00020c85; +vPortFree = 0x00020db5; +vQueueDelete = 0x00020e89; +vQueueWaitForMessageRestricted = 0x00020eb5; +vTaskDelay = 0x00020efd; +vTaskInternalSetTimeOutState = 0x00020f49; +vTaskMissedYield = 0x00020f59; +vTaskPlaceOnEventList = 0x00020f65; +vTaskPlaceOnEventListRestricted = 0x00020f9d; +vTaskPriorityDisinheritAfterTimeout = 0x00020fdd; +vTaskStartScheduler = 0x00021089; +vTaskSuspendAll = 0x00021119; +vTaskSwitchContext = 0x00021129; +xPortStartScheduler = 0x000211d1; +xQueueAddToSet = 0x0002128d; +xQueueCreateCountingSemaphore = 0x000212b1; +xQueueCreateCountingSemaphoreStatic = 0x000212ed; +xQueueCreateMutex = 0x00021331; +xQueueCreateMutexStatic = 0x00021347; +xQueueCreateSet = 0x00021361; +xQueueGenericCreate = 0x00021369; +xQueueGenericCreateStatic = 0x000213b5; +xQueueGenericReset = 0x0002141d; +xQueueGenericSend = 0x000214a9; +xQueueGenericSendFromISR = 0x00021615; +xQueueGiveFromISR = 0x000216d5; +xQueueGiveMutexRecursive = 0x00021779; +xQueueIsQueueEmptyFromISR = 0x000217b9; +xQueueIsQueueFullFromISR = 0x000217dd; +xQueuePeek = 0x00021805; +xQueuePeekFromISR = 0x0002192d; +xQueueReceive = 0x00021999; +xQueueReceiveFromISR = 0x00021ac5; +xQueueRemoveFromSet = 0x00021b59; +xQueueSelectFromSet = 0x00021b7b; +xQueueSelectFromSetFromISR = 0x00021b8d; +xQueueSemaphoreTake = 0x00021ba1; +xQueueTakeMutexRecursive = 0x00021d0d; +xTaskCheckForTimeOut = 0x00021d51; +xTaskCreate = 0x00021dc1; +xTaskCreateStatic = 0x00021e1d; +xTaskGetCurrentTaskHandle = 0x00021e8d; +xTaskGetSchedulerState = 0x00021e99; +xTaskGetTickCount = 0x00021eb5; +xTaskIncrementTick = 0x00021ec1; +xTaskPriorityDisinherit = 0x00021f8d; +xTaskPriorityInherit = 0x00022021; +xTaskRemoveFromEventList = 0x000220b5; +xTaskResumeAll = 0x00022131; +xTimerCreate = 0x000221f9; +xTimerCreateStatic = 0x0002222d; +xTimerCreateTimerTask = 0x00022265; +xTimerGenericCommand = 0x000222d1; diff --git a/bundles/typical/ING9188xx/symdefs.i b/bundles/typical/ING9188xx/symdefs.i index 29b7c1f53..18ad7d5ba 100644 --- a/bundles/typical/ING9188xx/symdefs.i +++ b/bundles/typical/ING9188xx/symdefs.i @@ -1,247 +1,247 @@ ---define_symbol att_dispatch_client_can_send_now=0x00005985 ---define_symbol att_dispatch_client_request_can_send_now_event=0x0000598d ---define_symbol att_dispatch_register_client=0x000059a5 ---define_symbol att_dispatch_register_server=0x000059b9 ---define_symbol att_dispatch_server_can_send_now=0x000059cd ---define_symbol att_dispatch_server_request_can_send_now_event=0x000059d5 ---define_symbol att_emit_general_event=0x00005aa5 ---define_symbol att_server_can_send_packet_now=0x00006235 ---define_symbol att_server_get_mtu=0x00006239 ---define_symbol att_server_indicate=0x000062ad ---define_symbol att_server_init=0x00006331 ---define_symbol att_server_notify=0x0000636d ---define_symbol att_server_register_packet_handler=0x00006455 ---define_symbol att_server_request_can_send_now_event=0x00006461 ---define_symbol att_set_db=0x0000647d ---define_symbol att_set_read_callback=0x00006491 ---define_symbol att_set_write_callback=0x0000649d ---define_symbol bd_addr_cmp=0x000065e1 ---define_symbol bd_addr_copy=0x000065e7 ---define_symbol bd_addr_to_str=0x000065f1 ---define_symbol big_endian_read_16=0x00006629 ---define_symbol big_endian_read_32=0x00006631 ---define_symbol big_endian_store_16=0x00006645 ---define_symbol big_endian_store_32=0x00006651 ---define_symbol btstack_push_user_msg=0x000069b5 ---define_symbol char_for_nibble=0x00006c0d ---define_symbol eTaskConfirmSleepModeStatus=0x00006e99 ---define_symbol gap_add_dev_to_periodic_list=0x000077a5 ---define_symbol gap_add_whitelist=0x000077bd ---define_symbol gap_aes_encrypt=0x000077d1 ---define_symbol gap_clear_white_lists=0x000077f9 ---define_symbol gap_clr_adv_set=0x00007809 ---define_symbol gap_clr_periodic_adv_list=0x00007819 ---define_symbol gap_create_connection_cancel=0x00007875 ---define_symbol gap_disconnect=0x00007885 ---define_symbol gap_disconnect_all=0x000078b1 ---define_symbol gap_ext_create_connection=0x00007959 ---define_symbol gap_get_connection_parameter_range=0x00007a1d ---define_symbol gap_le_read_channel_map=0x00007a5d ---define_symbol gap_periodic_adv_create_sync=0x00007b6d ---define_symbol gap_periodic_adv_create_sync_cancel=0x00007b91 ---define_symbol gap_periodic_adv_term_sync=0x00007ba1 ---define_symbol gap_read_periodic_adv_list_size=0x00007c35 ---define_symbol gap_read_phy=0x00007c45 ---define_symbol gap_read_remote_info=0x00007c59 ---define_symbol gap_read_remote_used_features=0x00007c6d ---define_symbol gap_read_rssi=0x00007c81 ---define_symbol gap_remove_whitelist=0x00007c95 ---define_symbol gap_rmv_adv_set=0x00007d21 ---define_symbol gap_rmv_dev_from_periodic_list=0x00007d35 ---define_symbol gap_set_adv_set_random_addr=0x00007d75 ---define_symbol gap_set_connection_parameter_range=0x00007dc1 ---define_symbol gap_set_def_phy=0x00007dd9 ---define_symbol gap_set_ext_adv_data=0x00007df1 ---define_symbol gap_set_ext_adv_enable=0x00007e09 ---define_symbol gap_set_ext_adv_para=0x00007e85 ---define_symbol gap_set_ext_scan_enable=0x00007f65 ---define_symbol gap_set_ext_scan_para=0x00007f7d ---define_symbol gap_set_ext_scan_response_data=0x00008025 ---define_symbol gap_set_host_channel_classification=0x0000803d ---define_symbol gap_set_periodic_adv_data=0x00008051 ---define_symbol gap_set_periodic_adv_enable=0x000080c5 ---define_symbol gap_set_periodic_adv_para=0x000080d9 ---define_symbol gap_set_phy=0x000080f1 ---define_symbol gap_set_random_device_address=0x0000810d ---define_symbol gap_start_ccm=0x00008171 ---define_symbol gap_update_connection_parameters=0x000081b9 ---define_symbol gatt_client_cancel_write=0x00008675 ---define_symbol gatt_client_discover_characteristic_descriptors=0x0000869b ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000086dd ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000872d ---define_symbol gatt_client_discover_characteristics_for_service=0x0000877d ---define_symbol gatt_client_discover_primary_services=0x000087b3 ---define_symbol gatt_client_discover_primary_services_by_uuid128=0x000087e5 ---define_symbol gatt_client_discover_primary_services_by_uuid16=0x00008829 ---define_symbol gatt_client_execute_write=0x00008865 ---define_symbol gatt_client_find_included_services_for_service=0x0000888b ---define_symbol gatt_client_get_mtu=0x000088b9 ---define_symbol gatt_client_is_ready=0x00008961 ---define_symbol gatt_client_listen_for_characteristic_value_updates=0x00008977 ---define_symbol gatt_client_prepare_write=0x0000899b ---define_symbol gatt_client_pts_suppress_mtu_exchange=0x000089d9 ---define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x000089e5 ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00008a0f ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008a15 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008a43 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008a49 ---define_symbol gatt_client_read_multiple_characteristic_values=0x00008a77 ---define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x00008aa7 ---define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00008ad5 ---define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00008b21 ---define_symbol gatt_client_register_handler=0x00008b6d ---define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x00008b79 ---define_symbol gatt_client_signed_write_without_response=0x00008fa5 ---define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009069 ---define_symbol gatt_client_write_client_characteristic_configuration=0x000090a3 ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000090f5 ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009105 ---define_symbol gatt_client_write_long_value_of_characteristic=0x00009141 ---define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00009151 ---define_symbol gatt_client_write_value_of_characteristic=0x0000918d ---define_symbol gatt_client_write_value_of_characteristic_without_response=0x000091c3 ---define_symbol hci_add_event_handler=0x0000b429 ---define_symbol hci_power_control=0x0000bb71 ---define_symbol hci_register_acl_packet_handler=0x0000bd25 ---define_symbol kv_get=0x0000c3a5 ---define_symbol kv_init=0x0000c3bd ---define_symbol kv_put=0x0000c40d ---define_symbol kv_remove=0x0000c485 ---define_symbol kv_value_modified=0x0000c4f5 ---define_symbol kv_visit=0x0000c4f9 ---define_symbol l2cap_can_send_fixed_channel_packet_now=0x0000c5b9 ---define_symbol l2cap_can_send_packet_now=0x0000c5bd ---define_symbol l2cap_create_channel=0x0000c76d ---define_symbol l2cap_disconnect=0x0000c8a5 ---define_symbol l2cap_get_remote_mtu_for_local_cid=0x0000cb49 ---define_symbol l2cap_init=0x0000cfb9 ---define_symbol l2cap_le_send_flow_control_credit=0x0000d001 ---define_symbol l2cap_max_le_mtu=0x0000d261 ---define_symbol l2cap_max_mtu=0x0000d265 ---define_symbol l2cap_next_local_cid=0x0000d269 ---define_symbol l2cap_next_sig_id=0x0000d279 ---define_symbol l2cap_register_fixed_channel=0x0000d311 ---define_symbol l2cap_register_packet_handler=0x0000d32d ---define_symbol l2cap_register_service=0x0000d339 ---define_symbol l2cap_request_can_send_fix_channel_now_event=0x0000d421 ---define_symbol l2cap_request_can_send_now_event=0x0000d445 ---define_symbol l2cap_request_connection_parameter_update=0x0000d45f ---define_symbol l2cap_require_security_level_2_for_outgoing_sdp=0x0000d491 ---define_symbol l2cap_send=0x0000d855 ---define_symbol l2cap_send_connectionless=0x0000d8cd ---define_symbol l2cap_send_connectionless3=0x0000d95d ---define_symbol l2cap_send_echo_request=0x0000d9f5 ---define_symbol l2cap_send_signaling_le=0x0000da59 ---define_symbol l2cap_unregister_service=0x0000dab1 ---define_symbol ll_hint_on_ce_len=0x0000dc95 ---define_symbol ll_set_adv_coded_scheme=0x0000df71 ---define_symbol ll_set_initiating_coded_scheme=0x0000dfa1 ---define_symbol nibble_for_char=0x0001c861 ---define_symbol platform_config=0x0001c905 ---define_symbol platform_get_heap_status=0x0001c941 ---define_symbol platform_get_version=0x0001c959 ---define_symbol platform_printf=0x0001c961 ---define_symbol platform_raise_assertion=0x0001c975 ---define_symbol platform_reset=0x0001c989 ---define_symbol platform_set_evt_callback=0x0001c9bd ---define_symbol platform_set_irq_callback=0x0001c9d1 ---define_symbol platform_set_rf_clk_source=0x0001ca09 ---define_symbol platform_set_rf_init_data=0x0001ca15 ---define_symbol platform_set_rf_power_mapping=0x0001ca21 ---define_symbol platform_shutdown=0x0001ca2d ---define_symbol platform_switch_app=0x0001ca31 ---define_symbol printf_hexdump=0x0001d721 ---define_symbol pvPortMalloc=0x0001e21d ---define_symbol pvTaskIncrementMutexHeldCount=0x0001e305 ---define_symbol pvTimerGetTimerID=0x0001e31d ---define_symbol pxPortInitialiseStack=0x0001e349 ---define_symbol reverse_128=0x0001e4f1 ---define_symbol reverse_24=0x0001e4f7 ---define_symbol reverse_48=0x0001e4fd ---define_symbol reverse_56=0x0001e503 ---define_symbol reverse_64=0x0001e509 ---define_symbol reverse_bd_addr=0x0001e50f ---define_symbol reverse_bytes=0x0001e515 ---define_symbol sm_add_event_handler=0x0001e675 ---define_symbol sm_address_resolution_lookup=0x0001e7a9 ---define_symbol sm_authenticated=0x0001e883 ---define_symbol sm_authorization_decline=0x0001e899 ---define_symbol sm_authorization_grant=0x0001e8b9 ---define_symbol sm_authorization_state=0x0001e8d9 ---define_symbol sm_bonding_decline=0x0001e8f5 ---define_symbol sm_config=0x0001eccd ---define_symbol sm_encryption_key_size=0x0001edd9 ---define_symbol sm_just_works_confirm=0x0001f559 ---define_symbol sm_le_device_key=0x0001f7a9 ---define_symbol sm_passkey_input=0x0001f841 ---define_symbol sm_private_random_address_generation_get=0x0001fbcd ---define_symbol sm_private_random_address_generation_get_mode=0x0001fbd5 ---define_symbol sm_private_random_address_generation_set_mode=0x0001fbe1 ---define_symbol sm_private_random_address_generation_set_update_period=0x0001fc09 ---define_symbol sm_register_oob_data_callback=0x0001fc41 ---define_symbol sm_request_pairing=0x0001fc4d ---define_symbol sm_send_security_request=0x0002067f ---define_symbol sm_set_accepted_stk_generation_methods=0x000206a5 ---define_symbol sm_set_authentication_requirements=0x000206b1 ---define_symbol sm_set_encryption_key_size_range=0x000206bd ---define_symbol sscanf_bd_addr=0x000209b1 ---define_symbol sysSetPublicDeviceAddr=0x00020ced ---define_symbol uuid128_to_str=0x000211d1 ---define_symbol uuid_add_bluetooth_prefix=0x00021229 ---define_symbol uuid_has_bluetooth_prefix=0x00021249 ---define_symbol uxQueueMessagesWaiting=0x0002128d ---define_symbol uxQueueMessagesWaitingFromISR=0x000212b5 ---define_symbol uxQueueSpacesAvailable=0x000212d1 ---define_symbol vPortFree=0x00021401 ---define_symbol vQueueDelete=0x000215d1 ---define_symbol vQueueWaitForMessageRestricted=0x000215fd ---define_symbol vTaskDelay=0x00021645 ---define_symbol vTaskInternalSetTimeOutState=0x00021691 ---define_symbol vTaskMissedYield=0x000216a1 ---define_symbol vTaskPlaceOnEventList=0x000216ad ---define_symbol vTaskPlaceOnEventListRestricted=0x000216e5 ---define_symbol vTaskPriorityDisinheritAfterTimeout=0x00021725 ---define_symbol vTaskStartScheduler=0x000217d1 ---define_symbol vTaskStepTick=0x00021861 ---define_symbol vTaskSuspendAll=0x00021891 ---define_symbol vTaskSwitchContext=0x000218a1 ---define_symbol xPortStartScheduler=0x00021949 ---define_symbol xQueueAddToSet=0x00021a05 ---define_symbol xQueueCreateCountingSemaphore=0x00021a29 ---define_symbol xQueueCreateCountingSemaphoreStatic=0x00021a65 ---define_symbol xQueueCreateMutex=0x00021aa9 ---define_symbol xQueueCreateMutexStatic=0x00021abf ---define_symbol xQueueCreateSet=0x00021ad9 ---define_symbol xQueueGenericCreate=0x00021ae1 ---define_symbol xQueueGenericCreateStatic=0x00021b2d ---define_symbol xQueueGenericReset=0x00021b95 ---define_symbol xQueueGenericSend=0x00021c21 ---define_symbol xQueueGenericSendFromISR=0x00021d8d ---define_symbol xQueueGiveFromISR=0x00021e4d ---define_symbol xQueueGiveMutexRecursive=0x00021ef1 ---define_symbol xQueueIsQueueEmptyFromISR=0x00021f31 ---define_symbol xQueueIsQueueFullFromISR=0x00021f55 ---define_symbol xQueuePeek=0x00021f7d ---define_symbol xQueuePeekFromISR=0x000220a5 ---define_symbol xQueueReceive=0x00022111 ---define_symbol xQueueReceiveFromISR=0x0002223d ---define_symbol xQueueRemoveFromSet=0x000222d1 ---define_symbol xQueueSelectFromSet=0x000222f3 ---define_symbol xQueueSelectFromSetFromISR=0x00022305 ---define_symbol xQueueSemaphoreTake=0x00022319 ---define_symbol xQueueTakeMutexRecursive=0x00022485 ---define_symbol xTaskCheckForTimeOut=0x000224c9 ---define_symbol xTaskCreate=0x00022539 ---define_symbol xTaskCreateStatic=0x00022595 ---define_symbol xTaskGetCurrentTaskHandle=0x00022605 ---define_symbol xTaskGetSchedulerState=0x00022611 ---define_symbol xTaskGetTickCount=0x0002262d ---define_symbol xTaskIncrementTick=0x00022639 ---define_symbol xTaskPriorityDisinherit=0x00022705 ---define_symbol xTaskPriorityInherit=0x00022799 ---define_symbol xTaskRemoveFromEventList=0x0002282d ---define_symbol xTaskResumeAll=0x000228ad ---define_symbol xTimerCreate=0x00022975 ---define_symbol xTimerCreateStatic=0x000229a9 ---define_symbol xTimerCreateTimerTask=0x000229e1 ---define_symbol xTimerGenericCommand=0x00022a4d +--define_symbol att_dispatch_client_can_send_now=0x000058d1 +--define_symbol att_dispatch_client_request_can_send_now_event=0x000058d9 +--define_symbol att_dispatch_register_client=0x000058f1 +--define_symbol att_dispatch_register_server=0x00005905 +--define_symbol att_dispatch_server_can_send_now=0x00005919 +--define_symbol att_dispatch_server_request_can_send_now_event=0x00005921 +--define_symbol att_emit_general_event=0x000059f1 +--define_symbol att_server_can_send_packet_now=0x00006135 +--define_symbol att_server_get_mtu=0x00006139 +--define_symbol att_server_indicate=0x000061ad +--define_symbol att_server_init=0x00006231 +--define_symbol att_server_notify=0x0000626d +--define_symbol att_server_register_packet_handler=0x00006355 +--define_symbol att_server_request_can_send_now_event=0x00006361 +--define_symbol att_set_db=0x0000637d +--define_symbol att_set_read_callback=0x00006391 +--define_symbol att_set_write_callback=0x0000639d +--define_symbol bd_addr_cmp=0x000064e1 +--define_symbol bd_addr_copy=0x000064e7 +--define_symbol bd_addr_to_str=0x000064f1 +--define_symbol big_endian_read_16=0x00006529 +--define_symbol big_endian_read_32=0x00006531 +--define_symbol big_endian_store_16=0x00006545 +--define_symbol big_endian_store_32=0x00006551 +--define_symbol btstack_push_user_msg=0x000067fd +--define_symbol char_for_nibble=0x00006a55 +--define_symbol gap_add_dev_to_periodic_list=0x000075b9 +--define_symbol gap_add_whitelist=0x000075d1 +--define_symbol gap_aes_encrypt=0x000075e5 +--define_symbol gap_clear_white_lists=0x0000760d +--define_symbol gap_clr_adv_set=0x0000761d +--define_symbol gap_clr_periodic_adv_list=0x0000762d +--define_symbol gap_create_connection_cancel=0x00007689 +--define_symbol gap_disconnect=0x00007699 +--define_symbol gap_disconnect_all=0x000076c5 +--define_symbol gap_ext_create_connection=0x0000776d +--define_symbol gap_get_connection_parameter_range=0x00007831 +--define_symbol gap_le_read_channel_map=0x00007871 +--define_symbol gap_periodic_adv_create_sync=0x00007981 +--define_symbol gap_periodic_adv_create_sync_cancel=0x000079a5 +--define_symbol gap_periodic_adv_term_sync=0x000079b5 +--define_symbol gap_read_periodic_adv_list_size=0x00007a49 +--define_symbol gap_read_phy=0x00007a59 +--define_symbol gap_read_remote_info=0x00007a6d +--define_symbol gap_read_remote_used_features=0x00007a81 +--define_symbol gap_read_rssi=0x00007a95 +--define_symbol gap_remove_whitelist=0x00007aa9 +--define_symbol gap_rmv_adv_set=0x00007b35 +--define_symbol gap_rmv_dev_from_periodic_list=0x00007b49 +--define_symbol gap_set_adv_set_random_addr=0x00007b89 +--define_symbol gap_set_connection_parameter_range=0x00007bd5 +--define_symbol gap_set_def_phy=0x00007bed +--define_symbol gap_set_ext_adv_data=0x00007c05 +--define_symbol gap_set_ext_adv_enable=0x00007c1d +--define_symbol gap_set_ext_adv_para=0x00007c99 +--define_symbol gap_set_ext_scan_enable=0x00007d79 +--define_symbol gap_set_ext_scan_para=0x00007d91 +--define_symbol gap_set_ext_scan_response_data=0x00007e39 +--define_symbol gap_set_host_channel_classification=0x00007e51 +--define_symbol gap_set_periodic_adv_data=0x00007e65 +--define_symbol gap_set_periodic_adv_enable=0x00007ed9 +--define_symbol gap_set_periodic_adv_para=0x00007eed +--define_symbol gap_set_phy=0x00007f05 +--define_symbol gap_set_random_device_address=0x00007f21 +--define_symbol gap_start_ccm=0x00007f85 +--define_symbol gap_update_connection_parameters=0x00007fcd +--define_symbol gatt_client_cancel_write=0x000084b5 +--define_symbol gatt_client_discover_characteristic_descriptors=0x000084db +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x0000851d +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000856d +--define_symbol gatt_client_discover_characteristics_for_service=0x000085bd +--define_symbol gatt_client_discover_primary_services=0x000085f3 +--define_symbol gatt_client_discover_primary_services_by_uuid128=0x00008625 +--define_symbol gatt_client_discover_primary_services_by_uuid16=0x00008669 +--define_symbol gatt_client_execute_write=0x000086a5 +--define_symbol gatt_client_find_included_services_for_service=0x000086cb +--define_symbol gatt_client_get_mtu=0x000086f9 +--define_symbol gatt_client_is_ready=0x000087a1 +--define_symbol gatt_client_listen_for_characteristic_value_updates=0x000087b7 +--define_symbol gatt_client_prepare_write=0x000087db +--define_symbol gatt_client_pts_suppress_mtu_exchange=0x00008819 +--define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00008825 +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x0000884f +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008855 +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008883 +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008889 +--define_symbol gatt_client_read_multiple_characteristic_values=0x000088b7 +--define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x000088e7 +--define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00008915 +--define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00008961 +--define_symbol gatt_client_register_handler=0x000089ad +--define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x000089b9 +--define_symbol gatt_client_signed_write_without_response=0x00008de5 +--define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00008ea9 +--define_symbol gatt_client_write_client_characteristic_configuration=0x00008ee3 +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00008f35 +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008f45 +--define_symbol gatt_client_write_long_value_of_characteristic=0x00008f81 +--define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00008f91 +--define_symbol gatt_client_write_value_of_characteristic=0x00008fcd +--define_symbol gatt_client_write_value_of_characteristic_without_response=0x00009003 +--define_symbol hci_add_event_handler=0x0000b29d +--define_symbol hci_power_control=0x0000b9e5 +--define_symbol hci_register_acl_packet_handler=0x0000bb99 +--define_symbol kv_get=0x0000c219 +--define_symbol kv_init=0x0000c231 +--define_symbol kv_put=0x0000c281 +--define_symbol kv_remove=0x0000c2f9 +--define_symbol kv_value_modified=0x0000c369 +--define_symbol kv_visit=0x0000c36d +--define_symbol l2cap_can_send_fixed_channel_packet_now=0x0000c42d +--define_symbol l2cap_can_send_packet_now=0x0000c431 +--define_symbol l2cap_create_channel=0x0000c5e9 +--define_symbol l2cap_disconnect=0x0000c721 +--define_symbol l2cap_get_remote_mtu_for_local_cid=0x0000c9c5 +--define_symbol l2cap_init=0x0000ce45 +--define_symbol l2cap_le_send_flow_control_credit=0x0000ce8d +--define_symbol l2cap_max_le_mtu=0x0000d0f1 +--define_symbol l2cap_max_mtu=0x0000d0f5 +--define_symbol l2cap_next_local_cid=0x0000d0f9 +--define_symbol l2cap_next_sig_id=0x0000d109 +--define_symbol l2cap_register_fixed_channel=0x0000d1a1 +--define_symbol l2cap_register_packet_handler=0x0000d1bd +--define_symbol l2cap_register_service=0x0000d1c9 +--define_symbol l2cap_request_can_send_fix_channel_now_event=0x0000d2b1 +--define_symbol l2cap_request_can_send_now_event=0x0000d2d5 +--define_symbol l2cap_request_connection_parameter_update=0x0000d2ef +--define_symbol l2cap_require_security_level_2_for_outgoing_sdp=0x0000d321 +--define_symbol l2cap_send=0x0000d6e5 +--define_symbol l2cap_send_connectionless=0x0000d75d +--define_symbol l2cap_send_connectionless3=0x0000d7ed +--define_symbol l2cap_send_echo_request=0x0000d885 +--define_symbol l2cap_send_signaling_le=0x0000d8e9 +--define_symbol l2cap_unregister_service=0x0000d941 +--define_symbol ll_hint_on_ce_len=0x0000db25 +--define_symbol ll_set_adv_coded_scheme=0x0000de01 +--define_symbol ll_set_initiating_coded_scheme=0x0000de31 +--define_symbol nibble_for_char=0x0001c60d +--define_symbol platform_config=0x0001c6b1 +--define_symbol platform_get_heap_status=0x0001c6e5 +--define_symbol platform_get_version=0x0001c6fd +--define_symbol platform_patch_rf_init_data=0x0001c705 +--define_symbol platform_printf=0x0001c721 +--define_symbol platform_raise_assertion=0x0001c735 +--define_symbol platform_read_persistent_reg=0x0001c749 +--define_symbol platform_reset=0x0001c759 +--define_symbol platform_set_evt_callback=0x0001c78d +--define_symbol platform_set_irq_callback=0x0001c7a1 +--define_symbol platform_set_rf_clk_source=0x0001c7d9 +--define_symbol platform_set_rf_init_data=0x0001c7e5 +--define_symbol platform_set_rf_power_mapping=0x0001c7f1 +--define_symbol platform_switch_app=0x0001c7fd +--define_symbol platform_write_persistent_reg=0x0001c821 +--define_symbol printf_hexdump=0x0001d511 +--define_symbol pvPortMalloc=0x0001dfa1 +--define_symbol pvTaskIncrementMutexHeldCount=0x0001e089 +--define_symbol pvTimerGetTimerID=0x0001e0a1 +--define_symbol pxPortInitialiseStack=0x0001e0cd +--define_symbol reverse_128=0x0001e275 +--define_symbol reverse_24=0x0001e27b +--define_symbol reverse_48=0x0001e281 +--define_symbol reverse_56=0x0001e287 +--define_symbol reverse_64=0x0001e28d +--define_symbol reverse_bd_addr=0x0001e293 +--define_symbol reverse_bytes=0x0001e299 +--define_symbol sm_add_event_handler=0x0001e3f9 +--define_symbol sm_address_resolution_lookup=0x0001e525 +--define_symbol sm_authenticated=0x0001e5ff +--define_symbol sm_authorization_decline=0x0001e60d +--define_symbol sm_authorization_grant=0x0001e62d +--define_symbol sm_authorization_state=0x0001e64d +--define_symbol sm_bonding_decline=0x0001e669 +--define_symbol sm_config=0x0001ea41 +--define_symbol sm_encryption_key_size=0x0001eb4d +--define_symbol sm_just_works_confirm=0x0001f31d +--define_symbol sm_le_device_key=0x0001f56d +--define_symbol sm_passkey_input=0x0001f605 +--define_symbol sm_private_random_address_generation_get=0x0001f991 +--define_symbol sm_private_random_address_generation_get_mode=0x0001f999 +--define_symbol sm_private_random_address_generation_set_mode=0x0001f9a5 +--define_symbol sm_private_random_address_generation_set_update_period=0x0001f9cd +--define_symbol sm_register_oob_data_callback=0x0001fa05 +--define_symbol sm_request_pairing=0x0001fa11 +--define_symbol sm_send_security_request=0x0002044b +--define_symbol sm_set_accepted_stk_generation_methods=0x00020471 +--define_symbol sm_set_authentication_requirements=0x0002047d +--define_symbol sm_set_encryption_key_size_range=0x00020489 +--define_symbol sscanf_bd_addr=0x00020785 +--define_symbol sysSetPublicDeviceAddr=0x00020811 +--define_symbol uuid128_to_str=0x00020b85 +--define_symbol uuid_add_bluetooth_prefix=0x00020bdd +--define_symbol uuid_has_bluetooth_prefix=0x00020bfd +--define_symbol uxQueueMessagesWaiting=0x00020c41 +--define_symbol uxQueueMessagesWaitingFromISR=0x00020c69 +--define_symbol uxQueueSpacesAvailable=0x00020c85 +--define_symbol vPortFree=0x00020db5 +--define_symbol vQueueDelete=0x00020e89 +--define_symbol vQueueWaitForMessageRestricted=0x00020eb5 +--define_symbol vTaskDelay=0x00020efd +--define_symbol vTaskInternalSetTimeOutState=0x00020f49 +--define_symbol vTaskMissedYield=0x00020f59 +--define_symbol vTaskPlaceOnEventList=0x00020f65 +--define_symbol vTaskPlaceOnEventListRestricted=0x00020f9d +--define_symbol vTaskPriorityDisinheritAfterTimeout=0x00020fdd +--define_symbol vTaskStartScheduler=0x00021089 +--define_symbol vTaskSuspendAll=0x00021119 +--define_symbol vTaskSwitchContext=0x00021129 +--define_symbol xPortStartScheduler=0x000211d1 +--define_symbol xQueueAddToSet=0x0002128d +--define_symbol xQueueCreateCountingSemaphore=0x000212b1 +--define_symbol xQueueCreateCountingSemaphoreStatic=0x000212ed +--define_symbol xQueueCreateMutex=0x00021331 +--define_symbol xQueueCreateMutexStatic=0x00021347 +--define_symbol xQueueCreateSet=0x00021361 +--define_symbol xQueueGenericCreate=0x00021369 +--define_symbol xQueueGenericCreateStatic=0x000213b5 +--define_symbol xQueueGenericReset=0x0002141d +--define_symbol xQueueGenericSend=0x000214a9 +--define_symbol xQueueGenericSendFromISR=0x00021615 +--define_symbol xQueueGiveFromISR=0x000216d5 +--define_symbol xQueueGiveMutexRecursive=0x00021779 +--define_symbol xQueueIsQueueEmptyFromISR=0x000217b9 +--define_symbol xQueueIsQueueFullFromISR=0x000217dd +--define_symbol xQueuePeek=0x00021805 +--define_symbol xQueuePeekFromISR=0x0002192d +--define_symbol xQueueReceive=0x00021999 +--define_symbol xQueueReceiveFromISR=0x00021ac5 +--define_symbol xQueueRemoveFromSet=0x00021b59 +--define_symbol xQueueSelectFromSet=0x00021b7b +--define_symbol xQueueSelectFromSetFromISR=0x00021b8d +--define_symbol xQueueSemaphoreTake=0x00021ba1 +--define_symbol xQueueTakeMutexRecursive=0x00021d0d +--define_symbol xTaskCheckForTimeOut=0x00021d51 +--define_symbol xTaskCreate=0x00021dc1 +--define_symbol xTaskCreateStatic=0x00021e1d +--define_symbol xTaskGetCurrentTaskHandle=0x00021e8d +--define_symbol xTaskGetSchedulerState=0x00021e99 +--define_symbol xTaskGetTickCount=0x00021eb5 +--define_symbol xTaskIncrementTick=0x00021ec1 +--define_symbol xTaskPriorityDisinherit=0x00021f8d +--define_symbol xTaskPriorityInherit=0x00022021 +--define_symbol xTaskRemoveFromEventList=0x000220b5 +--define_symbol xTaskResumeAll=0x00022131 +--define_symbol xTimerCreate=0x000221f9 +--define_symbol xTimerCreateStatic=0x0002222d +--define_symbol xTimerCreateTimerTask=0x00022265 +--define_symbol xTimerGenericCommand=0x000222d1 diff --git a/bundles/typical/ING9188xx/symdefs.m b/bundles/typical/ING9188xx/symdefs.m index 18f57f366..5ed6c435a 100644 --- a/bundles/typical/ING9188xx/symdefs.m +++ b/bundles/typical/ING9188xx/symdefs.m @@ -1,248 +1,248 @@ ## ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 -0x00005985 T att_dispatch_client_can_send_now -0x0000598d T att_dispatch_client_request_can_send_now_event -0x000059a5 T att_dispatch_register_client -0x000059b9 T att_dispatch_register_server -0x000059cd T att_dispatch_server_can_send_now -0x000059d5 T att_dispatch_server_request_can_send_now_event -0x00005aa5 T att_emit_general_event -0x00006235 T att_server_can_send_packet_now -0x00006239 T att_server_get_mtu -0x000062ad T att_server_indicate -0x00006331 T att_server_init -0x0000636d T att_server_notify -0x00006455 T att_server_register_packet_handler -0x00006461 T att_server_request_can_send_now_event -0x0000647d T att_set_db -0x00006491 T att_set_read_callback -0x0000649d T att_set_write_callback -0x000065e1 T bd_addr_cmp -0x000065e7 T bd_addr_copy -0x000065f1 T bd_addr_to_str -0x00006629 T big_endian_read_16 -0x00006631 T big_endian_read_32 -0x00006645 T big_endian_store_16 -0x00006651 T big_endian_store_32 -0x000069b5 T btstack_push_user_msg -0x00006c0d T char_for_nibble -0x00006e99 T eTaskConfirmSleepModeStatus -0x000077a5 T gap_add_dev_to_periodic_list -0x000077bd T gap_add_whitelist -0x000077d1 T gap_aes_encrypt -0x000077f9 T gap_clear_white_lists -0x00007809 T gap_clr_adv_set -0x00007819 T gap_clr_periodic_adv_list -0x00007875 T gap_create_connection_cancel -0x00007885 T gap_disconnect -0x000078b1 T gap_disconnect_all -0x00007959 T gap_ext_create_connection -0x00007a1d T gap_get_connection_parameter_range -0x00007a5d T gap_le_read_channel_map -0x00007b6d T gap_periodic_adv_create_sync -0x00007b91 T gap_periodic_adv_create_sync_cancel -0x00007ba1 T gap_periodic_adv_term_sync -0x00007c35 T gap_read_periodic_adv_list_size -0x00007c45 T gap_read_phy -0x00007c59 T gap_read_remote_info -0x00007c6d T gap_read_remote_used_features -0x00007c81 T gap_read_rssi -0x00007c95 T gap_remove_whitelist -0x00007d21 T gap_rmv_adv_set -0x00007d35 T gap_rmv_dev_from_periodic_list -0x00007d75 T gap_set_adv_set_random_addr -0x00007dc1 T gap_set_connection_parameter_range -0x00007dd9 T gap_set_def_phy -0x00007df1 T gap_set_ext_adv_data -0x00007e09 T gap_set_ext_adv_enable -0x00007e85 T gap_set_ext_adv_para -0x00007f65 T gap_set_ext_scan_enable -0x00007f7d T gap_set_ext_scan_para -0x00008025 T gap_set_ext_scan_response_data -0x0000803d T gap_set_host_channel_classification -0x00008051 T gap_set_periodic_adv_data -0x000080c5 T gap_set_periodic_adv_enable -0x000080d9 T gap_set_periodic_adv_para -0x000080f1 T gap_set_phy -0x0000810d T gap_set_random_device_address -0x00008171 T gap_start_ccm -0x000081b9 T gap_update_connection_parameters -0x00008675 T gatt_client_cancel_write -0x0000869b T gatt_client_discover_characteristic_descriptors -0x000086dd T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x0000872d T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x0000877d T gatt_client_discover_characteristics_for_service -0x000087b3 T gatt_client_discover_primary_services -0x000087e5 T gatt_client_discover_primary_services_by_uuid128 -0x00008829 T gatt_client_discover_primary_services_by_uuid16 -0x00008865 T gatt_client_execute_write -0x0000888b T gatt_client_find_included_services_for_service -0x000088b9 T gatt_client_get_mtu -0x00008961 T gatt_client_is_ready -0x00008977 T gatt_client_listen_for_characteristic_value_updates -0x0000899b T gatt_client_prepare_write -0x000089d9 T gatt_client_pts_suppress_mtu_exchange -0x000089e5 T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x00008a0f T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x00008a15 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00008a43 T gatt_client_read_long_value_of_characteristic_using_value_handle -0x00008a49 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x00008a77 T gatt_client_read_multiple_characteristic_values -0x00008aa7 T gatt_client_read_value_of_characteristic_using_value_handle -0x00008ad5 T gatt_client_read_value_of_characteristics_by_uuid128 -0x00008b21 T gatt_client_read_value_of_characteristics_by_uuid16 -0x00008b6d T gatt_client_register_handler -0x00008b79 T gatt_client_reliable_write_long_value_of_characteristic -0x00008fa5 T gatt_client_signed_write_without_response -0x00009069 T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x000090a3 T gatt_client_write_client_characteristic_configuration -0x000090f5 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x00009105 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00009141 T gatt_client_write_long_value_of_characteristic -0x00009151 T gatt_client_write_long_value_of_characteristic_with_offset -0x0000918d T gatt_client_write_value_of_characteristic -0x000091c3 T gatt_client_write_value_of_characteristic_without_response -0x0000b429 T hci_add_event_handler -0x0000bb71 T hci_power_control -0x0000bd25 T hci_register_acl_packet_handler -0x0000c3a5 T kv_get -0x0000c3bd T kv_init -0x0000c40d T kv_put -0x0000c485 T kv_remove -0x0000c4f5 T kv_value_modified -0x0000c4f9 T kv_visit -0x0000c5b9 T l2cap_can_send_fixed_channel_packet_now -0x0000c5bd T l2cap_can_send_packet_now -0x0000c76d T l2cap_create_channel -0x0000c8a5 T l2cap_disconnect -0x0000cb49 T l2cap_get_remote_mtu_for_local_cid -0x0000cfb9 T l2cap_init -0x0000d001 T l2cap_le_send_flow_control_credit -0x0000d261 T l2cap_max_le_mtu -0x0000d265 T l2cap_max_mtu -0x0000d269 T l2cap_next_local_cid -0x0000d279 T l2cap_next_sig_id -0x0000d311 T l2cap_register_fixed_channel -0x0000d32d T l2cap_register_packet_handler -0x0000d339 T l2cap_register_service -0x0000d421 T l2cap_request_can_send_fix_channel_now_event -0x0000d445 T l2cap_request_can_send_now_event -0x0000d45f T l2cap_request_connection_parameter_update -0x0000d491 T l2cap_require_security_level_2_for_outgoing_sdp -0x0000d855 T l2cap_send -0x0000d8cd T l2cap_send_connectionless -0x0000d95d T l2cap_send_connectionless3 -0x0000d9f5 T l2cap_send_echo_request -0x0000da59 T l2cap_send_signaling_le -0x0000dab1 T l2cap_unregister_service -0x0000dc95 T ll_hint_on_ce_len -0x0000df71 T ll_set_adv_coded_scheme -0x0000dfa1 T ll_set_initiating_coded_scheme -0x0001c861 T nibble_for_char -0x0001c905 T platform_config -0x0001c941 T platform_get_heap_status -0x0001c959 T platform_get_version -0x0001c961 T platform_printf -0x0001c975 T platform_raise_assertion -0x0001c989 T platform_reset -0x0001c9bd T platform_set_evt_callback -0x0001c9d1 T platform_set_irq_callback -0x0001ca09 T platform_set_rf_clk_source -0x0001ca15 T platform_set_rf_init_data -0x0001ca21 T platform_set_rf_power_mapping -0x0001ca2d T platform_shutdown -0x0001ca31 T platform_switch_app -0x0001d721 T printf_hexdump -0x0001e21d T pvPortMalloc -0x0001e305 T pvTaskIncrementMutexHeldCount -0x0001e31d T pvTimerGetTimerID -0x0001e349 T pxPortInitialiseStack -0x0001e4f1 T reverse_128 -0x0001e4f7 T reverse_24 -0x0001e4fd T reverse_48 -0x0001e503 T reverse_56 -0x0001e509 T reverse_64 -0x0001e50f T reverse_bd_addr -0x0001e515 T reverse_bytes -0x0001e675 T sm_add_event_handler -0x0001e7a9 T sm_address_resolution_lookup -0x0001e883 T sm_authenticated -0x0001e899 T sm_authorization_decline -0x0001e8b9 T sm_authorization_grant -0x0001e8d9 T sm_authorization_state -0x0001e8f5 T sm_bonding_decline -0x0001eccd T sm_config -0x0001edd9 T sm_encryption_key_size -0x0001f559 T sm_just_works_confirm -0x0001f7a9 T sm_le_device_key -0x0001f841 T sm_passkey_input -0x0001fbcd T sm_private_random_address_generation_get -0x0001fbd5 T sm_private_random_address_generation_get_mode -0x0001fbe1 T sm_private_random_address_generation_set_mode -0x0001fc09 T sm_private_random_address_generation_set_update_period -0x0001fc41 T sm_register_oob_data_callback -0x0001fc4d T sm_request_pairing -0x0002067f T sm_send_security_request -0x000206a5 T sm_set_accepted_stk_generation_methods -0x000206b1 T sm_set_authentication_requirements -0x000206bd T sm_set_encryption_key_size_range -0x000209b1 T sscanf_bd_addr -0x00020ced T sysSetPublicDeviceAddr -0x000211d1 T uuid128_to_str -0x00021229 T uuid_add_bluetooth_prefix -0x00021249 T uuid_has_bluetooth_prefix -0x0002128d T uxQueueMessagesWaiting -0x000212b5 T uxQueueMessagesWaitingFromISR -0x000212d1 T uxQueueSpacesAvailable -0x00021401 T vPortFree -0x000215d1 T vQueueDelete -0x000215fd T vQueueWaitForMessageRestricted -0x00021645 T vTaskDelay -0x00021691 T vTaskInternalSetTimeOutState -0x000216a1 T vTaskMissedYield -0x000216ad T vTaskPlaceOnEventList -0x000216e5 T vTaskPlaceOnEventListRestricted -0x00021725 T vTaskPriorityDisinheritAfterTimeout -0x000217d1 T vTaskStartScheduler -0x00021861 T vTaskStepTick -0x00021891 T vTaskSuspendAll -0x000218a1 T vTaskSwitchContext -0x00021949 T xPortStartScheduler -0x00021a05 T xQueueAddToSet -0x00021a29 T xQueueCreateCountingSemaphore -0x00021a65 T xQueueCreateCountingSemaphoreStatic -0x00021aa9 T xQueueCreateMutex -0x00021abf T xQueueCreateMutexStatic -0x00021ad9 T xQueueCreateSet -0x00021ae1 T xQueueGenericCreate -0x00021b2d T xQueueGenericCreateStatic -0x00021b95 T xQueueGenericReset -0x00021c21 T xQueueGenericSend -0x00021d8d T xQueueGenericSendFromISR -0x00021e4d T xQueueGiveFromISR -0x00021ef1 T xQueueGiveMutexRecursive -0x00021f31 T xQueueIsQueueEmptyFromISR -0x00021f55 T xQueueIsQueueFullFromISR -0x00021f7d T xQueuePeek -0x000220a5 T xQueuePeekFromISR -0x00022111 T xQueueReceive -0x0002223d T xQueueReceiveFromISR -0x000222d1 T xQueueRemoveFromSet -0x000222f3 T xQueueSelectFromSet -0x00022305 T xQueueSelectFromSetFromISR -0x00022319 T xQueueSemaphoreTake -0x00022485 T xQueueTakeMutexRecursive -0x000224c9 T xTaskCheckForTimeOut -0x00022539 T xTaskCreate -0x00022595 T xTaskCreateStatic -0x00022605 T xTaskGetCurrentTaskHandle -0x00022611 T xTaskGetSchedulerState -0x0002262d T xTaskGetTickCount -0x00022639 T xTaskIncrementTick -0x00022705 T xTaskPriorityDisinherit -0x00022799 T xTaskPriorityInherit -0x0002282d T xTaskRemoveFromEventList -0x000228ad T xTaskResumeAll -0x00022975 T xTimerCreate -0x000229a9 T xTimerCreateStatic -0x000229e1 T xTimerCreateTimerTask -0x00022a4d T xTimerGenericCommand +0x000058d1 T att_dispatch_client_can_send_now +0x000058d9 T att_dispatch_client_request_can_send_now_event +0x000058f1 T att_dispatch_register_client +0x00005905 T att_dispatch_register_server +0x00005919 T att_dispatch_server_can_send_now +0x00005921 T att_dispatch_server_request_can_send_now_event +0x000059f1 T att_emit_general_event +0x00006135 T att_server_can_send_packet_now +0x00006139 T att_server_get_mtu +0x000061ad T att_server_indicate +0x00006231 T att_server_init +0x0000626d T att_server_notify +0x00006355 T att_server_register_packet_handler +0x00006361 T att_server_request_can_send_now_event +0x0000637d T att_set_db +0x00006391 T att_set_read_callback +0x0000639d T att_set_write_callback +0x000064e1 T bd_addr_cmp +0x000064e7 T bd_addr_copy +0x000064f1 T bd_addr_to_str +0x00006529 T big_endian_read_16 +0x00006531 T big_endian_read_32 +0x00006545 T big_endian_store_16 +0x00006551 T big_endian_store_32 +0x000067fd T btstack_push_user_msg +0x00006a55 T char_for_nibble +0x000075b9 T gap_add_dev_to_periodic_list +0x000075d1 T gap_add_whitelist +0x000075e5 T gap_aes_encrypt +0x0000760d T gap_clear_white_lists +0x0000761d T gap_clr_adv_set +0x0000762d T gap_clr_periodic_adv_list +0x00007689 T gap_create_connection_cancel +0x00007699 T gap_disconnect +0x000076c5 T gap_disconnect_all +0x0000776d T gap_ext_create_connection +0x00007831 T gap_get_connection_parameter_range +0x00007871 T gap_le_read_channel_map +0x00007981 T gap_periodic_adv_create_sync +0x000079a5 T gap_periodic_adv_create_sync_cancel +0x000079b5 T gap_periodic_adv_term_sync +0x00007a49 T gap_read_periodic_adv_list_size +0x00007a59 T gap_read_phy +0x00007a6d T gap_read_remote_info +0x00007a81 T gap_read_remote_used_features +0x00007a95 T gap_read_rssi +0x00007aa9 T gap_remove_whitelist +0x00007b35 T gap_rmv_adv_set +0x00007b49 T gap_rmv_dev_from_periodic_list +0x00007b89 T gap_set_adv_set_random_addr +0x00007bd5 T gap_set_connection_parameter_range +0x00007bed T gap_set_def_phy +0x00007c05 T gap_set_ext_adv_data +0x00007c1d T gap_set_ext_adv_enable +0x00007c99 T gap_set_ext_adv_para +0x00007d79 T gap_set_ext_scan_enable +0x00007d91 T gap_set_ext_scan_para +0x00007e39 T gap_set_ext_scan_response_data +0x00007e51 T gap_set_host_channel_classification +0x00007e65 T gap_set_periodic_adv_data +0x00007ed9 T gap_set_periodic_adv_enable +0x00007eed T gap_set_periodic_adv_para +0x00007f05 T gap_set_phy +0x00007f21 T gap_set_random_device_address +0x00007f85 T gap_start_ccm +0x00007fcd T gap_update_connection_parameters +0x000084b5 T gatt_client_cancel_write +0x000084db T gatt_client_discover_characteristic_descriptors +0x0000851d T gatt_client_discover_characteristics_for_handle_range_by_uuid128 +0x0000856d T gatt_client_discover_characteristics_for_handle_range_by_uuid16 +0x000085bd T gatt_client_discover_characteristics_for_service +0x000085f3 T gatt_client_discover_primary_services +0x00008625 T gatt_client_discover_primary_services_by_uuid128 +0x00008669 T gatt_client_discover_primary_services_by_uuid16 +0x000086a5 T gatt_client_execute_write +0x000086cb T gatt_client_find_included_services_for_service +0x000086f9 T gatt_client_get_mtu +0x000087a1 T gatt_client_is_ready +0x000087b7 T gatt_client_listen_for_characteristic_value_updates +0x000087db T gatt_client_prepare_write +0x00008819 T gatt_client_pts_suppress_mtu_exchange +0x00008825 T gatt_client_read_characteristic_descriptor_using_descriptor_handle +0x0000884f T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle +0x00008855 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00008883 T gatt_client_read_long_value_of_characteristic_using_value_handle +0x00008889 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset +0x000088b7 T gatt_client_read_multiple_characteristic_values +0x000088e7 T gatt_client_read_value_of_characteristic_using_value_handle +0x00008915 T gatt_client_read_value_of_characteristics_by_uuid128 +0x00008961 T gatt_client_read_value_of_characteristics_by_uuid16 +0x000089ad T gatt_client_register_handler +0x000089b9 T gatt_client_reliable_write_long_value_of_characteristic +0x00008de5 T gatt_client_signed_write_without_response +0x00008ea9 T gatt_client_write_characteristic_descriptor_using_descriptor_handle +0x00008ee3 T gatt_client_write_client_characteristic_configuration +0x00008f35 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle +0x00008f45 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00008f81 T gatt_client_write_long_value_of_characteristic +0x00008f91 T gatt_client_write_long_value_of_characteristic_with_offset +0x00008fcd T gatt_client_write_value_of_characteristic +0x00009003 T gatt_client_write_value_of_characteristic_without_response +0x0000b29d T hci_add_event_handler +0x0000b9e5 T hci_power_control +0x0000bb99 T hci_register_acl_packet_handler +0x0000c219 T kv_get +0x0000c231 T kv_init +0x0000c281 T kv_put +0x0000c2f9 T kv_remove +0x0000c369 T kv_value_modified +0x0000c36d T kv_visit +0x0000c42d T l2cap_can_send_fixed_channel_packet_now +0x0000c431 T l2cap_can_send_packet_now +0x0000c5e9 T l2cap_create_channel +0x0000c721 T l2cap_disconnect +0x0000c9c5 T l2cap_get_remote_mtu_for_local_cid +0x0000ce45 T l2cap_init +0x0000ce8d T l2cap_le_send_flow_control_credit +0x0000d0f1 T l2cap_max_le_mtu +0x0000d0f5 T l2cap_max_mtu +0x0000d0f9 T l2cap_next_local_cid +0x0000d109 T l2cap_next_sig_id +0x0000d1a1 T l2cap_register_fixed_channel +0x0000d1bd T l2cap_register_packet_handler +0x0000d1c9 T l2cap_register_service +0x0000d2b1 T l2cap_request_can_send_fix_channel_now_event +0x0000d2d5 T l2cap_request_can_send_now_event +0x0000d2ef T l2cap_request_connection_parameter_update +0x0000d321 T l2cap_require_security_level_2_for_outgoing_sdp +0x0000d6e5 T l2cap_send +0x0000d75d T l2cap_send_connectionless +0x0000d7ed T l2cap_send_connectionless3 +0x0000d885 T l2cap_send_echo_request +0x0000d8e9 T l2cap_send_signaling_le +0x0000d941 T l2cap_unregister_service +0x0000db25 T ll_hint_on_ce_len +0x0000de01 T ll_set_adv_coded_scheme +0x0000de31 T ll_set_initiating_coded_scheme +0x0001c60d T nibble_for_char +0x0001c6b1 T platform_config +0x0001c6e5 T platform_get_heap_status +0x0001c6fd T platform_get_version +0x0001c705 T platform_patch_rf_init_data +0x0001c721 T platform_printf +0x0001c735 T platform_raise_assertion +0x0001c749 T platform_read_persistent_reg +0x0001c759 T platform_reset +0x0001c78d T platform_set_evt_callback +0x0001c7a1 T platform_set_irq_callback +0x0001c7d9 T platform_set_rf_clk_source +0x0001c7e5 T platform_set_rf_init_data +0x0001c7f1 T platform_set_rf_power_mapping +0x0001c7fd T platform_switch_app +0x0001c821 T platform_write_persistent_reg +0x0001d511 T printf_hexdump +0x0001dfa1 T pvPortMalloc +0x0001e089 T pvTaskIncrementMutexHeldCount +0x0001e0a1 T pvTimerGetTimerID +0x0001e0cd T pxPortInitialiseStack +0x0001e275 T reverse_128 +0x0001e27b T reverse_24 +0x0001e281 T reverse_48 +0x0001e287 T reverse_56 +0x0001e28d T reverse_64 +0x0001e293 T reverse_bd_addr +0x0001e299 T reverse_bytes +0x0001e3f9 T sm_add_event_handler +0x0001e525 T sm_address_resolution_lookup +0x0001e5ff T sm_authenticated +0x0001e60d T sm_authorization_decline +0x0001e62d T sm_authorization_grant +0x0001e64d T sm_authorization_state +0x0001e669 T sm_bonding_decline +0x0001ea41 T sm_config +0x0001eb4d T sm_encryption_key_size +0x0001f31d T sm_just_works_confirm +0x0001f56d T sm_le_device_key +0x0001f605 T sm_passkey_input +0x0001f991 T sm_private_random_address_generation_get +0x0001f999 T sm_private_random_address_generation_get_mode +0x0001f9a5 T sm_private_random_address_generation_set_mode +0x0001f9cd T sm_private_random_address_generation_set_update_period +0x0001fa05 T sm_register_oob_data_callback +0x0001fa11 T sm_request_pairing +0x0002044b T sm_send_security_request +0x00020471 T sm_set_accepted_stk_generation_methods +0x0002047d T sm_set_authentication_requirements +0x00020489 T sm_set_encryption_key_size_range +0x00020785 T sscanf_bd_addr +0x00020811 T sysSetPublicDeviceAddr +0x00020b85 T uuid128_to_str +0x00020bdd T uuid_add_bluetooth_prefix +0x00020bfd T uuid_has_bluetooth_prefix +0x00020c41 T uxQueueMessagesWaiting +0x00020c69 T uxQueueMessagesWaitingFromISR +0x00020c85 T uxQueueSpacesAvailable +0x00020db5 T vPortFree +0x00020e89 T vQueueDelete +0x00020eb5 T vQueueWaitForMessageRestricted +0x00020efd T vTaskDelay +0x00020f49 T vTaskInternalSetTimeOutState +0x00020f59 T vTaskMissedYield +0x00020f65 T vTaskPlaceOnEventList +0x00020f9d T vTaskPlaceOnEventListRestricted +0x00020fdd T vTaskPriorityDisinheritAfterTimeout +0x00021089 T vTaskStartScheduler +0x00021119 T vTaskSuspendAll +0x00021129 T vTaskSwitchContext +0x000211d1 T xPortStartScheduler +0x0002128d T xQueueAddToSet +0x000212b1 T xQueueCreateCountingSemaphore +0x000212ed T xQueueCreateCountingSemaphoreStatic +0x00021331 T xQueueCreateMutex +0x00021347 T xQueueCreateMutexStatic +0x00021361 T xQueueCreateSet +0x00021369 T xQueueGenericCreate +0x000213b5 T xQueueGenericCreateStatic +0x0002141d T xQueueGenericReset +0x000214a9 T xQueueGenericSend +0x00021615 T xQueueGenericSendFromISR +0x000216d5 T xQueueGiveFromISR +0x00021779 T xQueueGiveMutexRecursive +0x000217b9 T xQueueIsQueueEmptyFromISR +0x000217dd T xQueueIsQueueFullFromISR +0x00021805 T xQueuePeek +0x0002192d T xQueuePeekFromISR +0x00021999 T xQueueReceive +0x00021ac5 T xQueueReceiveFromISR +0x00021b59 T xQueueRemoveFromSet +0x00021b7b T xQueueSelectFromSet +0x00021b8d T xQueueSelectFromSetFromISR +0x00021ba1 T xQueueSemaphoreTake +0x00021d0d T xQueueTakeMutexRecursive +0x00021d51 T xTaskCheckForTimeOut +0x00021dc1 T xTaskCreate +0x00021e1d T xTaskCreateStatic +0x00021e8d T xTaskGetCurrentTaskHandle +0x00021e99 T xTaskGetSchedulerState +0x00021eb5 T xTaskGetTickCount +0x00021ec1 T xTaskIncrementTick +0x00021f8d T xTaskPriorityDisinherit +0x00022021 T xTaskPriorityInherit +0x000220b5 T xTaskRemoveFromEventList +0x00022131 T xTaskResumeAll +0x000221f9 T xTimerCreate +0x0002222d T xTimerCreateStatic +0x00022265 T xTimerCreateTimerTask +0x000222d1 T xTimerGenericCommand diff --git a/bundles/typical/ING9188xx/symdefs.s b/bundles/typical/ING9188xx/symdefs.s index 2681fe297..dfcfe348c 100644 --- a/bundles/typical/ING9188xx/symdefs.s +++ b/bundles/typical/ING9188xx/symdefs.s @@ -1,247 +1,247 @@ ---defsym:att_dispatch_client_can_send_now=0x00005985 ---defsym:att_dispatch_client_request_can_send_now_event=0x0000598d ---defsym:att_dispatch_register_client=0x000059a5 ---defsym:att_dispatch_register_server=0x000059b9 ---defsym:att_dispatch_server_can_send_now=0x000059cd ---defsym:att_dispatch_server_request_can_send_now_event=0x000059d5 ---defsym:att_emit_general_event=0x00005aa5 ---defsym:att_server_can_send_packet_now=0x00006235 ---defsym:att_server_get_mtu=0x00006239 ---defsym:att_server_indicate=0x000062ad ---defsym:att_server_init=0x00006331 ---defsym:att_server_notify=0x0000636d ---defsym:att_server_register_packet_handler=0x00006455 ---defsym:att_server_request_can_send_now_event=0x00006461 ---defsym:att_set_db=0x0000647d ---defsym:att_set_read_callback=0x00006491 ---defsym:att_set_write_callback=0x0000649d ---defsym:bd_addr_cmp=0x000065e1 ---defsym:bd_addr_copy=0x000065e7 ---defsym:bd_addr_to_str=0x000065f1 ---defsym:big_endian_read_16=0x00006629 ---defsym:big_endian_read_32=0x00006631 ---defsym:big_endian_store_16=0x00006645 ---defsym:big_endian_store_32=0x00006651 ---defsym:btstack_push_user_msg=0x000069b5 ---defsym:char_for_nibble=0x00006c0d ---defsym:eTaskConfirmSleepModeStatus=0x00006e99 ---defsym:gap_add_dev_to_periodic_list=0x000077a5 ---defsym:gap_add_whitelist=0x000077bd ---defsym:gap_aes_encrypt=0x000077d1 ---defsym:gap_clear_white_lists=0x000077f9 ---defsym:gap_clr_adv_set=0x00007809 ---defsym:gap_clr_periodic_adv_list=0x00007819 ---defsym:gap_create_connection_cancel=0x00007875 ---defsym:gap_disconnect=0x00007885 ---defsym:gap_disconnect_all=0x000078b1 ---defsym:gap_ext_create_connection=0x00007959 ---defsym:gap_get_connection_parameter_range=0x00007a1d ---defsym:gap_le_read_channel_map=0x00007a5d ---defsym:gap_periodic_adv_create_sync=0x00007b6d ---defsym:gap_periodic_adv_create_sync_cancel=0x00007b91 ---defsym:gap_periodic_adv_term_sync=0x00007ba1 ---defsym:gap_read_periodic_adv_list_size=0x00007c35 ---defsym:gap_read_phy=0x00007c45 ---defsym:gap_read_remote_info=0x00007c59 ---defsym:gap_read_remote_used_features=0x00007c6d ---defsym:gap_read_rssi=0x00007c81 ---defsym:gap_remove_whitelist=0x00007c95 ---defsym:gap_rmv_adv_set=0x00007d21 ---defsym:gap_rmv_dev_from_periodic_list=0x00007d35 ---defsym:gap_set_adv_set_random_addr=0x00007d75 ---defsym:gap_set_connection_parameter_range=0x00007dc1 ---defsym:gap_set_def_phy=0x00007dd9 ---defsym:gap_set_ext_adv_data=0x00007df1 ---defsym:gap_set_ext_adv_enable=0x00007e09 ---defsym:gap_set_ext_adv_para=0x00007e85 ---defsym:gap_set_ext_scan_enable=0x00007f65 ---defsym:gap_set_ext_scan_para=0x00007f7d ---defsym:gap_set_ext_scan_response_data=0x00008025 ---defsym:gap_set_host_channel_classification=0x0000803d ---defsym:gap_set_periodic_adv_data=0x00008051 ---defsym:gap_set_periodic_adv_enable=0x000080c5 ---defsym:gap_set_periodic_adv_para=0x000080d9 ---defsym:gap_set_phy=0x000080f1 ---defsym:gap_set_random_device_address=0x0000810d ---defsym:gap_start_ccm=0x00008171 ---defsym:gap_update_connection_parameters=0x000081b9 ---defsym:gatt_client_cancel_write=0x00008675 ---defsym:gatt_client_discover_characteristic_descriptors=0x0000869b ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000086dd ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000872d ---defsym:gatt_client_discover_characteristics_for_service=0x0000877d ---defsym:gatt_client_discover_primary_services=0x000087b3 ---defsym:gatt_client_discover_primary_services_by_uuid128=0x000087e5 ---defsym:gatt_client_discover_primary_services_by_uuid16=0x00008829 ---defsym:gatt_client_execute_write=0x00008865 ---defsym:gatt_client_find_included_services_for_service=0x0000888b ---defsym:gatt_client_get_mtu=0x000088b9 ---defsym:gatt_client_is_ready=0x00008961 ---defsym:gatt_client_listen_for_characteristic_value_updates=0x00008977 ---defsym:gatt_client_prepare_write=0x0000899b ---defsym:gatt_client_pts_suppress_mtu_exchange=0x000089d9 ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x000089e5 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00008a0f ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008a15 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008a43 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008a49 ---defsym:gatt_client_read_multiple_characteristic_values=0x00008a77 ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00008aa7 ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00008ad5 ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00008b21 ---defsym:gatt_client_register_handler=0x00008b6d ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00008b79 ---defsym:gatt_client_signed_write_without_response=0x00008fa5 ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009069 ---defsym:gatt_client_write_client_characteristic_configuration=0x000090a3 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000090f5 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009105 ---defsym:gatt_client_write_long_value_of_characteristic=0x00009141 ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00009151 ---defsym:gatt_client_write_value_of_characteristic=0x0000918d ---defsym:gatt_client_write_value_of_characteristic_without_response=0x000091c3 ---defsym:hci_add_event_handler=0x0000b429 ---defsym:hci_power_control=0x0000bb71 ---defsym:hci_register_acl_packet_handler=0x0000bd25 ---defsym:kv_get=0x0000c3a5 ---defsym:kv_init=0x0000c3bd ---defsym:kv_put=0x0000c40d ---defsym:kv_remove=0x0000c485 ---defsym:kv_value_modified=0x0000c4f5 ---defsym:kv_visit=0x0000c4f9 ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c5b9 ---defsym:l2cap_can_send_packet_now=0x0000c5bd ---defsym:l2cap_create_channel=0x0000c76d ---defsym:l2cap_disconnect=0x0000c8a5 ---defsym:l2cap_get_remote_mtu_for_local_cid=0x0000cb49 ---defsym:l2cap_init=0x0000cfb9 ---defsym:l2cap_le_send_flow_control_credit=0x0000d001 ---defsym:l2cap_max_le_mtu=0x0000d261 ---defsym:l2cap_max_mtu=0x0000d265 ---defsym:l2cap_next_local_cid=0x0000d269 ---defsym:l2cap_next_sig_id=0x0000d279 ---defsym:l2cap_register_fixed_channel=0x0000d311 ---defsym:l2cap_register_packet_handler=0x0000d32d ---defsym:l2cap_register_service=0x0000d339 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d421 ---defsym:l2cap_request_can_send_now_event=0x0000d445 ---defsym:l2cap_request_connection_parameter_update=0x0000d45f ---defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d491 ---defsym:l2cap_send=0x0000d855 ---defsym:l2cap_send_connectionless=0x0000d8cd ---defsym:l2cap_send_connectionless3=0x0000d95d ---defsym:l2cap_send_echo_request=0x0000d9f5 ---defsym:l2cap_send_signaling_le=0x0000da59 ---defsym:l2cap_unregister_service=0x0000dab1 ---defsym:ll_hint_on_ce_len=0x0000dc95 ---defsym:ll_set_adv_coded_scheme=0x0000df71 ---defsym:ll_set_initiating_coded_scheme=0x0000dfa1 ---defsym:nibble_for_char=0x0001c861 ---defsym:platform_config=0x0001c905 ---defsym:platform_get_heap_status=0x0001c941 ---defsym:platform_get_version=0x0001c959 ---defsym:platform_printf=0x0001c961 ---defsym:platform_raise_assertion=0x0001c975 ---defsym:platform_reset=0x0001c989 ---defsym:platform_set_evt_callback=0x0001c9bd ---defsym:platform_set_irq_callback=0x0001c9d1 ---defsym:platform_set_rf_clk_source=0x0001ca09 ---defsym:platform_set_rf_init_data=0x0001ca15 ---defsym:platform_set_rf_power_mapping=0x0001ca21 ---defsym:platform_shutdown=0x0001ca2d ---defsym:platform_switch_app=0x0001ca31 ---defsym:printf_hexdump=0x0001d721 ---defsym:pvPortMalloc=0x0001e21d ---defsym:pvTaskIncrementMutexHeldCount=0x0001e305 ---defsym:pvTimerGetTimerID=0x0001e31d ---defsym:pxPortInitialiseStack=0x0001e349 ---defsym:reverse_128=0x0001e4f1 ---defsym:reverse_24=0x0001e4f7 ---defsym:reverse_48=0x0001e4fd ---defsym:reverse_56=0x0001e503 ---defsym:reverse_64=0x0001e509 ---defsym:reverse_bd_addr=0x0001e50f ---defsym:reverse_bytes=0x0001e515 ---defsym:sm_add_event_handler=0x0001e675 ---defsym:sm_address_resolution_lookup=0x0001e7a9 ---defsym:sm_authenticated=0x0001e883 ---defsym:sm_authorization_decline=0x0001e899 ---defsym:sm_authorization_grant=0x0001e8b9 ---defsym:sm_authorization_state=0x0001e8d9 ---defsym:sm_bonding_decline=0x0001e8f5 ---defsym:sm_config=0x0001eccd ---defsym:sm_encryption_key_size=0x0001edd9 ---defsym:sm_just_works_confirm=0x0001f559 ---defsym:sm_le_device_key=0x0001f7a9 ---defsym:sm_passkey_input=0x0001f841 ---defsym:sm_private_random_address_generation_get=0x0001fbcd ---defsym:sm_private_random_address_generation_get_mode=0x0001fbd5 ---defsym:sm_private_random_address_generation_set_mode=0x0001fbe1 ---defsym:sm_private_random_address_generation_set_update_period=0x0001fc09 ---defsym:sm_register_oob_data_callback=0x0001fc41 ---defsym:sm_request_pairing=0x0001fc4d ---defsym:sm_send_security_request=0x0002067f ---defsym:sm_set_accepted_stk_generation_methods=0x000206a5 ---defsym:sm_set_authentication_requirements=0x000206b1 ---defsym:sm_set_encryption_key_size_range=0x000206bd ---defsym:sscanf_bd_addr=0x000209b1 ---defsym:sysSetPublicDeviceAddr=0x00020ced ---defsym:uuid128_to_str=0x000211d1 ---defsym:uuid_add_bluetooth_prefix=0x00021229 ---defsym:uuid_has_bluetooth_prefix=0x00021249 ---defsym:uxQueueMessagesWaiting=0x0002128d ---defsym:uxQueueMessagesWaitingFromISR=0x000212b5 ---defsym:uxQueueSpacesAvailable=0x000212d1 ---defsym:vPortFree=0x00021401 ---defsym:vQueueDelete=0x000215d1 ---defsym:vQueueWaitForMessageRestricted=0x000215fd ---defsym:vTaskDelay=0x00021645 ---defsym:vTaskInternalSetTimeOutState=0x00021691 ---defsym:vTaskMissedYield=0x000216a1 ---defsym:vTaskPlaceOnEventList=0x000216ad ---defsym:vTaskPlaceOnEventListRestricted=0x000216e5 ---defsym:vTaskPriorityDisinheritAfterTimeout=0x00021725 ---defsym:vTaskStartScheduler=0x000217d1 ---defsym:vTaskStepTick=0x00021861 ---defsym:vTaskSuspendAll=0x00021891 ---defsym:vTaskSwitchContext=0x000218a1 ---defsym:xPortStartScheduler=0x00021949 ---defsym:xQueueAddToSet=0x00021a05 ---defsym:xQueueCreateCountingSemaphore=0x00021a29 ---defsym:xQueueCreateCountingSemaphoreStatic=0x00021a65 ---defsym:xQueueCreateMutex=0x00021aa9 ---defsym:xQueueCreateMutexStatic=0x00021abf ---defsym:xQueueCreateSet=0x00021ad9 ---defsym:xQueueGenericCreate=0x00021ae1 ---defsym:xQueueGenericCreateStatic=0x00021b2d ---defsym:xQueueGenericReset=0x00021b95 ---defsym:xQueueGenericSend=0x00021c21 ---defsym:xQueueGenericSendFromISR=0x00021d8d ---defsym:xQueueGiveFromISR=0x00021e4d ---defsym:xQueueGiveMutexRecursive=0x00021ef1 ---defsym:xQueueIsQueueEmptyFromISR=0x00021f31 ---defsym:xQueueIsQueueFullFromISR=0x00021f55 ---defsym:xQueuePeek=0x00021f7d ---defsym:xQueuePeekFromISR=0x000220a5 ---defsym:xQueueReceive=0x00022111 ---defsym:xQueueReceiveFromISR=0x0002223d ---defsym:xQueueRemoveFromSet=0x000222d1 ---defsym:xQueueSelectFromSet=0x000222f3 ---defsym:xQueueSelectFromSetFromISR=0x00022305 ---defsym:xQueueSemaphoreTake=0x00022319 ---defsym:xQueueTakeMutexRecursive=0x00022485 ---defsym:xTaskCheckForTimeOut=0x000224c9 ---defsym:xTaskCreate=0x00022539 ---defsym:xTaskCreateStatic=0x00022595 ---defsym:xTaskGetCurrentTaskHandle=0x00022605 ---defsym:xTaskGetSchedulerState=0x00022611 ---defsym:xTaskGetTickCount=0x0002262d ---defsym:xTaskIncrementTick=0x00022639 ---defsym:xTaskPriorityDisinherit=0x00022705 ---defsym:xTaskPriorityInherit=0x00022799 ---defsym:xTaskRemoveFromEventList=0x0002282d ---defsym:xTaskResumeAll=0x000228ad ---defsym:xTimerCreate=0x00022975 ---defsym:xTimerCreateStatic=0x000229a9 ---defsym:xTimerCreateTimerTask=0x000229e1 ---defsym:xTimerGenericCommand=0x00022a4d +--defsym:att_dispatch_client_can_send_now=0x000058d1 +--defsym:att_dispatch_client_request_can_send_now_event=0x000058d9 +--defsym:att_dispatch_register_client=0x000058f1 +--defsym:att_dispatch_register_server=0x00005905 +--defsym:att_dispatch_server_can_send_now=0x00005919 +--defsym:att_dispatch_server_request_can_send_now_event=0x00005921 +--defsym:att_emit_general_event=0x000059f1 +--defsym:att_server_can_send_packet_now=0x00006135 +--defsym:att_server_get_mtu=0x00006139 +--defsym:att_server_indicate=0x000061ad +--defsym:att_server_init=0x00006231 +--defsym:att_server_notify=0x0000626d +--defsym:att_server_register_packet_handler=0x00006355 +--defsym:att_server_request_can_send_now_event=0x00006361 +--defsym:att_set_db=0x0000637d +--defsym:att_set_read_callback=0x00006391 +--defsym:att_set_write_callback=0x0000639d +--defsym:bd_addr_cmp=0x000064e1 +--defsym:bd_addr_copy=0x000064e7 +--defsym:bd_addr_to_str=0x000064f1 +--defsym:big_endian_read_16=0x00006529 +--defsym:big_endian_read_32=0x00006531 +--defsym:big_endian_store_16=0x00006545 +--defsym:big_endian_store_32=0x00006551 +--defsym:btstack_push_user_msg=0x000067fd +--defsym:char_for_nibble=0x00006a55 +--defsym:gap_add_dev_to_periodic_list=0x000075b9 +--defsym:gap_add_whitelist=0x000075d1 +--defsym:gap_aes_encrypt=0x000075e5 +--defsym:gap_clear_white_lists=0x0000760d +--defsym:gap_clr_adv_set=0x0000761d +--defsym:gap_clr_periodic_adv_list=0x0000762d +--defsym:gap_create_connection_cancel=0x00007689 +--defsym:gap_disconnect=0x00007699 +--defsym:gap_disconnect_all=0x000076c5 +--defsym:gap_ext_create_connection=0x0000776d +--defsym:gap_get_connection_parameter_range=0x00007831 +--defsym:gap_le_read_channel_map=0x00007871 +--defsym:gap_periodic_adv_create_sync=0x00007981 +--defsym:gap_periodic_adv_create_sync_cancel=0x000079a5 +--defsym:gap_periodic_adv_term_sync=0x000079b5 +--defsym:gap_read_periodic_adv_list_size=0x00007a49 +--defsym:gap_read_phy=0x00007a59 +--defsym:gap_read_remote_info=0x00007a6d +--defsym:gap_read_remote_used_features=0x00007a81 +--defsym:gap_read_rssi=0x00007a95 +--defsym:gap_remove_whitelist=0x00007aa9 +--defsym:gap_rmv_adv_set=0x00007b35 +--defsym:gap_rmv_dev_from_periodic_list=0x00007b49 +--defsym:gap_set_adv_set_random_addr=0x00007b89 +--defsym:gap_set_connection_parameter_range=0x00007bd5 +--defsym:gap_set_def_phy=0x00007bed +--defsym:gap_set_ext_adv_data=0x00007c05 +--defsym:gap_set_ext_adv_enable=0x00007c1d +--defsym:gap_set_ext_adv_para=0x00007c99 +--defsym:gap_set_ext_scan_enable=0x00007d79 +--defsym:gap_set_ext_scan_para=0x00007d91 +--defsym:gap_set_ext_scan_response_data=0x00007e39 +--defsym:gap_set_host_channel_classification=0x00007e51 +--defsym:gap_set_periodic_adv_data=0x00007e65 +--defsym:gap_set_periodic_adv_enable=0x00007ed9 +--defsym:gap_set_periodic_adv_para=0x00007eed +--defsym:gap_set_phy=0x00007f05 +--defsym:gap_set_random_device_address=0x00007f21 +--defsym:gap_start_ccm=0x00007f85 +--defsym:gap_update_connection_parameters=0x00007fcd +--defsym:gatt_client_cancel_write=0x000084b5 +--defsym:gatt_client_discover_characteristic_descriptors=0x000084db +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x0000851d +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000856d +--defsym:gatt_client_discover_characteristics_for_service=0x000085bd +--defsym:gatt_client_discover_primary_services=0x000085f3 +--defsym:gatt_client_discover_primary_services_by_uuid128=0x00008625 +--defsym:gatt_client_discover_primary_services_by_uuid16=0x00008669 +--defsym:gatt_client_execute_write=0x000086a5 +--defsym:gatt_client_find_included_services_for_service=0x000086cb +--defsym:gatt_client_get_mtu=0x000086f9 +--defsym:gatt_client_is_ready=0x000087a1 +--defsym:gatt_client_listen_for_characteristic_value_updates=0x000087b7 +--defsym:gatt_client_prepare_write=0x000087db +--defsym:gatt_client_pts_suppress_mtu_exchange=0x00008819 +--defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00008825 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x0000884f +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008855 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008883 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008889 +--defsym:gatt_client_read_multiple_characteristic_values=0x000088b7 +--defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x000088e7 +--defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00008915 +--defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00008961 +--defsym:gatt_client_register_handler=0x000089ad +--defsym:gatt_client_reliable_write_long_value_of_characteristic=0x000089b9 +--defsym:gatt_client_signed_write_without_response=0x00008de5 +--defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00008ea9 +--defsym:gatt_client_write_client_characteristic_configuration=0x00008ee3 +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00008f35 +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008f45 +--defsym:gatt_client_write_long_value_of_characteristic=0x00008f81 +--defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00008f91 +--defsym:gatt_client_write_value_of_characteristic=0x00008fcd +--defsym:gatt_client_write_value_of_characteristic_without_response=0x00009003 +--defsym:hci_add_event_handler=0x0000b29d +--defsym:hci_power_control=0x0000b9e5 +--defsym:hci_register_acl_packet_handler=0x0000bb99 +--defsym:kv_get=0x0000c219 +--defsym:kv_init=0x0000c231 +--defsym:kv_put=0x0000c281 +--defsym:kv_remove=0x0000c2f9 +--defsym:kv_value_modified=0x0000c369 +--defsym:kv_visit=0x0000c36d +--defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c42d +--defsym:l2cap_can_send_packet_now=0x0000c431 +--defsym:l2cap_create_channel=0x0000c5e9 +--defsym:l2cap_disconnect=0x0000c721 +--defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c9c5 +--defsym:l2cap_init=0x0000ce45 +--defsym:l2cap_le_send_flow_control_credit=0x0000ce8d +--defsym:l2cap_max_le_mtu=0x0000d0f1 +--defsym:l2cap_max_mtu=0x0000d0f5 +--defsym:l2cap_next_local_cid=0x0000d0f9 +--defsym:l2cap_next_sig_id=0x0000d109 +--defsym:l2cap_register_fixed_channel=0x0000d1a1 +--defsym:l2cap_register_packet_handler=0x0000d1bd +--defsym:l2cap_register_service=0x0000d1c9 +--defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d2b1 +--defsym:l2cap_request_can_send_now_event=0x0000d2d5 +--defsym:l2cap_request_connection_parameter_update=0x0000d2ef +--defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d321 +--defsym:l2cap_send=0x0000d6e5 +--defsym:l2cap_send_connectionless=0x0000d75d +--defsym:l2cap_send_connectionless3=0x0000d7ed +--defsym:l2cap_send_echo_request=0x0000d885 +--defsym:l2cap_send_signaling_le=0x0000d8e9 +--defsym:l2cap_unregister_service=0x0000d941 +--defsym:ll_hint_on_ce_len=0x0000db25 +--defsym:ll_set_adv_coded_scheme=0x0000de01 +--defsym:ll_set_initiating_coded_scheme=0x0000de31 +--defsym:nibble_for_char=0x0001c60d +--defsym:platform_config=0x0001c6b1 +--defsym:platform_get_heap_status=0x0001c6e5 +--defsym:platform_get_version=0x0001c6fd +--defsym:platform_patch_rf_init_data=0x0001c705 +--defsym:platform_printf=0x0001c721 +--defsym:platform_raise_assertion=0x0001c735 +--defsym:platform_read_persistent_reg=0x0001c749 +--defsym:platform_reset=0x0001c759 +--defsym:platform_set_evt_callback=0x0001c78d +--defsym:platform_set_irq_callback=0x0001c7a1 +--defsym:platform_set_rf_clk_source=0x0001c7d9 +--defsym:platform_set_rf_init_data=0x0001c7e5 +--defsym:platform_set_rf_power_mapping=0x0001c7f1 +--defsym:platform_switch_app=0x0001c7fd +--defsym:platform_write_persistent_reg=0x0001c821 +--defsym:printf_hexdump=0x0001d511 +--defsym:pvPortMalloc=0x0001dfa1 +--defsym:pvTaskIncrementMutexHeldCount=0x0001e089 +--defsym:pvTimerGetTimerID=0x0001e0a1 +--defsym:pxPortInitialiseStack=0x0001e0cd +--defsym:reverse_128=0x0001e275 +--defsym:reverse_24=0x0001e27b +--defsym:reverse_48=0x0001e281 +--defsym:reverse_56=0x0001e287 +--defsym:reverse_64=0x0001e28d +--defsym:reverse_bd_addr=0x0001e293 +--defsym:reverse_bytes=0x0001e299 +--defsym:sm_add_event_handler=0x0001e3f9 +--defsym:sm_address_resolution_lookup=0x0001e525 +--defsym:sm_authenticated=0x0001e5ff +--defsym:sm_authorization_decline=0x0001e60d +--defsym:sm_authorization_grant=0x0001e62d +--defsym:sm_authorization_state=0x0001e64d +--defsym:sm_bonding_decline=0x0001e669 +--defsym:sm_config=0x0001ea41 +--defsym:sm_encryption_key_size=0x0001eb4d +--defsym:sm_just_works_confirm=0x0001f31d +--defsym:sm_le_device_key=0x0001f56d +--defsym:sm_passkey_input=0x0001f605 +--defsym:sm_private_random_address_generation_get=0x0001f991 +--defsym:sm_private_random_address_generation_get_mode=0x0001f999 +--defsym:sm_private_random_address_generation_set_mode=0x0001f9a5 +--defsym:sm_private_random_address_generation_set_update_period=0x0001f9cd +--defsym:sm_register_oob_data_callback=0x0001fa05 +--defsym:sm_request_pairing=0x0001fa11 +--defsym:sm_send_security_request=0x0002044b +--defsym:sm_set_accepted_stk_generation_methods=0x00020471 +--defsym:sm_set_authentication_requirements=0x0002047d +--defsym:sm_set_encryption_key_size_range=0x00020489 +--defsym:sscanf_bd_addr=0x00020785 +--defsym:sysSetPublicDeviceAddr=0x00020811 +--defsym:uuid128_to_str=0x00020b85 +--defsym:uuid_add_bluetooth_prefix=0x00020bdd +--defsym:uuid_has_bluetooth_prefix=0x00020bfd +--defsym:uxQueueMessagesWaiting=0x00020c41 +--defsym:uxQueueMessagesWaitingFromISR=0x00020c69 +--defsym:uxQueueSpacesAvailable=0x00020c85 +--defsym:vPortFree=0x00020db5 +--defsym:vQueueDelete=0x00020e89 +--defsym:vQueueWaitForMessageRestricted=0x00020eb5 +--defsym:vTaskDelay=0x00020efd +--defsym:vTaskInternalSetTimeOutState=0x00020f49 +--defsym:vTaskMissedYield=0x00020f59 +--defsym:vTaskPlaceOnEventList=0x00020f65 +--defsym:vTaskPlaceOnEventListRestricted=0x00020f9d +--defsym:vTaskPriorityDisinheritAfterTimeout=0x00020fdd +--defsym:vTaskStartScheduler=0x00021089 +--defsym:vTaskSuspendAll=0x00021119 +--defsym:vTaskSwitchContext=0x00021129 +--defsym:xPortStartScheduler=0x000211d1 +--defsym:xQueueAddToSet=0x0002128d +--defsym:xQueueCreateCountingSemaphore=0x000212b1 +--defsym:xQueueCreateCountingSemaphoreStatic=0x000212ed +--defsym:xQueueCreateMutex=0x00021331 +--defsym:xQueueCreateMutexStatic=0x00021347 +--defsym:xQueueCreateSet=0x00021361 +--defsym:xQueueGenericCreate=0x00021369 +--defsym:xQueueGenericCreateStatic=0x000213b5 +--defsym:xQueueGenericReset=0x0002141d +--defsym:xQueueGenericSend=0x000214a9 +--defsym:xQueueGenericSendFromISR=0x00021615 +--defsym:xQueueGiveFromISR=0x000216d5 +--defsym:xQueueGiveMutexRecursive=0x00021779 +--defsym:xQueueIsQueueEmptyFromISR=0x000217b9 +--defsym:xQueueIsQueueFullFromISR=0x000217dd +--defsym:xQueuePeek=0x00021805 +--defsym:xQueuePeekFromISR=0x0002192d +--defsym:xQueueReceive=0x00021999 +--defsym:xQueueReceiveFromISR=0x00021ac5 +--defsym:xQueueRemoveFromSet=0x00021b59 +--defsym:xQueueSelectFromSet=0x00021b7b +--defsym:xQueueSelectFromSetFromISR=0x00021b8d +--defsym:xQueueSemaphoreTake=0x00021ba1 +--defsym:xQueueTakeMutexRecursive=0x00021d0d +--defsym:xTaskCheckForTimeOut=0x00021d51 +--defsym:xTaskCreate=0x00021dc1 +--defsym:xTaskCreateStatic=0x00021e1d +--defsym:xTaskGetCurrentTaskHandle=0x00021e8d +--defsym:xTaskGetSchedulerState=0x00021e99 +--defsym:xTaskGetTickCount=0x00021eb5 +--defsym:xTaskIncrementTick=0x00021ec1 +--defsym:xTaskPriorityDisinherit=0x00021f8d +--defsym:xTaskPriorityInherit=0x00022021 +--defsym:xTaskRemoveFromEventList=0x000220b5 +--defsym:xTaskResumeAll=0x00022131 +--defsym:xTimerCreate=0x000221f9 +--defsym:xTimerCreateStatic=0x0002222d +--defsym:xTimerCreateTimerTask=0x00022265 +--defsym:xTimerGenericCommand=0x000222d1 diff --git a/bundles/typical/inc/os/FreeRTOS.nim b/bundles/typical/inc/os/FreeRTOS.nim index 1743fdcc8..ac7cf8ef9 100644 --- a/bundles/typical/inc/os/FreeRTOS.nim +++ b/bundles/typical/inc/os/FreeRTOS.nim @@ -22,17 +22,17 @@ const const - pdFALSE* = (cast[UBaseType_t](0)) - pdTRUE* = (cast[UBaseType_t](1)) + pdFALSE* = (cast[BaseType_t](0)) + pdTRUE* = (cast[BaseType_t](1)) pdPASS* = (pdTRUE) pdFAIL* = (pdFALSE) errQUEUE_EMPTY* = (cast[BaseType_t](0)) errQUEUE_FULL* = (cast[BaseType_t](0)) - portMAX_DELAY* = 0xffffffffu32 + portMAX_DELAY = 0xffffffffu32 template pdMS_TO_TICKS*(xTimeInMs: int32): TickType_t = - cast[TickType_t]((cast[uint32](xTimeInMs) * cast[uint32](configTICK_RATE_HZ)) div 1000) + cast[TickType_t]((xTimeInMs* cast[int32](configTICK_RATE_HZ)) div 1000) type List_t* {.importc: "List_t", header: "FreeRTOSNim.h", bycopy.} = object @@ -75,7 +75,7 @@ type ## type - tmrTimerControl* {.importc: "struct tmrTimerControl", header: "FreeRTOSNim.h", bycopy.} = object + tmrTimerControl* {.importc: "tmrTimerControl", header: "FreeRTOSNim.h", bycopy.} = object ## The old naming convention is used to prevent breaking kernel aware debuggers. @@ -97,6 +97,7 @@ type type QueueHandle_t* = ptr QueueDefinition + SemaphoreHandle_t* = QueueHandle_t ## * ## Type by which queue sets are referenced. For example, a call to @@ -165,9 +166,19 @@ type proc xQueueGenericSend*(xQueue: QueueHandle_t; pvItemToQueue: pointer; xTicksToWait: TickType_t; xCopyPosition: BaseType_t): BaseType_t {. importc: "xQueueGenericSend", header: "FreeRTOSNim.h".} +proc xQueuePeek*(xQueue: QueueHandle_t; pvBuffer: pointer; xTicksToWait: TickType_t): BaseType_t {. + importc: "xQueuePeek", header: "FreeRTOSNim.h".} +proc xQueuePeekFromISR*(xQueue: QueueHandle_t; pvBuffer: pointer): BaseType_t {. + importc: "xQueuePeekFromISR", header: "FreeRTOSNim.h".} proc xQueueReceive*(xQueue: QueueHandle_t; pvBuffer: pointer; xTicksToWait: TickType_t): BaseType_t {. importc: "xQueueReceive", header: "FreeRTOSNim.h".} +proc uxQueueMessagesWaiting*(xQueue: QueueHandle_t): UBaseType_t {. + importc: "uxQueueMessagesWaiting", header: "FreeRTOSNim.h".} +proc uxQueueSpacesAvailable*(xQueue: QueueHandle_t): UBaseType_t {. + importc: "uxQueueSpacesAvailable", header: "FreeRTOSNim.h".} +proc vQueueDelete*(xQueue: QueueHandle_t) {.importc: "vQueueDelete", + header: "FreeRTOSNim.h".} proc xQueueGenericSendFromISR*(xQueue: QueueHandle_t; pvItemToQueue: pointer; pxHigherPriorityTaskWoken: ptr BaseType_t; xCopyPosition: BaseType_t): BaseType_t {. @@ -175,8 +186,31 @@ proc xQueueGenericSendFromISR*(xQueue: QueueHandle_t; pvItemToQueue: pointer; proc xQueueGiveFromISR*(xQueue: QueueHandle_t; pxHigherPriorityTaskWoken: ptr BaseType_t): BaseType_t {. importc: "xQueueGiveFromISR", header: "FreeRTOSNim.h".} +proc xQueueReceiveFromISR*(xQueue: QueueHandle_t; pvBuffer: pointer; + pxHigherPriorityTaskWoken: ptr BaseType_t): BaseType_t {. + importc: "xQueueReceiveFromISR", header: "FreeRTOSNim.h".} +proc xQueueIsQueueEmptyFromISR*(xQueue: QueueHandle_t): BaseType_t {. + importc: "xQueueIsQueueEmptyFromISR", header: "FreeRTOSNim.h".} +proc xQueueIsQueueFullFromISR*(xQueue: QueueHandle_t): BaseType_t {. + importc: "xQueueIsQueueFullFromISR", header: "FreeRTOSNim.h".} +proc uxQueueMessagesWaitingFromISR*(xQueue: QueueHandle_t): UBaseType_t {. + importc: "uxQueueMessagesWaitingFromISR", header: "FreeRTOSNim.h".} +proc xQueueCreateMutex*(ucQueueType: uint8): QueueHandle_t {. + importc: "xQueueCreateMutex", header: "FreeRTOSNim.h".} +proc xQueueCreateMutexStatic*(ucQueueType: uint8; pxStaticQueue: ptr StaticQueue_t): QueueHandle_t {. + importc: "xQueueCreateMutexStatic", header: "FreeRTOSNim.h".} +proc xQueueCreateCountingSemaphore*(uxMaxCount: UBaseType_t; + uxInitialCount: UBaseType_t): QueueHandle_t {. + importc: "xQueueCreateCountingSemaphore", header: "FreeRTOSNim.h".} +proc xQueueCreateCountingSemaphoreStatic*(uxMaxCount: UBaseType_t; + uxInitialCount: UBaseType_t; pxStaticQueue: ptr StaticQueue_t): QueueHandle_t {. + importc: "xQueueCreateCountingSemaphoreStatic", header: "FreeRTOSNim.h".} proc xQueueSemaphoreTake*(xQueue: QueueHandle_t; xTicksToWait: TickType_t): BaseType_t {. importc: "xQueueSemaphoreTake", header: "FreeRTOSNim.h".} +proc xQueueTakeMutexRecursive*(xMutex: QueueHandle_t; xTicksToWait: TickType_t): BaseType_t {. + importc: "xQueueTakeMutexRecursive", header: "FreeRTOSNim.h".} +proc xQueueGiveMutexRecursive*(xMutex: QueueHandle_t): BaseType_t {. + importc: "xQueueGiveMutexRecursive", header: "FreeRTOSNim.h".} proc xQueueGenericCreate*(uxQueueLength: UBaseType_t; uxItemSize: UBaseType_t; ucQueueType: uint8): QueueHandle_t {. importc: "xQueueGenericCreate", header: "FreeRTOSNim.h".} @@ -185,6 +219,18 @@ proc xQueueGenericCreateStatic*(uxQueueLength: UBaseType_t; pucQueueStorage: ptr uint8; pxStaticQueue: ptr StaticQueue_t; ucQueueType: uint8): QueueHandle_t {. importc: "xQueueGenericCreateStatic", header: "FreeRTOSNim.h".} +proc xQueueCreateSet*(uxEventQueueLength: UBaseType_t): QueueSetHandle_t {. + importc: "xQueueCreateSet", header: "FreeRTOSNim.h".} +proc xQueueAddToSet*(xQueueOrSemaphore: QueueSetMemberHandle_t; + xQueueSet: QueueSetHandle_t): BaseType_t {. + importc: "xQueueAddToSet", header: "FreeRTOSNim.h".} +proc xQueueRemoveFromSet*(xQueueOrSemaphore: QueueSetMemberHandle_t; + xQueueSet: QueueSetHandle_t): BaseType_t {. + importc: "xQueueRemoveFromSet", header: "FreeRTOSNim.h".} +proc xQueueSelectFromSet*(xQueueSet: QueueSetHandle_t; xTicksToWait: TickType_t): QueueSetMemberHandle_t {. + importc: "xQueueSelectFromSet", header: "FreeRTOSNim.h".} +proc xQueueSelectFromSetFromISR*(xQueueSet: QueueSetHandle_t): QueueSetMemberHandle_t {. + importc: "xQueueSelectFromSetFromISR", header: "FreeRTOSNim.h".} proc vQueueWaitForMessageRestricted*(xQueue: QueueHandle_t; xTicksToWait: TickType_t; xWaitIndefinitely: BaseType_t) {. @@ -222,6 +268,8 @@ proc vTaskPlaceOnEventListRestricted*(pxEventList: ptr List_t; proc xTaskRemoveFromEventList*(pxEventList: ptr List_t): BaseType_t {. importc: "xTaskRemoveFromEventList", header: "FreeRTOSNim.h".} proc vTaskSwitchContext*() {.importc: "vTaskSwitchContext", header: "FreeRTOSNim.h".} +proc xTaskGetCurrentTaskHandle*(): TaskHandle_t {. + importc: "xTaskGetCurrentTaskHandle", header: "FreeRTOSNim.h".} proc xTaskCheckForTimeOut*(pxTimeOut: ptr TimeOut_t; pxTicksToWait: ptr TickType_t): BaseType_t {. importc: "xTaskCheckForTimeOut", header: "FreeRTOSNim.h".} proc vTaskMissedYield*() {.importc: "vTaskMissedYield", header: "FreeRTOSNim.h".} @@ -234,10 +282,6 @@ proc xTaskPriorityDisinherit*(pxMutexHolder: TaskHandle_t): BaseType_t {. proc vTaskPriorityDisinheritAfterTimeout*(pxMutexHolder: TaskHandle_t; uxHighestPriorityWaitingTask: UBaseType_t) {. importc: "vTaskPriorityDisinheritAfterTimeout", header: "FreeRTOSNim.h".} -proc vTaskStepTick*(xTicksToJump: TickType_t) {.importc: "vTaskStepTick", - header: "FreeRTOSNim.h".} -proc eTaskConfirmSleepModeStatus*(): eSleepModeStatus {. - importc: "eTaskConfirmSleepModeStatus", header: "FreeRTOSNim.h".} proc pvTaskIncrementMutexHeldCount*(): TaskHandle_t {. importc: "pvTaskIncrementMutexHeldCount", header: "FreeRTOSNim.h".} proc vTaskInternalSetTimeOutState*(pxTimeOut: ptr TimeOut_t) {. @@ -269,14 +313,4 @@ proc pvPortMalloc*(xSize: csize): pointer {.importc: "pvPortMalloc", header: "FreeRTOSNim.h".} proc vPortFree*(pv: pointer) {.importc: "vPortFree", header: "FreeRTOSNim.h".} proc xPortStartScheduler*(): BaseType_t {.importc: "xPortStartScheduler", - header: "FreeRTOSNim.h".} - -const tmrCOMMAND_START = cast[BaseType_t](1) -const tmrCOMMAND_RESET = cast[BaseType_t](2) -const tmrCOMMAND_STOP = cast[BaseType_t](3) - -template xTimerReset*(xTimer: TimerHandle_t, xTicksToWait: uint32): BaseType_t = - xTimerGenericCommand(xTimer, tmrCOMMAND_RESET, xTaskGetTickCount(), nil, xTicksToWait) - -template xTimerStop*(xTimer: TimerHandle_t, xTicksToWait: uint32): BaseType_t = - xTimerGenericCommand(xTimer, tmrCOMMAND_STOP, 0, nil, xTicksToWait) \ No newline at end of file + header: "FreeRTOSNim.h".} \ No newline at end of file diff --git a/bundles/typical/inc/os/semphr.h~RF5787eac.TMP b/bundles/typical/inc/os/semphr.h~RF5787eac.TMP deleted file mode 100644 index 2c106eac0..000000000 --- a/bundles/typical/inc/os/semphr.h~RF5787eac.TMP +++ /dev/null @@ -1,1140 +0,0 @@ -/* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef SEMAPHORE_H -#define SEMAPHORE_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include semphr.h" -#endif - -#include "queue.h" - -typedef QueueHandle_t SemaphoreHandle_t; - -#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) -#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) -#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) - - -/** - * semphr. h - *
vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
- * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the - * xSemaphoreCreateBinary() function. Note that binary semaphores created using - * the vSemaphoreCreateBinary() macro are created in a state such that the - * first call to 'take' the semaphore would pass, whereas binary semaphores - * created using xSemaphoreCreateBinary() are created in a state such that the - * the semaphore must first be 'given' before it can be 'taken'. - * - * Macro that implements a semaphore by using the existing queue mechanism. - * The queue length is 1 as this is a binary semaphore. The data size is 0 - * as we don't want to actually store any data - we just want to know if the - * queue is empty or full. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
-    // This is a macro so pass the variable in directly.
-    vSemaphoreCreateBinary( xSemaphore );
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define vSemaphoreCreateBinary( xSemaphore ) \ - { \ - ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ - if( ( xSemaphore ) != NULL ) \ - { \ - ( void ) xSemaphoreGive( ( xSemaphore ) ); \ - } \ - } -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateBinary( void )
- * - * Creates a new binary semaphore instance, and returns a handle by which the - * new semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, binary semaphores use a block - * of memory, in which the semaphore structure is stored. If a binary semaphore - * is created using xSemaphoreCreateBinary() then the required memory is - * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore - * is created using xSemaphoreCreateBinaryStatic() then the application writer - * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a - * binary semaphore to be created without using any dynamic memory allocation. - * - * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this - * xSemaphoreCreateBinary() function. Note that binary semaphores created using - * the vSemaphoreCreateBinary() macro are created in a state such that the - * first call to 'take' the semaphore would pass, whereas binary semaphores - * created using xSemaphoreCreateBinary() are created in a state such that the - * the semaphore must first be 'given' before it can be 'taken'. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @return Handle to the created semaphore, or NULL if the memory required to - * hold the semaphore's data structures could not be allocated. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateBinary();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
- * - * Creates a new binary semaphore instance, and returns a handle by which the - * new semaphore can be referenced. - * - * NOTE: In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, binary semaphores use a block - * of memory, in which the semaphore structure is stored. If a binary semaphore - * is created using xSemaphoreCreateBinary() then the required memory is - * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore - * is created using xSemaphoreCreateBinaryStatic() then the application writer - * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a - * binary semaphore to be created without using any dynamic memory allocation. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the semaphore's data structure, removing the - * need for the memory to be allocated dynamically. - * - * @return If the semaphore is created then a handle to the created semaphore is - * returned. If pxSemaphoreBuffer is NULL then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
- StaticSemaphore_t xSemaphoreBuffer;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
-    // The semaphore's data structures will be placed in the xSemaphoreBuffer
-    // variable, the address of which is passed into the function.  The
-    // function's parameter is not NULL, so the function will not attempt any
-    // dynamic memory allocation, and therefore the function will not return
-    // return NULL.
-    xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
-
-    // Rest of task code goes here.
- }
- 
- * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic - * \ingroup Semaphores - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
xSemaphoreTake(
- *                   SemaphoreHandle_t xSemaphore,
- *                   TickType_t xBlockTime
- *               )
- * - * Macro to obtain a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). - * - * @param xSemaphore A handle to the semaphore being taken - obtained when - * the semaphore was created. - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_PERIOD_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. A block - * time of portMAX_DELAY can be used to block indefinitely (provided - * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). - * - * @return pdTRUE if the semaphore was obtained. pdFALSE - * if xBlockTime expired without the semaphore becoming available. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- // A task that creates a semaphore.
- void vATask( void * pvParameters )
- {
-    // Create the semaphore to guard a shared resource.
-    xSemaphore = xSemaphoreCreateBinary();
- }
-
- // A task that uses the semaphore.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xSemaphore != NULL )
-    {
-        // See if we can obtain the semaphore.  If the semaphore is not available
-        // wait 10 ticks to see if it becomes free.
-        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the semaphore and can now access the
-            // shared resource.
-
-            // ...
-
-            // We have finished accessing the shared resource.  Release the
-            // semaphore.
-            xSemaphoreGive( xSemaphore );
-        }
-        else
-        {
-            // We could not obtain the semaphore and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreTake xSemaphoreTake - * \ingroup Semaphores - */ -#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) - -/** - * semphr. h - * xSemaphoreTakeRecursive( - * SemaphoreHandle_t xMutex, - * TickType_t xBlockTime - * ) - * - * Macro to recursively obtain, or 'take', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being obtained. This is the - * handle returned by xSemaphoreCreateRecursiveMutex(); - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_PERIOD_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. If - * the task already owns the semaphore then xSemaphoreTakeRecursive() will - * return immediately no matter what the value of xBlockTime. - * - * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime - * expired without the semaphore becoming available. - * - * Example usage: -
- SemaphoreHandle_t xMutex = NULL;
-
- // A task that creates a mutex.
- void vATask( void * pvParameters )
- {
-    // Create the mutex to guard a shared resource.
-    xMutex = xSemaphoreCreateRecursiveMutex();
- }
-
- // A task that uses the mutex.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xMutex != NULL )
-    {
-        // See if we can obtain the mutex.  If the mutex is not available
-        // wait 10 ticks to see if it becomes free.
-        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the mutex and can now access the
-            // shared resource.
-
-            // ...
-            // For some reason due to the nature of the code further calls to
-            // xSemaphoreTakeRecursive() are made on the same mutex.  In real
-            // code these would not be just sequential calls as this would make
-            // no sense.  Instead the calls are likely to be buried inside
-            // a more complex call structure.
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-
-            // The mutex has now been 'taken' three times, so will not be
-            // available to another task until it has also been given back
-            // three times.  Again it is unlikely that real code would have
-            // these calls sequentially, but instead buried in a more complex
-            // call structure.  This is just for illustrative purposes.
-            xSemaphoreGiveRecursive( xMutex );
-            xSemaphoreGiveRecursive( xMutex );
-            xSemaphoreGiveRecursive( xMutex );
-
-            // Now the mutex can be taken by other tasks.
-        }
-        else
-        {
-            // We could not obtain the mutex and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive - * \ingroup Semaphores - */ -#if( configUSE_RECURSIVE_MUTEXES == 1 ) - #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) -#endif - -/** - * semphr. h - *
xSemaphoreGive( SemaphoreHandle_t xSemaphore )
- * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). - * - * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for - * an alternative which can be used from an ISR. - * - * This macro must also not be used on semaphores created using - * xSemaphoreCreateRecursiveMutex(). - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. - * Semaphores are implemented using queues. An error can occur if there is - * no space on the queue to post a message - indicating that the - * semaphore was not first obtained correctly. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore = NULL;
-
- void vATask( void * pvParameters )
- {
-    // Create the semaphore to guard a shared resource.
-    xSemaphore = vSemaphoreCreateBinary();
-
-    if( xSemaphore != NULL )
-    {
-        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
-        {
-            // We would expect this call to fail because we cannot give
-            // a semaphore without first "taking" it!
-        }
-
-        // Obtain the semaphore - don't block if the semaphore is not
-        // immediately available.
-        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
-        {
-            // We now have the semaphore and can access the shared resource.
-
-            // ...
-
-            // We have finished accessing the shared resource so can free the
-            // semaphore.
-            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
-            {
-                // We would not expect this call to fail because we must have
-                // obtained the semaphore to get here.
-            }
-        }
-    }
- }
- 
- * \defgroup xSemaphoreGive xSemaphoreGive - * \ingroup Semaphores - */ -#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) - -/** - * semphr. h - *
xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
- * - * Macro to recursively release, or 'give', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being released, or 'given'. This is the - * handle returned by xSemaphoreCreateMutex(); - * - * @return pdTRUE if the semaphore was given. - * - * Example usage: -
- SemaphoreHandle_t xMutex = NULL;
-
- // A task that creates a mutex.
- void vATask( void * pvParameters )
- {
-    // Create the mutex to guard a shared resource.
-    xMutex = xSemaphoreCreateRecursiveMutex();
- }
-
- // A task that uses the mutex.
- void vAnotherTask( void * pvParameters )
- {
-    // ... Do other things.
-
-    if( xMutex != NULL )
-    {
-        // See if we can obtain the mutex.  If the mutex is not available
-        // wait 10 ticks to see if it becomes free.
-        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
-        {
-            // We were able to obtain the mutex and can now access the
-            // shared resource.
-
-            // ...
-            // For some reason due to the nature of the code further calls to
-			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
-			// code these would not be just sequential calls as this would make
-			// no sense.  Instead the calls are likely to be buried inside
-			// a more complex call structure.
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
-
-            // The mutex has now been 'taken' three times, so will not be
-			// available to another task until it has also been given back
-			// three times.  Again it is unlikely that real code would have
-			// these calls sequentially, it would be more likely that the calls
-			// to xSemaphoreGiveRecursive() would be called as a call stack
-			// unwound.  This is just for demonstrative purposes.
-            xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-			xSemaphoreGiveRecursive( xMutex );
-
-			// Now the mutex can be taken by other tasks.
-        }
-        else
-        {
-            // We could not obtain the mutex and can therefore not access
-            // the shared resource safely.
-        }
-    }
- }
- 
- * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive - * \ingroup Semaphores - */ -#if( configUSE_RECURSIVE_MUTEXES == 1 ) - #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) -#endif - -/** - * semphr. h - *
- xSemaphoreGiveFromISR(
-                          SemaphoreHandle_t xSemaphore,
-                          BaseType_t *pxHigherPriorityTaskWoken
-                      )
- * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). - * - * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) - * must not be used with this macro. - * - * This macro can be used from an ISR. - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. - * - * Example usage: -
- \#define LONG_TIME 0xffff
- \#define TICKS_TO_WAIT	10
- SemaphoreHandle_t xSemaphore = NULL;
-
- // Repetitive task.
- void vATask( void * pvParameters )
- {
-    for( ;; )
-    {
-        // We want this task to run every 10 ticks of a timer.  The semaphore
-        // was created before this task was started.
-
-        // Block waiting for the semaphore to become available.
-        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
-        {
-            // It is time to execute.
-
-            // ...
-
-            // We have finished our task.  Return to the top of the loop where
-            // we will block on the semaphore until it is time to execute
-            // again.  Note when using the semaphore for synchronisation with an
-			// ISR in this manner there is no need to 'give' the semaphore back.
-        }
-    }
- }
-
- // Timer ISR
- void vTimerISR( void * pvParameters )
- {
- static uint8_t ucLocalTickCount = 0;
- static BaseType_t xHigherPriorityTaskWoken;
-
-    // A timer tick has occurred.
-
-    // ... Do other time functions.
-
-    // Is it time for vATask () to run?
-	xHigherPriorityTaskWoken = pdFALSE;
-    ucLocalTickCount++;
-    if( ucLocalTickCount >= TICKS_TO_WAIT )
-    {
-        // Unblock the task by releasing the semaphore.
-        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
-
-        // Reset the count so we release the semaphore again in 10 ticks time.
-        ucLocalTickCount = 0;
-    }
-
-    if( xHigherPriorityTaskWoken != pdFALSE )
-    {
-        // We can force a context switch here.  Context switching from an
-        // ISR uses port specific syntax.  Check the demo task for your port
-        // to find the syntax required.
-    }
- }
- 
- * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR - * \ingroup Semaphores - */ -#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) - -/** - * semphr. h - *
- xSemaphoreTakeFromISR(
-                          SemaphoreHandle_t xSemaphore,
-                          BaseType_t *pxHigherPriorityTaskWoken
-                      )
- * - * Macro to take a semaphore from an ISR. The semaphore must have - * previously been created with a call to xSemaphoreCreateBinary() or - * xSemaphoreCreateCounting(). - * - * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) - * must not be used with this macro. - * - * This macro can be used from an ISR, however taking a semaphore from an ISR - * is not a common operation. It is likely to only be useful when taking a - * counting semaphore when an interrupt is obtaining an object from a resource - * pool (when the semaphore count indicates the number of resources available). - * - * @param xSemaphore A handle to the semaphore being taken. This is the - * handle returned when the semaphore was created. - * - * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the semaphore was successfully taken, otherwise - * pdFALSE - */ -#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateMutex( void )
- * - * Creates a new mutex type semaphore instance, and returns a handle by which - * the new mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, mutex semaphores use a block - * of memory, in which the mutex structure is stored. If a mutex is created - * using xSemaphoreCreateMutex() then the required memory is automatically - * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using - * xSemaphoreCreateMutexStatic() then the application writer must provided the - * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created - * without using any dynamic memory allocation. - * - * Mutexes created using this function can be accessed using the xSemaphoreTake() - * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and - * xSemaphoreGiveRecursive() macros must not be used. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return If the mutex was successfully created then a handle to the created - * semaphore is returned. If there was not enough heap to allocate the mutex - * data structures then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateMutex();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer )
- * - * Creates a new mutex type semaphore instance, and returns a handle by which - * the new mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, mutex semaphores use a block - * of memory, in which the mutex structure is stored. If a mutex is created - * using xSemaphoreCreateMutex() then the required memory is automatically - * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using - * xSemaphoreCreateMutexStatic() then the application writer must provided the - * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created - * without using any dynamic memory allocation. - * - * Mutexes created using this function can be accessed using the xSemaphoreTake() - * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and - * xSemaphoreGiveRecursive() macros must not be used. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, - * which will be used to hold the mutex's data structure, removing the need for - * the memory to be allocated dynamically. - * - * @return If the mutex was successfully created then a handle to the created - * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
- StaticSemaphore_t xMutexBuffer;
-
- void vATask( void * pvParameters )
- {
-    // A mutex cannot be used before it has been created.  xMutexBuffer is
-    // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
-    // attempted.
-    xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
-
-    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
-    // so there is no need to check it.
- }
- 
- * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic - * \ingroup Semaphores - */ - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
- * - * Creates a new recursive mutex type semaphore instance, and returns a handle - * by which the new recursive mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, recursive mutexs use a block - * of memory, in which the mutex structure is stored. If a recursive mutex is - * created using xSemaphoreCreateRecursiveMutex() then the required memory is - * automatically dynamically allocated inside the - * xSemaphoreCreateRecursiveMutex() function. (see - * http://www.freertos.org/a00111.html). If a recursive mutex is created using - * xSemaphoreCreateRecursiveMutexStatic() then the application writer must - * provide the memory that will get used by the mutex. - * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to - * be created without using any dynamic memory allocation. - * - * Mutexes created using this macro can be accessed using the - * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The - * xSemaphoreTake() and xSemaphoreGive() macros must not be used. - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return xSemaphore Handle to the created mutex semaphore. Should be of type - * SemaphoreHandle_t. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
-
- void vATask( void * pvParameters )
- {
-    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
-    // This is a macro so pass the variable in directly.
-    xSemaphore = xSemaphoreCreateRecursiveMutex();
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex - * \ingroup Semaphores - */ -#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer )
- * - * Creates a new recursive mutex type semaphore instance, and returns a handle - * by which the new recursive mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, recursive mutexs use a block - * of memory, in which the mutex structure is stored. If a recursive mutex is - * created using xSemaphoreCreateRecursiveMutex() then the required memory is - * automatically dynamically allocated inside the - * xSemaphoreCreateRecursiveMutex() function. (see - * http://www.freertos.org/a00111.html). If a recursive mutex is created using - * xSemaphoreCreateRecursiveMutexStatic() then the application writer must - * provide the memory that will get used by the mutex. - * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to - * be created without using any dynamic memory allocation. - * - * Mutexes created using this macro can be accessed using the - * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The - * xSemaphoreTake() and xSemaphoreGive() macros must not be used. - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the recursive mutex's data structure, - * removing the need for the memory to be allocated dynamically. - * - * @return If the recursive mutex was successfully created then a handle to the - * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is - * returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
- StaticSemaphore_t xMutexBuffer;
-
- void vATask( void * pvParameters )
- {
-    // A recursive semaphore cannot be used before it is created.  Here a
-    // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
-    // The address of xMutexBuffer is passed into the function, and will hold
-    // the mutexes data structures - so no dynamic memory allocation will be
-    // attempted.
-    xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
-
-    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
-    // so there is no need to check it.
- }
- 
- * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic - * \ingroup Semaphores - */ -#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
- * - * Creates a new counting semaphore instance, and returns a handle by which the - * new counting semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, counting semaphores use a - * block of memory, in which the counting semaphore structure is stored. If a - * counting semaphore is created using xSemaphoreCreateCounting() then the - * required memory is automatically dynamically allocated inside the - * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created - * using xSemaphoreCreateCountingStatic() then the application writer can - * instead optionally provide the memory that will get used by the counting - * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting - * semaphore to be created without using any dynamic memory allocation. - * - * Counting semaphores are typically used for two things: - * - * 1) Counting events. - * - * In this usage scenario an event handler will 'give' a semaphore each time - * an event occurs (incrementing the semaphore count value), and a handler - * task will 'take' a semaphore each time it processes an event - * (decrementing the semaphore count value). The count value is therefore - * the difference between the number of events that have occurred and the - * number that have been processed. In this case it is desirable for the - * initial count value to be zero. - * - * 2) Resource management. - * - * In this usage scenario the count value indicates the number of resources - * available. To obtain control of a resource a task must first obtain a - * semaphore - decrementing the semaphore count value. When the count value - * reaches zero there are no free resources. When a task finishes with the - * resource it 'gives' the semaphore back - incrementing the semaphore count - * value. In this case it is desirable for the initial count value to be - * equal to the maximum count value, indicating that all resources are free. - * - * @param uxMaxCount The maximum count value that can be reached. When the - * semaphore reaches this value it can no longer be 'given'. - * - * @param uxInitialCount The count value assigned to the semaphore when it is - * created. - * - * @return Handle to the created semaphore. Null if the semaphore could not be - * created. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
-
- void vATask( void * pvParameters )
- {
- SemaphoreHandle_t xSemaphore = NULL;
-
-    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
-    // The max value to which the semaphore can count should be 10, and the
-    // initial value assigned to the count should be 0.
-    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
-
-    if( xSemaphore != NULL )
-    {
-        // The semaphore was created successfully.
-        // The semaphore can now be used.
-    }
- }
- 
- * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) -#endif - -/** - * semphr. h - *
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer )
- * - * Creates a new counting semaphore instance, and returns a handle by which the - * new counting semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, counting semaphores use a - * block of memory, in which the counting semaphore structure is stored. If a - * counting semaphore is created using xSemaphoreCreateCounting() then the - * required memory is automatically dynamically allocated inside the - * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created - * using xSemaphoreCreateCountingStatic() then the application writer must - * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a - * counting semaphore to be created without using any dynamic memory allocation. - * - * Counting semaphores are typically used for two things: - * - * 1) Counting events. - * - * In this usage scenario an event handler will 'give' a semaphore each time - * an event occurs (incrementing the semaphore count value), and a handler - * task will 'take' a semaphore each time it processes an event - * (decrementing the semaphore count value). The count value is therefore - * the difference between the number of events that have occurred and the - * number that have been processed. In this case it is desirable for the - * initial count value to be zero. - * - * 2) Resource management. - * - * In this usage scenario the count value indicates the number of resources - * available. To obtain control of a resource a task must first obtain a - * semaphore - decrementing the semaphore count value. When the count value - * reaches zero there are no free resources. When a task finishes with the - * resource it 'gives' the semaphore back - incrementing the semaphore count - * value. In this case it is desirable for the initial count value to be - * equal to the maximum count value, indicating that all resources are free. - * - * @param uxMaxCount The maximum count value that can be reached. When the - * semaphore reaches this value it can no longer be 'given'. - * - * @param uxInitialCount The count value assigned to the semaphore when it is - * created. - * - * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the semaphore's data structure, removing the - * need for the memory to be allocated dynamically. - * - * @return If the counting semaphore was successfully created then a handle to - * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL - * then NULL is returned. - * - * Example usage: -
- SemaphoreHandle_t xSemaphore;
- StaticSemaphore_t xSemaphoreBuffer;
-
- void vATask( void * pvParameters )
- {
- SemaphoreHandle_t xSemaphore = NULL;
-
-    // Counting semaphore cannot be used before they have been created.  Create
-    // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
-    // value to which the semaphore can count is 10, and the initial value
-    // assigned to the count will be 0.  The address of xSemaphoreBuffer is
-    // passed in and will be used to hold the semaphore structure, so no dynamic
-    // memory allocation will be used.
-    xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
-
-    // No memory allocation was attempted so xSemaphore cannot be NULL, so there
-    // is no need to check its value.
- }
- 
- * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic - * \ingroup Semaphores - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
- * - * Delete a semaphore. This function must be used with care. For example, - * do not delete a mutex type semaphore if the mutex is held by a task. - * - * @param xSemaphore A handle to the semaphore to be deleted. - * - * \defgroup vSemaphoreDelete vSemaphoreDelete - * \ingroup Semaphores - */ -#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) - -/** - * semphr.h - *
TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
- * - * If xMutex is indeed a mutex type semaphore, return the current mutex holder. - * If xMutex is not a mutex type semaphore, or the mutex is available (not held - * by a task), return NULL. - * - * Note: This is a good way of determining if the calling task is the mutex - * holder, but not a good way of determining the identity of the mutex holder as - * the holder may change between the function exiting and the returned value - * being tested. - */ -#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) - -/** - * semphr.h - *
TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );
- * - * If xMutex is indeed a mutex type semaphore, return the current mutex holder. - * If xMutex is not a mutex type semaphore, or the mutex is available (not held - * by a task), return NULL. - * - */ -#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) - -/** - * semphr.h - *
UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
- * - * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns - * its current count value. If the semaphore is a binary semaphore then - * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the - * semaphore is not available. - * - */ -#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) - -#endif /* SEMAPHORE_H */ - - diff --git a/bundles/typical/inc/os/task.h b/bundles/typical/inc/os/task.h index c1a941879..c026453c2 100644 --- a/bundles/typical/inc/os/task.h +++ b/bundles/typical/inc/os/task.h @@ -2455,7 +2455,9 @@ void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBas * to date with the actual execution time by being skipped forward by a time * equal to the idle period. */ -void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; +// void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; +// WARNING: ^^^ this API is not available in this release + /* * Only available when configUSE_TICKLESS_IDLE is set to 1. @@ -2471,7 +2473,9 @@ void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; * critical section between the timer being stopped and the sleep mode being * entered to ensure it is ok to proceed into the sleep mode. */ -eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; +// eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; +// WARNING: ^^^ this API is not available in this release + /* * For internal use only. Increment the mutex held count when a mutex is diff --git a/bundles/typical/inc/platform_api.h b/bundles/typical/inc/platform_api.h index c656c6d6d..8026de943 100644 --- a/bundles/typical/inc/platform_api.h +++ b/bundles/typical/inc/platform_api.h @@ -202,6 +202,26 @@ void platform_reset(void); */ void platform_switch_app(const uint32_t app_addr); +/** + **************************************************************************************** + * @brief Write value to the persistent register, of which the value is kept even + * in power saving mode. + * + * @param[in] value a FOUR bit value + **************************************************************************************** + */ +void platform_write_persistent_reg(const uint8_t value); + +/** + **************************************************************************************** + * @brief Read value from the persistent register, of which the value is kept even + * in power saving mode. + * + * @return value that has been written. (Initial value: 0) + **************************************************************************************** + */ +uint8_t platform_read_persistent_reg(void); + typedef enum { PLATFORM_CFG_LOG_HCI, // flag is ENABLE or DISABLE. default: DISABLE @@ -234,7 +254,9 @@ void platform_config(const platform_cfg_item_t item, const uint32_t flag); * @param[in] data_size Size of the data to be retentioned **************************************************************************************** */ -void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); +// void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); +// WARNING: ^^^ this API is not available in this release + /** **************************************************************************************** @@ -270,6 +292,15 @@ void platform_set_rf_init_data(const uint32_t *rf_init_data); void platform_set_rf_power_mapping(const int16_t *rf_power_mapping); +/** + **************************************************************************************** + * @brief Patch RF initialization data + * + * @param[in] data patch data + **************************************************************************************** + */ +void platform_patch_rf_init_data(const void *data); + typedef enum coded_scheme_e { BLE_CODED_S8, diff --git a/bundles/typical/inc/platform_api.nim b/bundles/typical/inc/platform_api.nim index 0d8e1e9fc..cbbdeed82 100644 --- a/bundles/typical/inc/platform_api.nim +++ b/bundles/typical/inc/platform_api.nim @@ -166,6 +166,28 @@ proc platform_reset*() {.importc: "platform_reset", header: "platform_api.h".} proc platform_switch_app*(app_addr: uint32) {.importc: "platform_switch_app", header: "platform_api.h".} +## * +## *************************************************************************************** +## @brief Write value to the persistent register, of which the value is kept even +## in power saving mode. +## +## @param[in] value a FOUR bit value +## *************************************************************************************** +## + +proc platform_write_persistent_reg*(value: uint8) {. + importc: "platform_write_persistent_reg", header: "platform_api.h".} +## * +## *************************************************************************************** +## @brief Read value from the persistent register, of which the value is kept even +## in power saving mode. +## +## @return value that has been written. (Initial value: 0) +## *************************************************************************************** +## + +proc platform_read_persistent_reg*(): uint8 {. + importc: "platform_read_persistent_reg", header: "platform_api.h".} type platform_cfg_item_t* {.size: sizeof(cint).} = enum PLATFORM_CFG_LOG_HCI, ## flag is ENABLE or DISABLE. default: DISABLE @@ -200,10 +222,8 @@ proc platform_config*(item: platform_cfg_item_t; flag: uint32) {. ## @param[in] data_size Size of the data to be retentioned ## *************************************************************************************** ## - -proc platform_shutdown*(duration_cycles: uint32; p_retention_data: pointer; - data_size: uint32) {.importc: "platform_shutdown", - header: "platform_api.h".} +## void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); +## WARNING: ^^^ this API is not available in this release ## * ## *************************************************************************************** ## @brief generate random bytes by using true hardware random-number generator @@ -239,6 +259,16 @@ proc platform_set_rf_init_data*(rf_init_data: ptr uint32) {. importc: "platform_set_rf_init_data", header: "platform_api.h".} proc platform_set_rf_power_mapping*(rf_power_mapping: ptr int16) {. importc: "platform_set_rf_power_mapping", header: "platform_api.h".} +## * +## *************************************************************************************** +## @brief Patch RF initialization data +## +## @param[in] data patch data +## *************************************************************************************** +## + +proc platform_patch_rf_init_data*(data: pointer) {. + importc: "platform_patch_rf_init_data", header: "platform_api.h".} type coded_scheme_t* {.size: sizeof(cint).} = enum BLE_CODED_S8, BLE_CODED_S2 diff --git a/examples-gcc/peripheral_ibeacon/Makefile b/examples-gcc/peripheral_ibeacon/Makefile index 178abd495..b7ecf2080 100644 --- a/examples-gcc/peripheral_ibeacon/Makefile +++ b/examples-gcc/peripheral_ibeacon/Makefile @@ -6,6 +6,6 @@ APPNAME=peripheral_ibeacon PROJECT_FILES=src/main.c ../../examples/${APPNAME}/src/profile.c ${ING_REL}/src/FWlib/peripheral_uart.c -SYMDEFS=-Wl,--just-symbols=../../bundles/typical/ING9188xx/symdefs.g +SYMDEFS=-Wl,--just-symbols=../../bundles/typical/symdefs.g include makefile.conf diff --git a/examples-gcc/peripheral_ibeacon/flash_download.ini b/examples-gcc/peripheral_ibeacon/flash_download.ini index 0b44ba30e..035630687 100644 --- a/examples-gcc/peripheral_ibeacon/flash_download.ini +++ b/examples-gcc/peripheral_ibeacon/flash_download.ini @@ -14,7 +14,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw index dac990d92..d73d3ce9c 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,288 +1,60 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:/Program Files(2)/gcc-arm-none-eabi-8-2018-q4-major-win32/bin", - "ide_ver": "", - "ide_exe": "C:/Program Files(2)/gcc-arm-none-eabi-8-2018-q4-major-win32/bin/arm-none-eabi-gcc.exe", - "ota": false, - "ide": "gcc", - "git": false, - "gcc": true, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_ibeacon", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "0\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples-gcc\\peripheral_ibeacon", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "cmsis": "C:/projects/ingWizard/CMSIS", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\/Program Files(2)\/gcc-arm-none-eabi-8-2018-q4-major-win32\/bin", + "ide_ver": "", + "ide_exe": "C:\/Program Files(2)\/gcc-arm-none-eabi-8-2018-q4-major-win32\/bin\/arm-none-eabi-gcc.exe", + "ota": false, + "ide": "gcc", + "git": false, + "gcc": true, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_ibeacon", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "0\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples-gcc\\peripheral_ibeacon", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "cmsis": "C:\/projects\/ingWizard\/CMSIS", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld index 94a2c3f46..c4cd1e14b 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910768, LENGTH = 25680 + RAM (rwx) : ORIGIN = 536910736, LENGTH = 25712 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-iar/peripheral_ibeacon/flash_download.ini b/examples-iar/peripheral_ibeacon/flash_download.ini index a96a3c927..70705f09d 100644 --- a/examples-iar/peripheral_ibeacon/flash_download.ini +++ b/examples-iar/peripheral_ibeacon/flash_download.ini @@ -14,7 +14,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index 4676a1ce6..906ceee95 100644 --- a/examples-iar/peripheral_ibeacon/generic_cortex.icf +++ b/examples-iar/peripheral_ibeacon/generic_cortex.icf @@ -2,9 +2,9 @@ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ /*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 155648; +define symbol __ICFEDIT_intvec_start__ = 155648; /*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 155648; +define symbol __ICFEDIT_region_IROM1_start__ = 155648; define symbol __ICFEDIT_region_IROM1_end__ = 0x00084000; define symbol __ICFEDIT_region_IROM2_start__ = 0x0; define symbol __ICFEDIT_region_IROM2_end__ = 0x0; @@ -14,7 +14,7 @@ define symbol __ICFEDIT_region_EROM2_start__ = 0x0; define symbol __ICFEDIT_region_EROM2_end__ = 0x0; define symbol __ICFEDIT_region_EROM3_start__ = 0x0; define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 536910768; +define symbol __ICFEDIT_region_IRAM1_start__ = 536910736; define symbol __ICFEDIT_region_IRAM1_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; diff --git a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw index ce25ec29c..77fa39c2c 100644 --- a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,288 +1,60 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.2/common/bin", - "ide_ver": "", - "ide_exe": "C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.2/common/bin/IarIdePm.exe", - "ota": false, - "ide": "iar", - "iar": true, - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_ibeacon", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "0\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples-iar\\peripheral_ibeacon", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\/Program Files (x86)\/IAR Systems\/Embedded Workbench 8.2\/common\/bin", + "ide_ver": "", + "ide_exe": "C:\/Program Files (x86)\/IAR Systems\/Embedded Workbench 8.2\/common\/bin\/IarIdePm.exe", + "ota": false, + "ide": "iar", + "iar": true, + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_ibeacon", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "0\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples-iar\\peripheral_ibeacon", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples-nim/peripheral_battery/Makefile b/examples-nim/peripheral_battery/Makefile index 97866e7a2..b5ebc9ab9 100644 --- a/examples-nim/peripheral_battery/Makefile +++ b/examples-nim/peripheral_battery/Makefile @@ -1,7 +1,7 @@ CMSIS_INC=${CMSIS_BASE}/Include ING_REL=../.. ING_BUNDLE=../../bundles/typical/inc -SYMDEFS=-Wl,--just-symbols=../../bundles/typical/ING9188xx/symdefs.g +SYMDEFS=-Wl,--just-symbols=../../bundles/typical/symdefs.g APPNAME=peripheral_battery diff --git a/examples-nim/peripheral_battery/flash_download.ini b/examples-nim/peripheral_battery/flash_download.ini index 5f52aee4e..fa7d3f282 100644 --- a/examples-nim/peripheral_battery/flash_download.ini +++ b/examples-nim/peripheral_battery/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples-nim/peripheral_battery/peripheral_battery.ingw b/examples-nim/peripheral_battery/peripheral_battery.ingw index 18092f512..83cdf2d70 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ingw +++ b/examples-nim/peripheral_battery/peripheral_battery.ingw @@ -1,297 +1,69 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\projects\\nim-1.0.0\\bin", - "eflash_addr": "0x42000", - "ide_ver": "", - "ide_exe": "C:\\projects\\nim-1.0.0\\bin\\nim.exe", - "ota": false, - "nim": true, - "ide": "nim", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates-nim\\typical\\peripheral", - "coding_adv": true, - "proj_name": "peripheral_battery", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": true, - "adv_data": "0\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples-nim\\peripheral_battery", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": true, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": true, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\projects\\nim-1.0.0\\bin", + "eflash_addr": "0x42000", + "ide_ver": "", + "ide_exe": "C:\\projects\\nim-1.0.0\\bin\\nim.exe", + "ota": false, + "nim": true, + "ide": "nim", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates-nim\\typical\\peripheral", + "coding_adv": true, + "series": "ING9188xx", + "proj_name": "peripheral_battery", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": true, + "adv_data": "0\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples-nim\\peripheral_battery", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": true, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": true +} \ No newline at end of file diff --git a/examples-nim/peripheral_battery/peripheral_battery.ld b/examples-nim/peripheral_battery/peripheral_battery.ld index 94a2c3f46..c4cd1e14b 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ld +++ b/examples-nim/peripheral_battery/peripheral_battery.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910768, LENGTH = 25680 + RAM (rwx) : ORIGIN = 536910736, LENGTH = 25712 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-nim/smart_home_hub/Makefile b/examples-nim/smart_home_hub/Makefile index 1b8853654..f6779ae95 100644 --- a/examples-nim/smart_home_hub/Makefile +++ b/examples-nim/smart_home_hub/Makefile @@ -1,7 +1,7 @@ CMSIS_INC=${CMSIS_BASE}/Include ING_REL=../.. ING_BUNDLE=../../bundles/typical/inc -SYMDEFS=-Wl,--just-symbols=../../bundles/typical/ING9188xx/symdefs.g +SYMDEFS=-Wl,--just-symbols=../../bundles/typical/symdefs.g APPNAME=smart_home_hub diff --git a/examples-nim/smart_home_hub/flash_download.ini b/examples-nim/smart_home_hub/flash_download.ini index bd7428d35..7e1a35ee5 100644 --- a/examples-nim/smart_home_hub/flash_download.ini +++ b/examples-nim/smart_home_hub/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples-nim/smart_home_hub/smart_home_hub.ingw b/examples-nim/smart_home_hub/smart_home_hub.ingw index 9238b54ed..9d9cca281 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ingw +++ b/examples-nim/smart_home_hub/smart_home_hub.ingw @@ -1,297 +1,69 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\projects\\nim-1.0.0\\bin", - "eflash_addr": "0x42000", - "ide_ver": "", - "ide_exe": "C:\\projects\\nim-1.0.0\\bin\\nim.exe", - "ota": false, - "nim": true, - "ide": "nim", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates-nim\\typical\\peripheral", - "coding_adv": true, - "proj_name": "smart_home_hub", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": true, - "adv_data": "0\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples-nim\\smart_home_hub", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": true, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": true, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\projects\\nim-1.0.0\\bin", + "eflash_addr": "0x42000", + "ide_ver": "", + "ide_exe": "C:\\projects\\nim-1.0.0\\bin\\nim.exe", + "ota": false, + "nim": true, + "ide": "nim", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates-nim\\typical\\peripheral", + "coding_adv": true, + "series": "ING9188xx", + "proj_name": "smart_home_hub", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": true, + "adv_data": "0\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples-nim\\smart_home_hub", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": true, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": true +} \ No newline at end of file diff --git a/examples-nim/smart_home_hub/smart_home_hub.ld b/examples-nim/smart_home_hub/smart_home_hub.ld index 94a2c3f46..c4cd1e14b 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ld +++ b/examples-nim/smart_home_hub/smart_home_hub.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910768, LENGTH = 25680 + RAM (rwx) : ORIGIN = 536910736, LENGTH = 25712 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-rowley/peripheral_ibeacon/flash_download.ini b/examples-rowley/peripheral_ibeacon/flash_download.ini index 9bec164d4..769a3d4ea 100644 --- a/examples-rowley/peripheral_ibeacon/flash_download.ini +++ b/examples-rowley/peripheral_ibeacon/flash_download.ini @@ -10,7 +10,7 @@ batch=1 [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp index a5fcd3ff4..1616c6e7d 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp @@ -2,7 +2,7 @@ - + diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw index 7365c2e01..079a3a8a9 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,288 +1,60 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:/Program Files(2)/Crossworks/bin", - "ide_ver": "", - "ide_exe": "C:/Program Files(2)/Crossworks/bin/crossstudio.exe", - "ota": false, - "ide": "rowley", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_ibeacon", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "0\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples-rowley\\peripheral_ibeacon", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "cmsis": "C:/projects/ingWizard/CMSIS", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "rowley": true, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\/Program Files(2)\/Crossworks\/bin", + "ide_ver": "", + "ide_exe": "C:\/Program Files(2)\/Crossworks\/bin\/crossstudio.exe", + "ota": false, + "ide": "rowley", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_ibeacon", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "0\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples-rowley\\peripheral_ibeacon", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "cmsis": "C:\/projects\/ingWizard\/CMSIS", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "rowley": true, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples-segger/peripheral_ibeacon/flash_download.ini b/examples-segger/peripheral_ibeacon/flash_download.ini index c840374af..60af869ea 100644 --- a/examples-segger/peripheral_ibeacon/flash_download.ini +++ b/examples-segger/peripheral_ibeacon/flash_download.ini @@ -14,7 +14,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject index 931ae236f..7657b0890 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject @@ -2,7 +2,7 @@ - + diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw index ff6652d64..db5adbdf2 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,288 +1,60 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:/Program Files (x86)/SEGGER/SEGGER Embedded Studio for ARM 4.50/bin", - "ide_ver": "", - "ide_exe": "C:/Program Files (x86)/SEGGER/SEGGER Embedded Studio for ARM 4.50/bin/emStudio.exe", - "ota": false, - "ide": "segger", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "segger": true, - "proj_name": "peripheral_ibeacon", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "0\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples-segger\\peripheral_ibeacon", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "cmsis": "C:/projects/ingWizard/CMSIS", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\/Program Files (x86)\/SEGGER\/SEGGER Embedded Studio for ARM 4.50\/bin", + "ide_ver": "", + "ide_exe": "C:\/Program Files (x86)\/SEGGER\/SEGGER Embedded Studio for ARM 4.50\/bin\/emStudio.exe", + "ota": false, + "ide": "segger", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "segger": true, + "proj_name": "peripheral_ibeacon", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "0\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples-segger\\peripheral_ibeacon", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "cmsis": "C:\/projects\/ingWizard\/CMSIS", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/anti_lost_mas/anti_lost_mas.ingw b/examples/anti_lost_mas/anti_lost_mas.ingw index 7d384617d..a8f62d8fc 100644 --- a/examples/anti_lost_mas/anti_lost_mas.ingw +++ b/examples/anti_lost_mas/anti_lost_mas.ingw @@ -1,296 +1,68 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131544, - "base": 16384 - }, - "ram": { - "size": 30592, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\central", - "proj_name": "anti_lost_mas", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": true, - "adv_data": "// 0xFF - «Manufacturer Specific Data»\r\n6, 0xFF,\r\n0xAC, 0x06, 0x00, 0x00, 0x00, \r\n\r\n// Total size = 7 bytes\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\anti_lost_mas", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "central", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25648, - "app_ram_addr": 536910800, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\central", + "series": "ING9188xx", + "proj_name": "anti_lost_mas", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": true, + "adv_data": "\/\/ 0xFF - \ufffd\ufffdManufacturer Specific Data\ufffd\ufffd\r\n6, 0xFF,\r\n0xAC, 0x06, 0x00, 0x00, 0x00, \r\n\r\n\/\/ Total size = 7 bytes\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\anti_lost_mas", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "central", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/anti_lost_mas/anti_lost_mas.uvproj b/examples/anti_lost_mas/anti_lost_mas.uvproj index a94d17447..738159d50 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvproj +++ b/examples/anti_lost_mas/anti_lost_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536910800 - 25648 + 536910736 + 25712 0 diff --git a/examples/anti_lost_mas/anti_lost_mas.uvprojx b/examples/anti_lost_mas/anti_lost_mas.uvprojx index d3df29a5f..ceb78c8c2 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvprojx +++ b/examples/anti_lost_mas/anti_lost_mas.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o anti_lost_mas.bin ./output/anti_lost_mas.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bd0 - 0x6430 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -460,12 +457,11 @@ - - + @@ -473,5 +469,4 @@ -
diff --git a/examples/anti_lost_mas/flash_download.ini b/examples/anti_lost_mas/flash_download.ini index 6284aff7d..13c83295c 100644 --- a/examples/anti_lost_mas/flash_download.ini +++ b/examples/anti_lost_mas/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/anti_lost_sla/anti_lost_sla.ingw b/examples/anti_lost_sla/anti_lost_sla.ingw index 1bebb59f4..6915b32fa 100644 --- a/examples/anti_lost_sla/anti_lost_sla.ingw +++ b/examples/anti_lost_sla/anti_lost_sla.ingw @@ -1,296 +1,68 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131536, - "base": 16384 - }, - "ram": { - "size": 30592, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "anti_lost_sla", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": true, - "adv_data": "// 0xFF - «Manufacturer Specific Data»\r\n6, 0xFF,\r\n0xAC, 0x06, 0x00, 0x00, 0x00, \r\n\r\n// Total size = 7 bytes\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\anti_lost_sla", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25648, - "app_ram_addr": 536910800, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "anti_lost_sla", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": true, + "adv_data": "\/\/ 0xFF - \ufffd\ufffdManufacturer Specific Data\ufffd\ufffd\r\n6, 0xFF,\r\n0xAC, 0x06, 0x00, 0x00, 0x00, \r\n\r\n\/\/ Total size = 7 bytes\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\anti_lost_sla", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/anti_lost_sla/anti_lost_sla.uvproj b/examples/anti_lost_sla/anti_lost_sla.uvproj index d9bef0257..fe21c9c09 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvproj +++ b/examples/anti_lost_sla/anti_lost_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536910800 - 25648 + 536910736 + 25712 0 diff --git a/examples/anti_lost_sla/anti_lost_sla.uvprojx b/examples/anti_lost_sla/anti_lost_sla.uvprojx index 6c932e7b5..c36d7fc2a 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvprojx +++ b/examples/anti_lost_sla/anti_lost_sla.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o anti_lost_sla.bin ./output/anti_lost_sla.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bd0 - 0x6430 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -455,12 +452,11 @@ - - + @@ -468,5 +464,4 @@ -
diff --git a/examples/anti_lost_sla/flash_download.ini b/examples/anti_lost_sla/flash_download.ini index 404b36bb0..2afa34e94 100644 --- a/examples/anti_lost_sla/flash_download.ini +++ b/examples/anti_lost_sla/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/central_throughput/central_throughput.ingw b/examples/central_throughput/central_throughput.ingw index cea1c3d4d..1d87cbb2a 100644 --- a/examples/central_throughput/central_throughput.ingw +++ b/examples/central_throughput/central_throughput.ingw @@ -1,296 +1,68 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\central", - "proj_name": "central_throughput", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": true, - "adv_data": "0\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\central_throughput", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "central", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\central", + "series": "ING9188xx", + "proj_name": "central_throughput", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": true, + "adv_data": "0\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\central_throughput", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "central", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/central_throughput/central_throughput.uvproj b/examples/central_throughput/central_throughput.uvproj index 9b2e5e908..9a05c8c49 100644 --- a/examples/central_throughput/central_throughput.uvproj +++ b/examples/central_throughput/central_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/central_throughput/central_throughput.uvprojx b/examples/central_throughput/central_throughput.uvprojx index 69170d061..193501a1e 100644 --- a/examples/central_throughput/central_throughput.uvprojx +++ b/examples/central_throughput/central_throughput.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o central_throughput.bin ./output/central_throughput.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bb0 - 0x6450 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -455,12 +452,11 @@ - - + @@ -468,5 +464,4 @@ -
diff --git a/examples/central_throughput/flash_download.ini b/examples/central_throughput/flash_download.ini index 70ddee90d..fb7d0582a 100644 --- a/examples/central_throughput/flash_download.ini +++ b/examples/central_throughput/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/hid_keyboard/flash_download.ini b/examples/hid_keyboard/flash_download.ini index 6380ad8d6..ad83c62aa 100644 --- a/examples/hid_keyboard/flash_download.ini +++ b/examples/hid_keyboard/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/hid_keyboard/hid_keyboard.ingw b/examples/hid_keyboard/hid_keyboard.ingw index dcaa21659..fdb153165 100644 --- a/examples/hid_keyboard/hid_keyboard.ingw +++ b/examples/hid_keyboard/hid_keyboard.ingw @@ -1,295 +1,67 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "hid_keyboard", - "sdk_release_path": "../..", - "security": true, - "legacy_adv": true, - "adv_data": "0\r\n", - "use_eflash": true, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\hid_keyboard", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": true, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "hid_keyboard", + "sdk_release_path": "..\/..", + "security": true, + "legacy_adv": true, + "adv_data": "0\r\n", + "use_eflash": true, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\hid_keyboard", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": true +} \ No newline at end of file diff --git a/examples/hid_keyboard/hid_keyboard.uvproj b/examples/hid_keyboard/hid_keyboard.uvproj index 284c528e9..2305f7f6a 100644 --- a/examples/hid_keyboard/hid_keyboard.uvproj +++ b/examples/hid_keyboard/hid_keyboard.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/hid_keyboard/hid_keyboard.uvprojx b/examples/hid_keyboard/hid_keyboard.uvprojx index c2a3b1aed..8b865e3b2 100644 --- a/examples/hid_keyboard/hid_keyboard.uvprojx +++ b/examples/hid_keyboard/hid_keyboard.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/hid_mouse/flash_download.ini b/examples/hid_mouse/flash_download.ini index 6f8599089..9db6946f7 100644 --- a/examples/hid_mouse/flash_download.ini +++ b/examples/hid_mouse/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/hid_mouse/hid_mouse.ingw b/examples/hid_mouse/hid_mouse.ingw index 855e6da23..2b7418cc9 100644 --- a/examples/hid_mouse/hid_mouse.ingw +++ b/examples/hid_mouse/hid_mouse.ingw @@ -1,295 +1,67 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "hid_mouse", - "sdk_release_path": "../..", - "security": true, - "legacy_adv": true, - "adv_data": "0\r\n", - "use_eflash": true, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\hid_mouse", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": true, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "hid_mouse", + "sdk_release_path": "..\/..", + "security": true, + "legacy_adv": true, + "adv_data": "0\r\n", + "use_eflash": true, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\hid_mouse", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": true +} \ No newline at end of file diff --git a/examples/hid_mouse/hid_mouse.uvproj b/examples/hid_mouse/hid_mouse.uvproj index d349ea20b..cc12d8896 100644 --- a/examples/hid_mouse/hid_mouse.uvproj +++ b/examples/hid_mouse/hid_mouse.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/hid_mouse/hid_mouse.uvprojx b/examples/hid_mouse/hid_mouse.uvprojx index 2a4b9d88d..fe9a87e4f 100644 --- a/examples/hid_mouse/hid_mouse.uvprojx +++ b/examples/hid_mouse/hid_mouse.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/ibeacon_scanner/flash_download.ini b/examples/ibeacon_scanner/flash_download.ini index e76bb8ceb..fef9bd04e 100644 --- a/examples/ibeacon_scanner/flash_download.ini +++ b/examples/ibeacon_scanner/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/ibeacon_scanner/ibeacon_scanner.ingw b/examples/ibeacon_scanner/ibeacon_scanner.ingw index 9ce7085d2..14ad1d210 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.ingw +++ b/examples/ibeacon_scanner/ibeacon_scanner.ingw @@ -1,281 +1,53 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "arm_cc": "C:/keil/ARM/ARMCC", - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "ble_50": false, - "template": "C:\\projects\\ingWizard\\templates\\typical\\central", - "proj_name": "ibeacon_scanner", - "sdk_release_path": "../..", - "adv_data": "0\r\n", - "pb_adv": false, - "pb_gatt": false, - "deep_sleep": false, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\ibeacon_scanner", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "arm_inc": "C:/keil/ARM/ARMCC/include", - "role": "central", - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "proxy": true, - "series": "ING9188xx" -} + "ram": { + "size": 30528, + "base": 536880208 + }, + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "arm_cc": "C:\/keil\/ARM\/ARMCC", + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "ble_50": false, + "template": "C:\\projects\\ingWizard\\templates\\typical\\central", + "series": "ING9188xx", + "proj_name": "ibeacon_scanner", + "sdk_release_path": "..\/..", + "adv_data": "0\r\n", + "pb_adv": false, + "pb_gatt": false, + "deep_sleep": false, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\ibeacon_scanner", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "arm_inc": "C:\/keil\/ARM\/ARMCC\/include", + "role": "central", + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "proxy": true +} \ No newline at end of file diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvproj b/examples/ibeacon_scanner/ibeacon_scanner.uvproj index 1a07cb9ac..b61e90533 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvproj +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx index 4648e8dae..c72d622bf 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/io_over_ble_mas/flash_download.ini b/examples/io_over_ble_mas/flash_download.ini index c33a7f85c..6878bd111 100644 --- a/examples/io_over_ble_mas/flash_download.ini +++ b/examples/io_over_ble_mas/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/io_over_ble_mas/io_over_ble_mas.ingw b/examples/io_over_ble_mas/io_over_ble_mas.ingw index c3bad8bbe..44297eac3 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.ingw +++ b/examples/io_over_ble_mas/io_over_ble_mas.ingw @@ -1,290 +1,62 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\central", - "proj_name": "io_over_ble_mas", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "0\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\io_over_ble_mas", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "central", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\central", + "series": "ING9188xx", + "proj_name": "io_over_ble_mas", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "0\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\io_over_ble_mas", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "central", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvproj b/examples/io_over_ble_mas/io_over_ble_mas.uvproj index a669f6075..7a5d8383d 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvproj +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx index 960b02d01..824f100b5 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o io_over_ble_mas.bin ./output/io_over_ble_mas.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bb0 - 0x6450 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER,IS_MASTER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -470,12 +467,11 @@ - - + @@ -483,5 +479,4 @@ -
diff --git a/examples/io_over_ble_sla/flash_download.ini b/examples/io_over_ble_sla/flash_download.ini index ae6200af7..ef373875d 100644 --- a/examples/io_over_ble_sla/flash_download.ini +++ b/examples/io_over_ble_sla/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/io_over_ble_sla/io_over_ble_sla.ingw b/examples/io_over_ble_sla/io_over_ble_sla.ingw index b8d01e8f4..4a25552cf 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.ingw +++ b/examples/io_over_ble_sla/io_over_ble_sla.ingw @@ -1,290 +1,62 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "io_over_ble_sla", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n1, 0x01,\r\n\r\n// Total size = 2 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\io_over_ble_sla", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "io_over_ble_sla", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n1, 0x01,\r\n\r\n\/\/ Total size = 2 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\io_over_ble_sla", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvoptx b/examples/io_over_ble_sla/io_over_ble_sla.uvoptx index 7ea6a04be..f704961ab 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvoptx +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvoptx @@ -230,7 +230,7 @@ StartUP - 0 + 1 0 0 0 @@ -253,7 +253,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvproj b/examples/io_over_ble_sla/io_over_ble_sla.uvproj index 5f95888ee..dfe94b585 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvproj +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx index 401d1d47a..202ee5c39 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o io_over_ble_sla.bin ./output/io_over_ble_sla.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER,IO_TYPE=IO_TYPE_UART - + ../io_over_ble_mas\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -462,11 +465,12 @@ + - + @@ -474,4 +478,5 @@ +
diff --git a/examples/mesh-light/flash_download.ini b/examples/mesh-light/flash_download.ini index f07c5b16a..27b28f00c 100644 --- a/examples/mesh-light/flash_download.ini +++ b/examples/mesh-light/flash_download.ini @@ -1,5 +1,5 @@ [bin-0] -FileName=../../bundles/mesh/platform.bin +FileName=../../bundles/mesh/ING9188xx/platform.bin Address=16384 Name=Burn Bin #1 Checked=1 diff --git a/examples/mesh-light/mesh-light.ingw b/examples/mesh-light/mesh-light.ingw index 4264f96b2..8071d7a06 100644 --- a/examples/mesh-light/mesh-light.ingw +++ b/examples/mesh-light/mesh-light.ingw @@ -1,392 +1,53 @@ { - "bundle_meta": { - "rom": { - "size": 258236, - "base": 16384 - }, - "ram": { - "size": 54040, - "base": 536880208 - }, - "app": { - "base": 278528 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_discover_characteristics_for_service", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristics_for_service_by_uuid16", - "gatt_client_discover_characteristics_for_service_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_deserialize_service", - "gatt_client_deserialize_characteristic", - "gatt_client_deserialize_characteristic_descriptor", - "ble_gatts_find_svc", - "ble_gatts_find_chr", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "sysSetPublicDeviceAddr", - "platform_config", - "platform_shutdown", - "platform_printf", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_init", - "l2cap_max_le_mtu", - "l2cap_send_signaling_le", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove_all", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_commit", - "kv_visit", - "kv_value_append", - "kv_value_trunc", - "mesh_setup", - "mesh_set_dev_name", - "mesh_platform_config", - "_os_mbuf_leadingspace", - "_os_mbuf_trailingspace", - "os_mqueue_init", - "os_mqueue_get", - "os_mqueue_put", - "os_msys_register", - "os_msys_get", - "os_msys_reset", - "os_msys_get_pkthdr", - "os_msys_count", - "os_msys_num_free", - "os_mbuf_pool_init", - "os_mbuf_get", - "os_mbuf_get_pkthdr", - "os_mbuf_dup", - "os_mbuf_off", - "os_mbuf_copydata", - "os_mbuf_append", - "os_mbuf_appendfrom", - "os_mbuf_free", - "os_mbuf_free_chain", - "os_mbuf_adj", - "os_mbuf_cmpf", - "os_mbuf_cmpm", - "os_mbuf_prepend", - "os_mbuf_prepend_pullup", - "os_mbuf_copyinto", - "os_mbuf_concat", - "os_mbuf_extend", - "os_mbuf_pullup", - "os_mbuf_trim_front", - "NET_BUF_SIMPLE", - "net_buf_simple_init", - "net_buf_put", - "net_buf_ref", - "net_buf_unref", - "net_buf_simple_pull_le16", - "net_buf_simple_pull_be16", - "net_buf_simple_pull_be32", - "net_buf_simple_pull_le32", - "net_buf_simple_pull_u8", - "net_buf_simple_add_le16", - "net_buf_simple_add_be16", - "net_buf_simple_add_u8", - "net_buf_simple_add_be32", - "net_buf_simple_add_le32", - "net_buf_add_zeros", - "net_buf_simple_push_le16", - "net_buf_simple_push_be16", - "net_buf_simple_push_u8", - "net_buf_simple_pull", - "net_buf_simple_add", - "k_fifo_is_empty", - "net_buf_get", - "net_buf_simple_push", - "net_buf_reserve", - "bt_dh_key_gen", - "bt_pub_key_gen", - "bt_pub_key_get", - "bt_rand", - "bt_hex", - "bt_encrypt_be", - "bt_le_adv_start", - "bt_le_adv_stop", - "k_work_init", - "k_delayed_work_init", - "k_delayed_work_cancel", - "k_delayed_work_submit", - "k_uptime_get", - "k_uptime_get_32", - "k_sleep", - "k_work_submit", - "k_work_add_arg", - "k_delayed_work_add_arg", - "k_delayed_work_remaining_get", - "net_buf_simple_save", - "net_buf_simple_restore", - "sys_memcpy_swap", - "MYNEWT_VAL_BLE_MESH_GATT_PROXY", - "k_sem_take", - "net_buf_slist_init", - "net_buf_slist_is_empty", - "net_buf_slist_peek_head", - "net_buf_slist_peek_next", - "net_buf_slist_get", - "net_buf_slist_put", - "net_buf_slist_remove", - "net_buf_slist_merge_slist", - "settings_bytes_from_str", - "settings_str_from_bytes", - "PB_ADV_config", - "le_adv_status_reset", - "bt_mesh_model_msg_init", - "bt_mesh_model_send", - "bt_mesh_model_publish", - "bt_mesh_model_elem", - "bt_mesh_input_string", - "bt_mesh_input_number", - "bt_mesh_prov_enable", - "bt_mesh_prov_disable", - "bt_mesh_init", - "bt_mesh_reset", - "bt_mesh_provision", - "bt_mesh_is_provisioned", - "ble_npl_callout_init", - "npl_freertos_eventq_get", - "npl_freertos_eventq_put", - "npl_freertos_sem_init", - "npl_freertos_sem_pend", - "npl_freertos_sem_release", - "npl_freertos_callout_init", - "npl_freertos_callout_reset", - "npl_freertos_callout_remaining_ticks", - "npl_freertos_time_ms_to_ticks", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueReceiveFromISR", - "xQueueIsQueueEmptyFromISR", - "xQueueCreateCountingSemaphore", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskGetTickCountFromISR", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "pvTimerGetTimerID", - "xTimerGetExpiryTime", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 14, - 1 - ] + "bundle_meta": { + "rom": { + "size": 258236, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "arm_cc": "C:/keil/ARM/ARMCC", - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "ble_50": false, - "template": "C:\\projects\\ingWizard\\templates\\mesh\\light", - "proj_name": "mesh-light", - "sdk_release_path": "../..", - "adv_data": "0\r\n", - "wizard_dir": "C:\\projects\\ingWizard", - "pb_adv": true, - "pb_gatt": false, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\mesh-light", - "bundle": "mesh", - "app_rom_size": "262144", - "app_rom_addr": "278528", - "role": "light", - "keil": true, - "cmsis": "", - "app_ram_size": 2200, - "app_ram_addr": 536934248, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "proxy": true, - "series": "ING9188xx" -} + "ram": { + "size": 54040, + "base": 536880208 + }, + "app": { + "base": 278528 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","sysSetPublicDeviceAddr","platform_config","platform_shutdown","platform_printf","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_init","l2cap_max_le_mtu","l2cap_send_signaling_le","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","kv_value_append","kv_value_trunc","mesh_setup","mesh_set_dev_name","mesh_platform_config","_os_mbuf_leadingspace","_os_mbuf_trailingspace","os_mqueue_init","os_mqueue_get","os_mqueue_put","os_msys_register","os_msys_get","os_msys_reset","os_msys_get_pkthdr","os_msys_count","os_msys_num_free","os_mbuf_pool_init","os_mbuf_get","os_mbuf_get_pkthdr","os_mbuf_dup","os_mbuf_off","os_mbuf_copydata","os_mbuf_append","os_mbuf_appendfrom","os_mbuf_free","os_mbuf_free_chain","os_mbuf_adj","os_mbuf_cmpf","os_mbuf_cmpm","os_mbuf_prepend","os_mbuf_prepend_pullup","os_mbuf_copyinto","os_mbuf_concat","os_mbuf_extend","os_mbuf_pullup","os_mbuf_trim_front","NET_BUF_SIMPLE","net_buf_simple_init","net_buf_put","net_buf_ref","net_buf_unref","net_buf_simple_pull_le16","net_buf_simple_pull_be16","net_buf_simple_pull_be32","net_buf_simple_pull_le32","net_buf_simple_pull_u8","net_buf_simple_add_le16","net_buf_simple_add_be16","net_buf_simple_add_u8","net_buf_simple_add_be32","net_buf_simple_add_le32","net_buf_add_zeros","net_buf_simple_push_le16","net_buf_simple_push_be16","net_buf_simple_push_u8","net_buf_simple_pull","net_buf_simple_add","k_fifo_is_empty","net_buf_get","net_buf_simple_push","net_buf_reserve","bt_dh_key_gen","bt_pub_key_gen","bt_pub_key_get","bt_rand","bt_hex","bt_encrypt_be","bt_le_adv_start","bt_le_adv_stop","k_work_init","k_delayed_work_init","k_delayed_work_cancel","k_delayed_work_submit","k_uptime_get","k_uptime_get_32","k_sleep","k_work_submit","k_work_add_arg","k_delayed_work_add_arg","k_delayed_work_remaining_get","net_buf_simple_save","net_buf_simple_restore","sys_memcpy_swap","MYNEWT_VAL_BLE_MESH_GATT_PROXY","k_sem_take","net_buf_slist_init","net_buf_slist_is_empty","net_buf_slist_peek_head","net_buf_slist_peek_next","net_buf_slist_get","net_buf_slist_put","net_buf_slist_remove","net_buf_slist_merge_slist","settings_bytes_from_str","settings_str_from_bytes","PB_ADV_config","le_adv_status_reset","bt_mesh_model_msg_init","bt_mesh_model_send","bt_mesh_model_publish","bt_mesh_model_elem","bt_mesh_input_string","bt_mesh_input_number","bt_mesh_prov_enable","bt_mesh_prov_disable","bt_mesh_init","bt_mesh_reset","bt_mesh_provision","bt_mesh_is_provisioned","ble_npl_callout_init","npl_freertos_eventq_get","npl_freertos_eventq_put","npl_freertos_sem_init","npl_freertos_sem_pend","npl_freertos_sem_release","npl_freertos_callout_init","npl_freertos_callout_reset","npl_freertos_callout_remaining_ticks","npl_freertos_time_ms_to_ticks","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueCreateCountingSemaphore","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,14,1] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "arm_cc": "C:\/keil\/ARM\/ARMCC", + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "ble_50": false, + "template": "C:\\projects\\ingWizard\\templates\\mesh\\light", + "series": "ING9188xx", + "proj_name": "mesh-light", + "sdk_release_path": "..\/..", + "adv_data": "0\r\n", + "wizard_dir": "C:\\projects\\ingWizard", + "pb_adv": true, + "pb_gatt": false, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\mesh-light", + "bundle": "mesh", + "app_rom_size": "262144", + "app_rom_addr": "278528", + "role": "light", + "keil": true, + "cmsis": "", + "app_ram_size": 2200, + "app_ram_addr": 536934248, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "proxy": true +} \ No newline at end of file diff --git a/examples/mesh-light/mesh-light.uvprojx b/examples/mesh-light/mesh-light.uvprojx index 61c413ca5..95776010e 100644 --- a/examples/mesh-light/mesh-light.uvprojx +++ b/examples/mesh-light/mesh-light.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o mesh-light.bin ./output/mesh-light.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x44000 - 0x40000 + 278528 + 262144 1 @@ -297,8 +294,8 @@ 0 - 0x2000f768 - 0x898 + 536934248 + 2200 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/mesh/inc;../../bundles/mesh/inc/os;../../bundles/mesh/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src;../../src/Mesh @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -458,12 +455,11 @@ - - + @@ -471,5 +467,4 @@ -
diff --git a/examples/periodic_advertiser/flash_download.ini b/examples/periodic_advertiser/flash_download.ini index 79213b6bb..e2689ebcf 100644 --- a/examples/periodic_advertiser/flash_download.ini +++ b/examples/periodic_advertiser/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/periodic_advertiser/periodic_advertiser.ingw b/examples/periodic_advertiser/periodic_advertiser.ingw index 5661b5349..394c90b2c 100644 --- a/examples/periodic_advertiser/periodic_advertiser.ingw +++ b/examples/periodic_advertiser/periodic_advertiser.ingw @@ -1,296 +1,68 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "periodic_advertiser", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": false, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n39, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x68, 0x65, 0x72, \r\n0x6D, 0x6F, 0x2F, 0x69, 0x42, 0x65, 0x61, 0x63, \r\n0x6F, 0x6E, 0x20, 0x50, 0x65, 0x72, 0x69, 0x6F, \r\n0x64, 0x69, 0x63, 0x20, 0x41, 0x64, 0x76, 0x65, \r\n0x72, 0x74, 0x69, 0x73, 0x65, 0x72, \r\n\r\n// 0x16 - «Service Data - 16-bit UUID»\r\n8, 0x16,\r\n0x09, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n\r\n// 0xFF - «Manufacturer Specific Data»\r\n26, 0xFF,\r\n0x4C, 0x00, 0x02, 0x15, 0xBB, 0x4A, 0xBD, 0xB2, \r\n0x7D, 0x03, 0x4F, 0xF7, 0xA4, 0x22, 0x69, 0xBE, \r\n0x72, 0x9F, 0x65, 0x11, 0x00, 0x0C, 0x00, 0x22, \r\n0xCE, \r\n\r\n// Total size = 79 bytes\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\periodic_advertiser", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "periodic_advertiser", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": false, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n39, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x68, 0x65, 0x72, \r\n0x6D, 0x6F, 0x2F, 0x69, 0x42, 0x65, 0x61, 0x63, \r\n0x6F, 0x6E, 0x20, 0x50, 0x65, 0x72, 0x69, 0x6F, \r\n0x64, 0x69, 0x63, 0x20, 0x41, 0x64, 0x76, 0x65, \r\n0x72, 0x74, 0x69, 0x73, 0x65, 0x72, \r\n\r\n\/\/ 0x16 - \ufffd\ufffdService Data - 16-bit UUID\ufffd\ufffd\r\n8, 0x16,\r\n0x09, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n\r\n\/\/ 0xFF - \ufffd\ufffdManufacturer Specific Data\ufffd\ufffd\r\n26, 0xFF,\r\n0x4C, 0x00, 0x02, 0x15, 0xBB, 0x4A, 0xBD, 0xB2, \r\n0x7D, 0x03, 0x4F, 0xF7, 0xA4, 0x22, 0x69, 0xBE, \r\n0x72, 0x9F, 0x65, 0x11, 0x00, 0x0C, 0x00, 0x22, \r\n0xCE, \r\n\r\n\/\/ Total size = 79 bytes\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\periodic_advertiser", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/periodic_advertiser/periodic_advertiser.uvopt b/examples/periodic_advertiser/periodic_advertiser.uvopt index 209546927..dd2fa0bf2 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvopt +++ b/examples/periodic_advertiser/periodic_advertiser.uvopt @@ -195,7 +195,7 @@ 0 18 0 - 1 + 6 7 0 .\src\main.c @@ -223,7 +223,7 @@ StartUP - 0 + 1 0 0 0 @@ -254,7 +254,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -271,7 +271,7 @@ FWlib - 0 + 1 0 0 0 @@ -307,6 +307,22 @@ 0 0
+ + 4 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_timer.c + peripheral_timer.c + 0 + 0 + @@ -317,4 +333,4 @@ 0 - \ No newline at end of file + diff --git a/examples/periodic_advertiser/periodic_advertiser.uvoptx b/examples/periodic_advertiser/periodic_advertiser.uvoptx index a158826cc..f143bc229 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvoptx +++ b/examples/periodic_advertiser/periodic_advertiser.uvoptx @@ -241,7 +241,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/periodic_advertiser/periodic_advertiser.uvproj b/examples/periodic_advertiser/periodic_advertiser.uvproj index 8d8906269..d63c7b489 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvproj +++ b/examples/periodic_advertiser/periodic_advertiser.uvproj @@ -1,7 +1,10 @@ - + + 1.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -12,27 +15,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -54,8 +57,8 @@ 0 0 - - + + 0 0 0 @@ -64,8 +67,8 @@ 0 0 - - + + 0 0 @@ -73,12 +76,12 @@ 1 0 fromelf.exe --bin -o periodic_advertiser.bin ./output/periodic_advertiser.axf - + 0 0 0 - + 0 @@ -92,16 +95,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -138,17 +141,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -165,7 +168,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -197,7 +200,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -294,8 +297,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -319,8 +322,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -328,7 +331,7 @@ 0x0 - + 1 @@ -347,7 +350,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -361,10 +364,10 @@ 0 0 - - - - + + + + @@ -376,12 +379,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -432,6 +435,11 @@ 1 ../..\src\FWlib\peripheral_sysctrl.c
+ + peripheral_timer.c + 1 + ..\..\src\FWlib\peripheral_timer.c + @@ -440,4 +448,5 @@ +
diff --git a/examples/periodic_advertiser/periodic_advertiser.uvprojx b/examples/periodic_advertiser/periodic_advertiser.uvprojx index 7065ab91f..7ea200bbc 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvprojx +++ b/examples/periodic_advertiser/periodic_advertiser.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o periodic_advertiser.bin ./output/periodic_advertiser.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -435,11 +438,12 @@ + - + @@ -447,4 +451,5 @@ +
diff --git a/examples/periodic_scanner/flash_download.ini b/examples/periodic_scanner/flash_download.ini index c649298fa..78cd6d8a5 100644 --- a/examples/periodic_scanner/flash_download.ini +++ b/examples/periodic_scanner/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/periodic_scanner/periodic_scanner.ingw b/examples/periodic_scanner/periodic_scanner.ingw index 75b96a6a2..cde8bfe11 100644 --- a/examples/periodic_scanner/periodic_scanner.ingw +++ b/examples/periodic_scanner/periodic_scanner.ingw @@ -1,296 +1,68 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\central", - "proj_name": "periodic_scanner", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": false, - "adv_data": "0\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\periodic_scanner", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "central", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\central", + "series": "ING9188xx", + "proj_name": "periodic_scanner", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": false, + "adv_data": "0\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\periodic_scanner", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "central", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/periodic_scanner/periodic_scanner.uvproj b/examples/periodic_scanner/periodic_scanner.uvproj index d4669da20..946622c17 100644 --- a/examples/periodic_scanner/periodic_scanner.uvproj +++ b/examples/periodic_scanner/periodic_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/periodic_scanner/periodic_scanner.uvprojx b/examples/periodic_scanner/periodic_scanner.uvprojx index 90d5312d8..fc9aca81b 100644 --- a/examples/periodic_scanner/periodic_scanner.uvprojx +++ b/examples/periodic_scanner/periodic_scanner.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_all_in_one/flash_download.ini b/examples/peripheral_all_in_one/flash_download.ini index 02b329144..57f955d85 100644 --- a/examples/peripheral_all_in_one/flash_download.ini +++ b/examples/peripheral_all_in_one/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw index 35203478a..57b7be376 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw @@ -1,291 +1,63 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_all_in_one", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n15, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x41, 0x6C, 0x6C, 0x20, \r\n0x49, 0x6E, 0x20, 0x4F, 0x6E, 0x65, \r\n\r\n// Total size = 19 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_all_in_one", - "power_saving": false, - "gatt_handle_value": "20", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x16, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x41, 0x6C, 0x6C, 0x20, \r\n0x49, 0x6E, 0x20, 0x4F, 0x6E, 0x65, \r\n\r\n// Service Battery Service: 180F\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0F, 0x18, \r\n// Characteristic Battery Level: 2A19\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0x19, 0x2A, \r\n0x09, 0x00, 0x02, 0x00, 0x06, 0x00, 0x19, 0x2A,\r\n0x00, \r\n\r\n// Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n// Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28,\r\n0x10, 0x09, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x09, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x0A, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n// Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x03, 0x28,\r\n0x02, 0x0C, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n// Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n// Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x03, 0x28,\r\n0x06, 0x0F, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x0F, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n// Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x28,\r\n0x04, 0x11, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x04, 0x03, 0x11, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\r\n// Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n// Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x13, 0x00, 0x03, 0x28,\r\n0x06, 0x14, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x03, 0x14, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n// total size = 353\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_BATTERY_LEVEL=6\r\n// HANDLE_RSC_MEASUREMENT=9\r\n// HANDLE_RSC_FEATURE=12\r\n// HANDLE_ETAG_CONTROL=15\r\n// HANDLE_ETAG_DATA=17\r\n// HANDLE_RGB_LIGHTING_CONTROL=20\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_BATTERY_LEVEL_OFFSET=76\r\n// HANDLE_RSC_MEASUREMENT_OFFSET=108\r\n// HANDLE_RSC_FEATURE_OFFSET=149\r\n// HANDLE_ETAG_CONTROL_OFFSET=224\r\n// HANDLE_ETAG_DATA_OFFSET=274\r\n// HANDLE_RGB_LIGHTING_CONTROL_OFFSET=348\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_all_in_one", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n15, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x41, 0x6C, 0x6C, 0x20, \r\n0x49, 0x6E, 0x20, 0x4F, 0x6E, 0x65, \r\n\r\n\/\/ Total size = 19 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_all_in_one", + "power_saving": false, + "gatt_handle_value": "20", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x16, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x41, 0x6C, 0x6C, 0x20, \r\n0x49, 0x6E, 0x20, 0x4F, 0x6E, 0x65, \r\n\r\n\/\/ Service Battery Service: 180F\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0F, 0x18, \r\n\/\/ Characteristic Battery Level: 2A19\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0x19, 0x2A, \r\n0x09, 0x00, 0x02, 0x00, 0x06, 0x00, 0x19, 0x2A,\r\n0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28,\r\n0x10, 0x09, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x09, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x0A, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x03, 0x28,\r\n0x02, 0x0C, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x03, 0x28,\r\n0x06, 0x0F, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x0F, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x28,\r\n0x04, 0x11, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x04, 0x03, 0x11, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x13, 0x00, 0x03, 0x28,\r\n0x06, 0x14, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x03, 0x14, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 353\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_BATTERY_LEVEL=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=9\r\n\/\/ HANDLE_RSC_FEATURE=12\r\n\/\/ HANDLE_ETAG_CONTROL=15\r\n\/\/ HANDLE_ETAG_DATA=17\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=20\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_BATTERY_LEVEL_OFFSET=76\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=108\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=149\r\n\/\/ HANDLE_ETAG_CONTROL_OFFSET=224\r\n\/\/ HANDLE_ETAG_DATA_OFFSET=274\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=348\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx b/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx index 259345ba2..2810bb451 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvoptx @@ -289,7 +289,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj index f68260f34..ffa77254f 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx index 78613694a..eca846176 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o peripheral_all_in_one.bin ./output/peripheral_all_in_one.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bb0 - 0x6450 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER,OPTIONAL_RF_CLK,HEIGHT=128,SIMULATION,BOARD_V2 - + ..\peripheral_etag\src;..\peripheral_pedometer\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -505,12 +502,11 @@ - - + @@ -518,5 +514,4 @@ -
diff --git a/examples/peripheral_ancs/flash_download.ini b/examples/peripheral_ancs/flash_download.ini index df2e3565f..91ffd704b 100644 --- a/examples/peripheral_ancs/flash_download.ini +++ b/examples/peripheral_ancs/flash_download.ini @@ -6,7 +6,7 @@ entry=0x4000 set-entry=1 launch=1 batch=1 -batch.current=35 +batch.current=40 batch.limit=-1 protection.enabled=0 protection.unlock=0 diff --git a/examples/peripheral_ancs/peripheral_ancs.ingw b/examples/peripheral_ancs/peripheral_ancs.ingw index 862f183b2..fa77aac6a 100644 --- a/examples/peripheral_ancs/peripheral_ancs.ingw +++ b/examples/peripheral_ancs/peripheral_ancs.ingw @@ -2,18 +2,18 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 133936, + "size": 131796, "base": 16384 }, "ram": { - "size": 30608, + "size": 30528, "base": 536880208 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ 0,15,0] }, @@ -60,8 +60,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25632, - "app_ram_addr": 536910816, + "app_ram_size": 25712, + "app_ram_addr": 536910736, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_ancs/peripheral_ancs.uvopt b/examples/peripheral_ancs/peripheral_ancs.uvopt index 91d74ff31..c08982f03 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvopt +++ b/examples/peripheral_ancs/peripheral_ancs.uvopt @@ -193,10 +193,10 @@ 1 0 0 - 43 + 40 0 - 150 - 166 + 152 + 167 0 .\src\main.c main.c @@ -209,10 +209,10 @@ 1 0 0 - 60 + 17 0 - 188 - 205 + 190 + 206 0 .\src\profile.c profile.c @@ -270,7 +270,7 @@ 0 0 0 - ../..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -379,6 +379,22 @@ 0 0 0 + + 5 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\Tools\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + - \ No newline at end of file + diff --git a/examples/peripheral_ancs/peripheral_ancs.uvoptx b/examples/peripheral_ancs/peripheral_ancs.uvoptx index 066956ed9..513a0ee7f 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvoptx +++ b/examples/peripheral_ancs/peripheral_ancs.uvoptx @@ -117,7 +117,7 @@ 0 DLGUARM - d + / 0 @@ -146,6 +146,13 @@ + + + 0 + 1 + sm_persistent + + 0 @@ -342,6 +349,18 @@ 0 0 0 + + 5 + 11 + 1 + 0 + 0 + 0 + ..\..\src\Tools\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + diff --git a/examples/peripheral_ancs/peripheral_ancs.uvproj b/examples/peripheral_ancs/peripheral_ancs.uvproj index 32534d4e4..867675b0c 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvproj +++ b/examples/peripheral_ancs/peripheral_ancs.uvproj @@ -319,8 +319,8 @@ 0 - 536910816 - 25632 + 536910736 + 25712 0 @@ -417,7 +417,7 @@ symdefs.m 3 - ../..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m @@ -458,6 +458,13 @@ Tools + + + SEGGER_RTT.c + 1 + ..\..\src\Tools\SEGGER_RTT.c + + diff --git a/examples/peripheral_ancs/peripheral_ancs.uvprojx b/examples/peripheral_ancs/peripheral_ancs.uvprojx index df8b71132..b11b33d44 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvprojx +++ b/examples/peripheral_ancs/peripheral_ancs.uvprojx @@ -297,8 +297,8 @@ 0 - 0x20009be0 - 0x6420 + 0x20009b90 + 0x6470 0 @@ -448,6 +448,13 @@ Tools + + + SEGGER_RTT.c + 1 + ..\..\src\Tools\SEGGER_RTT.c + + ::CMSIS diff --git a/examples/peripheral_band/flash_download.ini b/examples/peripheral_band/flash_download.ini index 85102864d..12ef32a7a 100644 --- a/examples/peripheral_band/flash_download.ini +++ b/examples/peripheral_band/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_band/peripheral_band.ingw b/examples/peripheral_band/peripheral_band.ingw index 6dd60b71a..db7cc48dc 100644 --- a/examples/peripheral_band/peripheral_band.ingw +++ b/examples/peripheral_band/peripheral_band.ingw @@ -1,291 +1,63 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_band", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x03 - «Complete List of 16-bit Service Class UUIDs»\r\n5, 0x03,\r\n0x0D, 0x18, 0x14, 0x18, \r\n\r\n// 0x09 - «Complete Local Name»\r\n9, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x42, 0x61, 0x6E, 0x64, \r\n\r\n// Total size = 19 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_band", - "power_saving": false, - "gatt_handle_value": "13", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x42, 0x61, 0x6E, 0x64, \r\n\r\n// Service Heart Rate: 180D\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0D, 0x18, \r\n// Characteristic Heart Rate Measurement: 2A37\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x10, 0x06, 0x00, 0x37, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x06, 0x00, 0x37, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x07, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n// Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n// Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x10, 0x0A, 0x00, 0x53, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x53, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x0B, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n// Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x03, 0x28,\r\n0x02, 0x0D, 0x00, 0x54, 0x2A, \r\n0x08, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x54, 0x2A,\r\n\r\n0x00,0x00\r\n// total size = 144\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_HEART_RATE_MEASUREMENT=6\r\n// HANDLE_RSC_MEASUREMENT=10\r\n// HANDLE_RSC_FEATURE=13\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_HEART_RATE_MEASUREMENT_OFFSET=70\r\n// HANDLE_RSC_MEASUREMENT_OFFSET=111\r\n// HANDLE_RSC_FEATURE_OFFSET=142\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_band", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x03 - \ufffd\ufffdComplete List of 16-bit Service Class UUIDs\ufffd\ufffd\r\n5, 0x03,\r\n0x0D, 0x18, 0x14, 0x18, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n9, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x42, 0x61, 0x6E, 0x64, \r\n\r\n\/\/ Total size = 19 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_band", + "power_saving": false, + "gatt_handle_value": "13", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_RSC_FEATURE", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x42, 0x61, 0x6E, 0x64, \r\n\r\n\/\/ Service Heart Rate: 180D\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0D, 0x18, \r\n\/\/ Characteristic Heart Rate Measurement: 2A37\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x10, 0x06, 0x00, 0x37, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x06, 0x00, 0x37, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x07, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x10, 0x0A, 0x00, 0x53, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x53, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x0B, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x03, 0x28,\r\n0x02, 0x0D, 0x00, 0x54, 0x2A, \r\n0x08, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x54, 0x2A,\r\n\r\n0x00,0x00\r\n\/\/ total size = 144\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=10\r\n\/\/ HANDLE_RSC_FEATURE=13\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT_OFFSET=70\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=111\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=142\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_band/peripheral_band.uvproj b/examples/peripheral_band/peripheral_band.uvproj index ee85c7ccc..1c6e91e24 100644 --- a/examples/peripheral_band/peripheral_band.uvproj +++ b/examples/peripheral_band/peripheral_band.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_band/peripheral_band.uvprojx b/examples/peripheral_band/peripheral_band.uvprojx index 40a0c5e05..986bd1aa6 100644 --- a/examples/peripheral_band/peripheral_band.uvprojx +++ b/examples/peripheral_band/peripheral_band.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_battery/flash_download.ini b/examples/peripheral_battery/flash_download.ini index 21906f8da..df7e23bc7 100644 --- a/examples/peripheral_battery/flash_download.ini +++ b/examples/peripheral_battery/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_battery/peripheral_battery.ingw b/examples/peripheral_battery/peripheral_battery.ingw index 1ec5a0ffa..a40d25aff 100644 --- a/examples/peripheral_battery/peripheral_battery.ingw +++ b/examples/peripheral_battery/peripheral_battery.ingw @@ -1,285 +1,57 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "ble_50": false, - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_battery", - "sdk_release_path": "../..", - "adv_data": "// 0x09 - «Complete Local Name»\r\n13, 0x09,\r\n0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5F, \r\n0x64, 0x65, 0x6D, 0x6F, \r\n\r\n// 0x03 - «Complete List of 16-bit Service Class UUIDs»\r\n3, 0x03,\r\n0x0F, 0x18, \r\n\r\n// Total size = 18 bytes\r\n", - "wizard_dir": "C:\\projects\\ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_battery", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "ble_50": false, + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_battery", + "sdk_release_path": "..\/..", + "adv_data": "\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n13, 0x09,\r\n0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x5F, \r\n0x64, 0x65, 0x6D, 0x6F, \r\n\r\n\/\/ 0x03 - \ufffd\ufffdComplete List of 16-bit Service Class UUIDs\ufffd\ufffd\r\n3, 0x03,\r\n0x0F, 0x18, \r\n\r\n\/\/ Total size = 18 bytes\r\n", + "wizard_dir": "C:\\projects\\ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_battery", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n" +} \ No newline at end of file diff --git a/examples/peripheral_battery/peripheral_battery.uvproj b/examples/peripheral_battery/peripheral_battery.uvproj index 8b55c82fe..cea584deb 100644 --- a/examples/peripheral_battery/peripheral_battery.uvproj +++ b/examples/peripheral_battery/peripheral_battery.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_battery/peripheral_battery.uvprojx b/examples/peripheral_battery/peripheral_battery.uvprojx index e4c6fd23e..c8b990db8 100644 --- a/examples/peripheral_battery/peripheral_battery.uvprojx +++ b/examples/peripheral_battery/peripheral_battery.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_console/flash_download.ini b/examples/peripheral_console/flash_download.ini index 1574cf3b7..a3eb19ef4 100644 --- a/examples/peripheral_console/flash_download.ini +++ b/examples/peripheral_console/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_console/peripheral_console.ingw b/examples/peripheral_console/peripheral_console.ingw index c980a4f96..994996a0a 100644 --- a/examples/peripheral_console/peripheral_console.ingw +++ b/examples/peripheral_console/peripheral_console.ingw @@ -1,291 +1,63 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_console", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x07 - «Complete List of 128-bit Service Class UUIDs»\r\n17, 0x07,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\r\n// 0x09 - «Complete Local Name»\r\n8, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x43, 0x6D, 0x64, \r\n\r\n// Total size = 30 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": false, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_console", - "power_saving": false, - "gatt_handle_value": "6", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x43, 0x6D, 0x64, \r\n\r\n// Service INGChips Generic I/O Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n// Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n// Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n// total size = 172\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_GENERIC_INPUT=6\r\n// HANDLE_GENERIC_OUTPUT=8\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_GENERIC_INPUT_OFFSET=111\r\n// HANDLE_GENERIC_OUTPUT_OFFSET=160\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_console", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x07 - \ufffd\ufffdComplete List of 128-bit Service Class UUIDs\ufffd\ufffd\r\n17, 0x07,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n8, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x43, 0x6D, 0x64, \r\n\r\n\/\/ Total size = 30 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": false, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_console", + "power_saving": false, + "gatt_handle_value": "6", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_GENERIC_INPUT", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x43, 0x6D, 0x64, \r\n\r\n\/\/ Service INGChips Generic I\/O Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 172\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=160\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_console/peripheral_console.uvproj b/examples/peripheral_console/peripheral_console.uvproj index 13fb1f3ef..724f7d46d 100644 --- a/examples/peripheral_console/peripheral_console.uvproj +++ b/examples/peripheral_console/peripheral_console.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_console/peripheral_console.uvprojx b/examples/peripheral_console/peripheral_console.uvprojx index 9bd4dd8fb..c070c1c05 100644 --- a/examples/peripheral_console/peripheral_console.uvprojx +++ b/examples/peripheral_console/peripheral_console.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_etag/flash_download.ini b/examples/peripheral_etag/flash_download.ini index 40e873726..4580a4799 100644 --- a/examples/peripheral_etag/flash_download.ini +++ b/examples/peripheral_etag/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_etag/peripheral_etag.ingw b/examples/peripheral_etag/peripheral_etag.ingw index 1bb066648..03d0541b8 100644 --- a/examples/peripheral_etag/peripheral_etag.ingw +++ b/examples/peripheral_etag/peripheral_etag.ingw @@ -1,290 +1,62 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "ble_50": false, - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_etag", - "sdk_release_path": "../..", - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n9, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x65, 0x54, 0x61, 0x67, \r\n\r\n// 0x07 - «Complete List of 128-bit Service Class UUIDs»\r\n17, 0x07,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\r\n// Total size = 31 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_etag", - "gatt_handle_value": "8", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_ETAG_DATA", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x65, 0x54, 0x61, 0x67, \r\n\r\n// Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n// Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n// Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x04, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x16, 0x00, 0x04, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n\r\n0x00,0x00\r\n// total size = 164\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_ETAG_CONTROL=6\r\n// HANDLE_ETAG_DATA=8\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "ble_50": false, + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_etag", + "sdk_release_path": "..\/..", + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n9, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x65, 0x54, 0x61, 0x67, \r\n\r\n\/\/ 0x07 - \ufffd\ufffdComplete List of 128-bit Service Class UUIDs\ufffd\ufffd\r\n17, 0x07,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\r\n\/\/ Total size = 31 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_etag", + "gatt_handle_value": "8", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_ETAG_DATA", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x65, 0x54, 0x61, 0x67, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x04, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x16, 0x00, 0x04, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n\r\n0x00,0x00\r\n\/\/ total size = 164\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_ETAG_CONTROL=6\r\n\/\/ HANDLE_ETAG_DATA=8\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_etag/peripheral_etag.uvproj b/examples/peripheral_etag/peripheral_etag.uvproj index 8f9481f7a..f85102275 100644 --- a/examples/peripheral_etag/peripheral_etag.uvproj +++ b/examples/peripheral_etag/peripheral_etag.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_etag/peripheral_etag.uvprojx b/examples/peripheral_etag/peripheral_etag.uvprojx index d838d223a..dbec1b926 100644 --- a/examples/peripheral_etag/peripheral_etag.uvprojx +++ b/examples/peripheral_etag/peripheral_etag.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_ibeacon/flash_download.ini b/examples/peripheral_ibeacon/flash_download.ini index 5bfee051e..9f7a568c1 100644 --- a/examples/peripheral_ibeacon/flash_download.ini +++ b/examples/peripheral_ibeacon/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw index ee160c030..4648ed977 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,288 +1,60 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "ble_50": false, - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_ibeacon", - "sdk_release_path": "../..", - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0xFF - «Manufacturer Specific Data»\r\n26, 0xFF,\r\n0x4C, 0x00, 0x02, 0x15, 0x49, 0x4E, 0x47, 0x43, \r\n0x48, 0x49, 0x50, 0x53, 0x4F, 0x46, 0x46, 0x49, \r\n0x43, 0x45, 0x42, 0x4A, 0x00, 0x00, 0x00, 0x00, \r\n0xCE, \r\n\r\n// Total size = 30 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_ibeacon", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "ble_50": false, + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_ibeacon", + "sdk_release_path": "..\/..", + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0xFF - \ufffd\ufffdManufacturer Specific Data\ufffd\ufffd\r\n26, 0xFF,\r\n0x4C, 0x00, 0x02, 0x15, 0x49, 0x4E, 0x47, 0x43, \r\n0x48, 0x49, 0x50, 0x53, 0x4F, 0x46, 0x46, 0x49, \r\n0x43, 0x45, 0x42, 0x4A, 0x00, 0x00, 0x00, 0x00, \r\n0xCE, \r\n\r\n\/\/ Total size = 30 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_ibeacon", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj index 57a2aab86..8c6923d8b 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx index b89e0a25f..2c4225b2f 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o peripheral_ibeacon.bin ./output/peripheral_ibeacon.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bb0 - 0x6450 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER,OPTIONAL_RF_CLK - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -433,12 +430,11 @@ - - + @@ -446,5 +442,4 @@ -
diff --git a/examples/peripheral_irc/flash_download.ini b/examples/peripheral_irc/flash_download.ini index fec1d6305..8957a76db 100644 --- a/examples/peripheral_irc/flash_download.ini +++ b/examples/peripheral_irc/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_irc/peripheral_irc.ingw b/examples/peripheral_irc/peripheral_irc.ingw index 6e998e620..ff6fbef73 100644 --- a/examples/peripheral_irc/peripheral_irc.ingw +++ b/examples/peripheral_irc/peripheral_irc.ingw @@ -1,296 +1,68 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "eflash_addr": "0x42000", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "priv_addr": "GAP_RANDOM_ADDRESS_OFF", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_irc", - "sdk_release_path": "../..", - "security": false, - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n22, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x52, 0x65, 0x6C, 0x61, \r\n0x79, 0x20, 0x43, 0x68, 0x61, 0x74, 0x20, 0x53, \r\n0x65, 0x72, 0x76, 0x65, 0x72, \r\n\r\n// Total size = 26 bytes\r\n", - "use_eflash": false, - "wizard_dir": "C:/projects/ingWizard", - "key_addr": "0x44000", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_irc", - "power_saving": false, - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "0, 0\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "eflash_addr": "0x42000", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "priv_addr": "GAP_RANDOM_ADDRESS_OFF", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_irc", + "sdk_release_path": "..\/..", + "security": false, + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n22, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x52, 0x65, 0x6C, 0x61, \r\n0x79, 0x20, 0x43, 0x68, 0x61, 0x74, 0x20, 0x53, \r\n0x65, 0x72, 0x76, 0x65, 0x72, \r\n\r\n\/\/ Total size = 26 bytes\r\n", + "use_eflash": false, + "wizard_dir": "C:\/projects\/ingWizard", + "key_addr": "0x44000", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_irc", + "power_saving": false, + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "io_cap": "IO_CAPABILITY_NO_INPUT_NO_OUTPUT", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "0, 0\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_irc/peripheral_irc.uvproj b/examples/peripheral_irc/peripheral_irc.uvproj index ce3db4ceb..3fca32fcf 100644 --- a/examples/peripheral_irc/peripheral_irc.uvproj +++ b/examples/peripheral_irc/peripheral_irc.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_irc/peripheral_irc.uvprojx b/examples/peripheral_irc/peripheral_irc.uvprojx index c230319e4..d519edbf3 100644 --- a/examples/peripheral_irc/peripheral_irc.uvprojx +++ b/examples/peripheral_irc/peripheral_irc.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_led/README.md b/examples/peripheral_led/README.md index 2e53bf419..f471704ab 100644 --- a/examples/peripheral_led/README.md +++ b/examples/peripheral_led/README.md @@ -5,6 +5,6 @@ This example demonstrates how to: * Use PWM/GPIO peripheral. Note: - 1. check main.c for hardware connections; - 1. For V2 board, define `BOARD_V2`. + For PWM controlled LED, define `PWM_LED` (check + `impl_led.c` for hardware connections). diff --git a/examples/peripheral_led/flash_download.ini b/examples/peripheral_led/flash_download.ini index 8da71558c..5ea69bdb3 100644 --- a/examples/peripheral_led/flash_download.ini +++ b/examples/peripheral_led/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_led/peripheral_led.ingw b/examples/peripheral_led/peripheral_led.ingw index c6cd6bf63..5c964b396 100644 --- a/examples/peripheral_led/peripheral_led.ingw +++ b/examples/peripheral_led/peripheral_led.ingw @@ -1,290 +1,62 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_led", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x07 - «Complete List of 128-bit Service Class UUIDs»\r\n17, 0x07,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\r\n// 0x09 - «Complete Local Name»\r\n8, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x4C, 0x45, 0x44, \r\n\r\n// Total size = 30 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_led", - "gatt_handle_value": "6", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x4C, 0x45, 0x44, \r\n\r\n// Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n// Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x02, 0x06, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n// total size = 116\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_RGB_LIGHTING_CONTROL=6\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_RGB_LIGHTING_CONTROL_OFFSET=111\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_led", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x07 - \ufffd\ufffdComplete List of 128-bit Service Class UUIDs\ufffd\ufffd\r\n17, 0x07,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n8, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x4C, 0x45, 0x44, \r\n\r\n\/\/ Total size = 30 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_led", + "gatt_handle_value": "6", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x4C, 0x45, 0x44, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x02, 0x06, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 116\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=111\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_led/peripheral_led.uvopt b/examples/peripheral_led/peripheral_led.uvopt index 41a623d72..7d08d59fa 100644 --- a/examples/peripheral_led/peripheral_led.uvopt +++ b/examples/peripheral_led/peripheral_led.uvopt @@ -173,10 +173,10 @@ 1 0 0 - 6 + 5 0 - 80 - 93 + 1 + 1 0 .\src\main.c main.c @@ -191,7 +191,7 @@ 0 93 0 - 86 + 88 95 0 .\src\profile.c @@ -234,7 +234,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -319,6 +319,22 @@ 0 0 + + 4 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_gpio.c + peripheral_gpio.c + 0 + 0 +
@@ -329,4 +345,4 @@ 0 - \ No newline at end of file + diff --git a/examples/peripheral_led/peripheral_led.uvproj b/examples/peripheral_led/peripheral_led.uvproj index 1ce79ed18..b8ed0d75b 100644 --- a/examples/peripheral_led/peripheral_led.uvproj +++ b/examples/peripheral_led/peripheral_led.uvproj @@ -1,7 +1,10 @@ - + + 1.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -12,27 +15,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -54,8 +57,8 @@ 0 0 - - + + 0 0 0 @@ -64,8 +67,8 @@ 0 0 - - + + 0 0 @@ -73,12 +76,12 @@ 1 0 fromelf.exe --bin -o peripheral_led.bin ./output/peripheral_led.axf - + 0 0 0 - + 0 @@ -92,16 +95,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -138,17 +141,17 @@ 0 1 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini BIN\UL2CM3.DLL @@ -165,7 +168,7 @@ 0 BIN\UL2CM3.DLL "" () - + @@ -197,7 +200,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -294,8 +297,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -319,8 +322,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -328,7 +331,7 @@ 0x0 - + 1 @@ -347,7 +350,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -361,10 +364,10 @@ 0 0 - - - - + + + + @@ -376,12 +379,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -442,6 +445,11 @@ 1 ..\..\src\FWlib\peripheral_pwm.c + + peripheral_gpio.c + 1 + ..\..\src\FWlib\peripheral_gpio.c + @@ -450,4 +458,5 @@ +
diff --git a/examples/peripheral_led/peripheral_led.uvprojx b/examples/peripheral_led/peripheral_led.uvprojx index 5c3ef07d5..d0cee1345 100644 --- a/examples/peripheral_led/peripheral_led.uvprojx +++ b/examples/peripheral_led/peripheral_led.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_led/src/impl_led.c b/examples/peripheral_led/src/impl_led.c index c1b996456..b7d531638 100644 --- a/examples/peripheral_led/src/impl_led.c +++ b/examples/peripheral_led/src/impl_led.c @@ -1,5 +1,5 @@ -#ifdef BOARD_V2 +#ifndef PWM_LED #define PIN_SDI GIO_GPIO_0 diff --git a/examples/peripheral_pedometer/flash_download.ini b/examples/peripheral_pedometer/flash_download.ini index 352610fc6..69db3ec31 100644 --- a/examples/peripheral_pedometer/flash_download.ini +++ b/examples/peripheral_pedometer/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_pedometer/peripheral_pedometer.ingw b/examples/peripheral_pedometer/peripheral_pedometer.ingw index 86873107b..ff2bf673b 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.ingw +++ b/examples/peripheral_pedometer/peripheral_pedometer.ingw @@ -1,287 +1,59 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "ble_50": false, - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_pedometer", - "sdk_release_path": "../..", - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n14, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x65, 0x64, 0x6F, \r\n0x6D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n// 0x03 - «Complete List of 16-bit Service Class UUIDs»\r\n3, 0x03,\r\n0x14, 0x18, \r\n\r\n// 0x19 - «Appearance»\r\n3, 0x19,\r\n0x40, 0x04, \r\n\r\n// Total size = 26 bytes\r\n", - "wizard_dir": "C:\\projects\\ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_pedometer", - "gatt_handle_value": "11", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x15, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x65, 0x64, 0x6F, \r\n0x6D, 0x65, 0x74, 0x65, 0x72, \r\n// Characteristic Appearance: 2A01\r\n0x0D, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x28,\r\n0x02, 0x05, 0x00, 0x01, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x2A,\r\n0x40, 0x04, \r\n\r\n// Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n// Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x08, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n// Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x03, 0x28,\r\n0x02, 0x0B, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n0x00,0x00\r\n// total size = 143\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_APPEARANCE=5\r\n// HANDLE_RSC_MEASUREMENT=8\r\n// HANDLE_RSC_FEATURE=11\r\n", - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "ble_50": false, + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_pedometer", + "sdk_release_path": "..\/..", + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n14, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x65, 0x64, 0x6F, \r\n0x6D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n\/\/ 0x03 - \ufffd\ufffdComplete List of 16-bit Service Class UUIDs\ufffd\ufffd\r\n3, 0x03,\r\n0x14, 0x18, \r\n\r\n\/\/ 0x19 - \ufffd\ufffdAppearance\ufffd\ufffd\r\n3, 0x19,\r\n0x40, 0x04, \r\n\r\n\/\/ Total size = 26 bytes\r\n", + "wizard_dir": "C:\\projects\\ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_pedometer", + "gatt_handle_value": "11", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_RSC_FEATURE", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x15, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x65, 0x64, 0x6F, \r\n0x6D, 0x65, 0x74, 0x65, 0x72, \r\n\/\/ Characteristic Appearance: 2A01\r\n0x0D, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x28,\r\n0x02, 0x05, 0x00, 0x01, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x2A,\r\n0x40, 0x04, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x08, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x03, 0x28,\r\n0x02, 0x0B, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 143\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_APPEARANCE=5\r\n\/\/ HANDLE_RSC_MEASUREMENT=8\r\n\/\/ HANDLE_RSC_FEATURE=11\r\n" +} \ No newline at end of file diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvopt b/examples/peripheral_pedometer/peripheral_pedometer.uvopt index 554b7142c..8740db69b 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvopt +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvopt @@ -146,24 +146,7 @@ -UV0MCU118 -O206 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO2 -FD20000000 -FC8000 -FN1 -FF0ING91800 -FS04000 -FL080000 - - - 0 - 0 - 225 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - C:\projects\svn\SDK_Release\examples\peripheral_pedometer\src\step_calc.c - - -
-
+ 0 @@ -208,12 +191,12 @@ 1 1 1 - 1 + 0 0 42 0 - 92 - 105 + 0 + 0 0 .\src\main.c main.c @@ -228,8 +211,8 @@ 0 74 0 - 81 - 145 + 0 + 0 0 .\src\profile.c profile.c @@ -242,10 +225,10 @@ 1 0 0 - 13 + 6 0 - 249 - 262 + 0 + 0 0 .\src\step_calc.c step_calc.c @@ -256,12 +239,12 @@ 1 4 1 - 1 + 0 0 - 30 + 33 0 - 109 - 122 + 0 + 0 0 .\src\bma2x2_support.c bma2x2_support.c @@ -284,8 +267,8 @@ 0 0 0 - 1 - 1 + 0 + 0 0 .\src\startup_ing91800.s startup_ing91800.s @@ -303,7 +286,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -322,10 +305,10 @@ 1 0 0 - 15 + 24 0 - 700 - 715 + 0 + 0 0 ..\..\src\BSP\bma2x2.c bma2x2.c @@ -340,8 +323,8 @@ 0 0 0 - 4 - 7 + 0 + 0 0 ..\..\src\BSP\iic.c iic.c @@ -396,8 +379,8 @@ 0 0 0 - 40 - 41 + 0 + 0 0 ..\..\src\FWlib\peripheral_i2c.c peripheral_i2c.c @@ -420,6 +403,22 @@ 0 0 + + 4 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + @@ -430,4 +429,4 @@ 0 - \ No newline at end of file + diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvoptx b/examples/peripheral_pedometer/peripheral_pedometer.uvoptx index ed46049d5..a6363edfd 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvoptx +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvoptx @@ -265,7 +265,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvproj b/examples/peripheral_pedometer/peripheral_pedometer.uvproj index 11efec76e..fa8ff2eb4 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvproj +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvproj @@ -1,7 +1,10 @@ - + + 1.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -12,27 +15,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -54,8 +57,8 @@ 0 0 - - + + 0 0 0 @@ -64,8 +67,8 @@ 0 0 - - + + 0 0 @@ -73,12 +76,12 @@ 1 0 fromelf.exe --bin -o peripheral_pedometer.bin ./output/peripheral_pedometer.axf - + 0 0 0 - + 0 @@ -92,16 +95,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -138,17 +141,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -165,7 +168,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -197,7 +200,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -294,8 +297,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -319,8 +322,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -328,7 +331,7 @@ 0x0 - + 1 @@ -347,7 +350,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -361,10 +364,10 @@ 0 0 - - - - + + + + @@ -376,12 +379,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -464,6 +467,11 @@ 1 ..\..\src\FWlib\peripheral_timer.c + + peripheral_pinctrl.c + 1 + ..\..\src\FWlib\peripheral_pinctrl.c + @@ -472,4 +480,5 @@ +
diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx index a81d5db02..714a788c3 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o peripheral_pedometer.bin ./output/peripheral_pedometer.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -467,11 +470,12 @@ + - + @@ -479,4 +483,5 @@ +
diff --git a/examples/peripheral_piano/flash_download.ini b/examples/peripheral_piano/flash_download.ini index d98f5b7f1..6f0c17794 100644 --- a/examples/peripheral_piano/flash_download.ini +++ b/examples/peripheral_piano/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/peripheral_piano/peripheral_piano.ingw b/examples/peripheral_piano/peripheral_piano.ingw index b71421040..bb0e351c0 100644 --- a/examples/peripheral_piano/peripheral_piano.ingw +++ b/examples/peripheral_piano/peripheral_piano.ingw @@ -1,291 +1,63 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_piano", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n10, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x69, 0x61, 0x6E, \r\n0x6F, \r\n\r\n// Total size = 14 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_piano", - "power_saving": false, - "gatt_handle_value": "6", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_KEY_INPUT", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x11, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x69, 0x61, 0x6E, \r\n0x6F, \r\n\r\n// Service INGChips Piano Service: {00000002-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x02, 0x00, 0x00, 0x00, \r\n// Characteristic Key Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n// total size = 115\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_KEY_INPUT=6\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_KEY_INPUT_OFFSET=113\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_piano", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n10, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x69, 0x61, 0x6E, \r\n0x6F, \r\n\r\n\/\/ Total size = 14 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_piano", + "power_saving": false, + "gatt_handle_value": "6", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_KEY_INPUT", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x11, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x69, 0x61, 0x6E, \r\n0x6F, \r\n\r\n\/\/ Service INGChips Piano Service: {00000002-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x02, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Key Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 115\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_KEY_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_KEY_INPUT_OFFSET=113\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_piano/peripheral_piano.uvproj b/examples/peripheral_piano/peripheral_piano.uvproj index c42d61f17..a49369007 100644 --- a/examples/peripheral_piano/peripheral_piano.uvproj +++ b/examples/peripheral_piano/peripheral_piano.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_piano/peripheral_piano.uvprojx b/examples/peripheral_piano/peripheral_piano.uvprojx index fdcc75c3d..560e9392c 100644 --- a/examples/peripheral_piano/peripheral_piano.uvprojx +++ b/examples/peripheral_piano/peripheral_piano.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_throughput/flash_download.ini b/examples/peripheral_throughput/flash_download.ini index cee2651cc..64882bb83 100644 --- a/examples/peripheral_throughput/flash_download.ini +++ b/examples/peripheral_throughput/flash_download.ini @@ -16,7 +16,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] @@ -31,7 +31,7 @@ Baud=115200 Parity= DataBits=8 StopBits=1 -Port=COM5 +Port=COM3 AsyncIO=0 [main] diff --git a/examples/peripheral_throughput/peripheral_throughput.ingw b/examples/peripheral_throughput/peripheral_throughput.ingw index c6415cff5..9d7679fe0 100644 --- a/examples/peripheral_throughput/peripheral_throughput.ingw +++ b/examples/peripheral_throughput/peripheral_throughput.ingw @@ -1,291 +1,63 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "peripheral_throughput", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x07 - «Complete List of 128-bit Service Class UUIDs»\r\n17, 0x07,\r\n0x85, 0x14, 0x50, 0x6F, 0xFB, 0xFD, 0xD1, 0xB4, \r\n0x74, 0x48, 0xD4, 0xA1, 0x4A, 0x31, 0x45, 0x24, \r\n\r\n// 0x09 - «Complete Local Name»\r\n8, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x70, 0x74, \r\n\r\n// Total size = 30 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\peripheral_throughput", - "power_saving": false, - "gatt_handle_value": "6", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x70, 0x74, \r\n\r\n// Service INGChips Throughput Service: {2445314a-a1d4-4874-b4d1-fdfb6f501485}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x85, 0x14, 0x50, 0x6F, 0xFB, 0xFD, 0xD1, 0xB4, \r\n0x74, 0x48, 0xD4, 0xA1, 0x4A, 0x31, 0x45, 0x24, \r\n// Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n// total size = 113\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_GENERIC_INPUT=6\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_GENERIC_INPUT_OFFSET=111\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "peripheral_throughput", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x07 - \ufffd\ufffdComplete List of 128-bit Service Class UUIDs\ufffd\ufffd\r\n17, 0x07,\r\n0x85, 0x14, 0x50, 0x6F, 0xFB, 0xFD, 0xD1, 0xB4, \r\n0x74, 0x48, 0xD4, 0xA1, 0x4A, 0x31, 0x45, 0x24, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n8, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x70, 0x74, \r\n\r\n\/\/ Total size = 30 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\peripheral_throughput", + "power_saving": false, + "gatt_handle_value": "6", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_GENERIC_INPUT", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x70, 0x74, \r\n\r\n\/\/ Service INGChips Throughput Service: {2445314a-a1d4-4874-b4d1-fdfb6f501485}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x85, 0x14, 0x50, 0x6F, 0xFB, 0xFD, 0xD1, 0xB4, \r\n0x74, 0x48, 0xD4, 0xA1, 0x4A, 0x31, 0x45, 0x24, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 113\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/peripheral_throughput/peripheral_throughput.uvoptx b/examples/peripheral_throughput/peripheral_throughput.uvoptx index ff9dd3cfc..bda2e620e 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvoptx +++ b/examples/peripheral_throughput/peripheral_throughput.uvoptx @@ -241,7 +241,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_throughput/peripheral_throughput.uvproj b/examples/peripheral_throughput/peripheral_throughput.uvproj index d1a0c2042..739d0f610 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvproj +++ b/examples/peripheral_throughput/peripheral_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/peripheral_throughput/peripheral_throughput.uvprojx b/examples/peripheral_throughput/peripheral_throughput.uvprojx index 4ecd503c2..a0224a855 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvprojx +++ b/examples/peripheral_throughput/peripheral_throughput.uvprojx @@ -294,8 +294,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/secondary_fota/flash_download.ini b/examples/secondary_fota/flash_download.ini index 54c6ccf6c..cf192e98d 100644 --- a/examples/secondary_fota/flash_download.ini +++ b/examples/secondary_fota/flash_download.ini @@ -6,7 +6,7 @@ entry=0x0 set-entry=0 launch=0 batch=1 -batch.current=0 +batch.current=28 batch.limit=-1 protection.enabled=0 protection.unlock=0 @@ -15,18 +15,18 @@ script= [bin-0] Name=Burn Bin #1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 Checked=0 [bin-1] Name=Burn Bin #2 Checked=1 -Address=532480 +Address=524288 FileName=secondary_fota.bin [uart] -Port=COM1 +Port=COM3 Baud=115200 Parity= DataBits=8 diff --git a/examples/secondary_fota/secondary_fota.ingw b/examples/secondary_fota/secondary_fota.ingw index 80c1f01ca..e29fbc039 100644 --- a/examples/secondary_fota/secondary_fota.ingw +++ b/examples/secondary_fota/secondary_fota.ingw @@ -2,18 +2,18 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132444, + "size": 131868, "base": 16384 }, "ram": { - "size": 30608, + "size": 30528, "base": 536880208 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_shutdown","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ 0,15,0] }, @@ -47,7 +47,7 @@ "pb_adv": true, "pb_gatt": true, "deep_sleep": true, - "proj_dir": "C:\\projects\\svn\\SDK_Release\\examples\\secondary_fota", + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\secondary_fota", "power_saving": false, "secondary": true, "bundle": "typical", @@ -64,8 +64,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25632, - "app_ram_addr": 536910816, + "app_ram_size": 25712, + "app_ram_addr": 536910736, "uart_log": true, "ota_ver_patch": "1", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x1A, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x65, 0x63, 0x6F, \r\n0x6E, 0x64, 0x61, 0x72, 0x79, 0x20, 0x46, 0x4F, \r\n0x54, 0x41, \r\n\r\n\/\/ Service INGChips FOTA Service: {3345c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Version: {3345c2f1-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF1, \r\n0xC2, 0x45, 0x33, \r\n0x1E, 0x00, 0x02, 0x02, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF1, 0xC2, 0x45, 0x33, \r\n0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x28, 0x01, \r\n\/\/ Characteristic FOTA Control: {3345c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x06, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x06, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Data: {3345c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x04, 0x0A, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x04, 0x03, 0x0A, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x33, \r\n\r\n0x00,0x00\r\n\/\/ total size = 230\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_FOTA_VERSION=6\r\n\/\/ HANDLE_FOTA_CONTROL=8\r\n\/\/ HANDLE_FOTA_DATA=10\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_FOTA_VERSION_OFFSET=122\r\n\/\/ HANDLE_FOTA_CONTROL_OFFSET=179\r\n\/\/ HANDLE_FOTA_DATA_OFFSET=228\r\n", diff --git a/examples/secondary_fota/secondary_fota.uvopt b/examples/secondary_fota/secondary_fota.uvopt index a988640cf..f2c271a3a 100644 --- a/examples/secondary_fota/secondary_fota.uvopt +++ b/examples/secondary_fota/secondary_fota.uvopt @@ -297,13 +297,13 @@ 5 3 0 - 1 - 52301636 + 0 + 0 0 0 - 5 + 0 0 - ../..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -366,4 +366,4 @@ 0 - \ No newline at end of file + diff --git a/examples/secondary_fota/secondary_fota.uvoptx b/examples/secondary_fota/secondary_fota.uvoptx index 3abb49b62..1beafd33f 100644 --- a/examples/secondary_fota/secondary_fota.uvoptx +++ b/examples/secondary_fota/secondary_fota.uvoptx @@ -186,7 +186,7 @@ APP - 0 + 1 0 0 0 @@ -230,7 +230,7 @@ StartUP - 0 + 1 0 0 0 @@ -253,7 +253,7 @@ 0 0 0 - ../..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -316,4 +316,4 @@ 1 - \ No newline at end of file + diff --git a/examples/secondary_fota/secondary_fota.uvproj b/examples/secondary_fota/secondary_fota.uvproj index 291bd9675..ad87fd393 100644 --- a/examples/secondary_fota/secondary_fota.uvproj +++ b/examples/secondary_fota/secondary_fota.uvproj @@ -1,7 +1,10 @@ - + + 1.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -12,27 +15,27 @@ ING91800 INGCHIPS CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -54,8 +57,8 @@ 0 0 - - + + 0 0 0 @@ -64,8 +67,8 @@ 0 0 - - + + 0 0 @@ -73,12 +76,12 @@ 1 0 fromelf.exe --bin -o secondary_fota.bin ./output/secondary_fota.axf - + 0 0 0 - + 0 @@ -92,16 +95,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -138,17 +141,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -165,7 +168,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -197,7 +200,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -319,8 +322,8 @@ 0 - 536910816 - 25632 + 0x20009b90 + 0x6470 0 @@ -328,7 +331,7 @@ 0x0 - + 1 @@ -347,7 +350,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -361,10 +364,10 @@ 0 0 - - - - + + + + @@ -376,12 +379,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -417,7 +420,7 @@ symdefs.m 3 - ../..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m
@@ -445,4 +448,5 @@ + diff --git a/examples/secondary_fota/secondary_fota.uvprojx b/examples/secondary_fota/secondary_fota.uvprojx index 9f294bd83..6b3ecb970 100644 --- a/examples/secondary_fota/secondary_fota.uvprojx +++ b/examples/secondary_fota/secondary_fota.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o secondary_fota.bin ./output/secondary_fota.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 0x26000 - 0x5e000 + 0x80000 + 0x2000 1 @@ -294,8 +297,8 @@ 0 - 536910816 - 25632 + 0x20009b90 + 0x6470 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -404,7 +407,7 @@ symdefs.m 3 - ../..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m @@ -435,11 +438,12 @@ + - + @@ -447,4 +451,5 @@ +
diff --git a/examples/secondary_fota/src/ota_service.c b/examples/secondary_fota/src/ota_service.c index ac5bf62c8..75a76c248 100644 --- a/examples/secondary_fota/src/ota_service.c +++ b/examples/secondary_fota/src/ota_service.c @@ -12,6 +12,7 @@ #include "att_db.h" #include "ota_service.h" #include "platform_api.h" +#include "rom_tools.h" #define RTC_CHIP_STAT_ADDR (0x40050004) #define CLK_FREQ_STAT_POS 3 @@ -46,9 +47,6 @@ uint8_t ota_downloading = 0; uint32_t ota_addr = 0; uint32_t ota_start_addr = 0; -typedef uint16_t (* f_crc_t)(uint8_t *buffer , uint16_t usDataLen); -#define crc ((f_crc_t)(0x00000a25)) - int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) { if (transaction_mode != ATT_TRANSACTION_MODE_NONE) diff --git a/examples/secondary_fota/src/profile.c b/examples/secondary_fota/src/profile.c index 891fbf52f..5fa5a301e 100644 --- a/examples/secondary_fota/src/profile.c +++ b/examples/secondary_fota/src/profile.c @@ -139,7 +139,7 @@ static btstack_packet_callback_registration_t hci_event_callback_registration; uint32_t setup_profile(void *data, void *user_data) { - platform_printf("secondary apps...\n"); + platform_printf("secondary fota: %d...\n", platform_read_persistent_reg()); // Note: security has not been enabled. att_server_init(att_read_callback, att_write_callback); hci_event_callback_registration.callback = &user_packet_handler; diff --git a/examples/smart_meter/flash_download.ini b/examples/smart_meter/flash_download.ini index abd784584..c32fc783c 100644 --- a/examples/smart_meter/flash_download.ini +++ b/examples/smart_meter/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/smart_meter/smart_meter.ingw b/examples/smart_meter/smart_meter.ingw index de61efd8e..71cff3c0b 100644 --- a/examples/smart_meter/smart_meter.ingw +++ b/examples/smart_meter/smart_meter.ingw @@ -1,292 +1,64 @@ { - "watchdog": false, - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "watchdog": false, + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "smart_meter", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n16, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x6D, 0x61, 0x72, \r\n0x74, 0x20, 0x4D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n// Total size = 20 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\smart_meter", - "power_saving": false, - "gatt_handle_value": "6", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x17, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x6D, 0x61, 0x72, \r\n0x74, 0x20, 0x4D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n// Service INGChips Console Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n// Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n// Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n// total size = 180\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_GENERIC_INPUT=6\r\n// HANDLE_GENERIC_OUTPUT=8\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_GENERIC_INPUT_OFFSET=119\r\n// HANDLE_GENERIC_OUTPUT_OFFSET=168\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "smart_meter", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n16, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x6D, 0x61, 0x72, \r\n0x74, 0x20, 0x4D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n\/\/ Total size = 20 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\smart_meter", + "power_saving": false, + "gatt_handle_value": "6", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_GENERIC_INPUT", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x17, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x6D, 0x61, 0x72, \r\n0x74, 0x20, 0x4D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n\/\/ Service INGChips Console Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 180\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=119\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=168\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/smart_meter/smart_meter.uvopt b/examples/smart_meter/smart_meter.uvopt index d98be3688..99c914b95 100644 --- a/examples/smart_meter/smart_meter.uvopt +++ b/examples/smart_meter/smart_meter.uvopt @@ -202,8 +202,8 @@ 0 54 0 - 86 - 96 + 0 + 0 0 .\src\main.c main.c @@ -218,8 +218,8 @@ 0 45 0 - 287 - 627 + 0 + 0 0 .\src\profile.c profile.c @@ -234,8 +234,8 @@ 0 101 0 - 63 - 64 + 0 + 0 0 .\src\uart_console.c uart_console.c @@ -293,7 +293,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -386,6 +386,22 @@ 0 0 + + 5 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\Tools\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + diff --git a/examples/smart_meter/smart_meter.uvoptx b/examples/smart_meter/smart_meter.uvoptx index 4f02f3fe6..93c88d605 100644 --- a/examples/smart_meter/smart_meter.uvoptx +++ b/examples/smart_meter/smart_meter.uvoptx @@ -242,7 +242,7 @@ StartUP - 0 + 1 0 0 0 @@ -342,6 +342,18 @@ 0 0 + + 5 + 11 + 1 + 0 + 0 + 0 + ..\..\src\Tools\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + diff --git a/examples/smart_meter/smart_meter.uvproj b/examples/smart_meter/smart_meter.uvproj index d29d13b4b..bc8bb8cf3 100644 --- a/examples/smart_meter/smart_meter.uvproj +++ b/examples/smart_meter/smart_meter.uvproj @@ -1,7 +1,10 @@ - + + 1.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -12,27 +15,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -54,8 +57,8 @@ 0 0 - - + + 0 0 0 @@ -64,8 +67,8 @@ 0 0 - - + + 0 0 @@ -73,12 +76,12 @@ 1 0 fromelf.exe --bin -o smart_meter.bin ./output/smart_meter.axf - + 0 0 0 - + 0 @@ -92,16 +95,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -138,17 +141,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -165,7 +168,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -197,7 +200,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -294,8 +297,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -319,8 +322,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -328,7 +331,7 @@ 0x0 - + 1 @@ -347,7 +350,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -361,10 +364,10 @@ 0 0 - - - - + + + + @@ -376,12 +379,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -457,9 +460,15 @@ 1 ..\..\src\Tools\ad_parser.c + + SEGGER_RTT.c + 1 + ..\..\src\Tools\SEGGER_RTT.c +
+ diff --git a/examples/smart_meter/smart_meter.uvprojx b/examples/smart_meter/smart_meter.uvprojx index 4d461f589..a89f940eb 100644 --- a/examples/smart_meter/smart_meter.uvprojx +++ b/examples/smart_meter/smart_meter.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o smart_meter.bin ./output/smart_meter.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bb0 - 0x6450 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -447,6 +444,11 @@ 1 ..\..\src\Tools\ad_parser.c + + SEGGER_RTT.c + 1 + ..\..\src\Tools\SEGGER_RTT.c + @@ -455,12 +457,11 @@ - - + @@ -468,5 +469,4 @@ -
diff --git a/examples/smart_meter/src/main.c b/examples/smart_meter/src/main.c index bd9450a1e..3b885dcd9 100644 --- a/examples/smart_meter/src/main.c +++ b/examples/smart_meter/src/main.c @@ -5,6 +5,7 @@ #include "FreeRTOS.h" #include "task.h" #include +#include "SEGGER_RTT.h" #include "uart_console.h" @@ -134,6 +135,17 @@ uint32_t cb_lle_reset(void *_, void * __) return 0; } +uint32_t cb_trace_rtt(const platform_evt_trace_t *trace, void *user_data) +{ + int free_size = SEGGER_RTT_GetAvailWriteSpace(0); + if (trace->len1 + trace->len2 < free_size) + { + SEGGER_RTT_Write(0, trace->data1, trace->len1); + SEGGER_RTT_Write(0, trace->data2, trace->len2); + } + return 0; +} + int app_main() { // If there are *three* crystals on board, *uncomment* below line. @@ -158,6 +170,10 @@ int app_main() platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER1, timer_isr, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_LLE_INIT, cb_lle_reset, NULL); + SEGGER_RTT_Init(); + platform_set_evt_callback(PLATFORM_CB_EVT_TRACE, (f_platform_evt_cb)cb_trace_rtt, NULL); + platform_config(PLATFORM_CFG_TRACE_MASK, 0xff); + return 0; } diff --git a/examples/thermo_ota/flash_download.ini b/examples/thermo_ota/flash_download.ini index f0e443634..bdd43ae91 100644 --- a/examples/thermo_ota/flash_download.ini +++ b/examples/thermo_ota/flash_download.ini @@ -1,7 +1,7 @@ [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/thermo_ota/thermo_ota.ingw b/examples/thermo_ota/thermo_ota.ingw index f4627def0..657b108c2 100644 --- a/examples/thermo_ota/thermo_ota.ingw +++ b/examples/thermo_ota/thermo_ota.ingw @@ -1,265 +1,37 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ide": "keil", - "arm_cc": "C:/keil/ARM/ARMCC", - "kei_uv_exe": "c:\\keil\\UV4\\UV4.exe", - "proj_name": "thermo_ota", - "sdk_release_path": "../..", - "proj_dir": "C:/projects/svn/SDK_Release/examples\\thermo_ota", - "sdk_release_dir": "", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "arm_inc": "C:/keil/ARM/ARMCC/include", - "cmsis": "", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "series": "ING9188xx" -} + "ram": { + "size": 30528, + "base": 536880208 + }, + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ide": "keil", + "arm_cc": "C:\/keil\/ARM\/ARMCC", + "kei_uv_exe": "c:\\keil\\UV4\\UV4.exe", + "series": "ING9188xx", + "proj_name": "thermo_ota", + "sdk_release_path": "..\/..", + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\thermo_ota", + "sdk_release_dir": "", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "arm_inc": "C:\/keil\/ARM\/ARMCC\/include", + "cmsis": "", + "app_ram_size": 25712, + "app_ram_addr": 536910736 +} \ No newline at end of file diff --git a/examples/thermo_ota/thermo_ota.uvoptx b/examples/thermo_ota/thermo_ota.uvoptx index 0adced06e..9b57151f7 100644 --- a/examples/thermo_ota/thermo_ota.uvoptx +++ b/examples/thermo_ota/thermo_ota.uvoptx @@ -322,7 +322,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -363,7 +363,7 @@ FWlib - 0 + 1 0 0 0 diff --git a/examples/thermo_ota/thermo_ota.uvproj b/examples/thermo_ota/thermo_ota.uvproj index 3aa627479..e9b6df8aa 100644 --- a/examples/thermo_ota/thermo_ota.uvproj +++ b/examples/thermo_ota/thermo_ota.uvproj @@ -332,8 +332,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/thermo_ota/thermo_ota.uvprojx b/examples/thermo_ota/thermo_ota.uvprojx index 4c20c4839..8f7987bb1 100644 --- a/examples/thermo_ota/thermo_ota.uvprojx +++ b/examples/thermo_ota/thermo_ota.uvprojx @@ -297,8 +297,8 @@ 0 - 0x20009bb0 - 0x6450 + 0x20009b90 + 0x6470 0 diff --git a/examples/uart_console/flash_download.ini b/examples/uart_console/flash_download.ini index 44da3a8d8..7134933b1 100644 --- a/examples/uart_console/flash_download.ini +++ b/examples/uart_console/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=1 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/uart_console/uart_console.ingw b/examples/uart_console/uart_console.ingw index fb617483f..5f4b3248f 100644 --- a/examples/uart_console/uart_console.ingw +++ b/examples/uart_console/uart_console.ingw @@ -1,291 +1,63 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "uart_console", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "0\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\uart_console", - "power_saving": false, - "gatt_handle_value": "3", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_DEVICE_NAME", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x14, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x55, 0x41, 0x52, 0x54, 0x20, 0x43, 0x6F, 0x6E, \r\n0x73, 0x6F, 0x6C, 0x65, \r\n\r\n0x00,0x00\r\n// total size = 45\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n", - "coding_profile": false, - "series": "ING9188xx" -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "uart_console", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "0\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\uart_console", + "power_saving": false, + "gatt_handle_value": "3", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_DEVICE_NAME", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x14, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x55, 0x41, 0x52, 0x54, 0x20, 0x43, 0x6F, 0x6E, \r\n0x73, 0x6F, 0x6C, 0x65, \r\n\r\n0x00,0x00\r\n\/\/ total size = 45\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/uart_console/uart_console.uvproj b/examples/uart_console/uart_console.uvproj index 10824eb8c..8d91fc66f 100644 --- a/examples/uart_console/uart_console.uvproj +++ b/examples/uart_console/uart_console.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/uart_console/uart_console.uvprojx b/examples/uart_console/uart_console.uvprojx index ebe9e2152..2b9bf9263 100644 --- a/examples/uart_console/uart_console.uvprojx +++ b/examples/uart_console/uart_console.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o uart_console.bin ./output/uart_console.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009bb0 - 0x6450 + 536910736 + 25712 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -438,12 +435,11 @@ - - + @@ -451,5 +447,4 @@ -
diff --git a/examples/voice_remote_ctrl/flash_download.ini b/examples/voice_remote_ctrl/flash_download.ini index dd65371e3..df26e29db 100644 --- a/examples/voice_remote_ctrl/flash_download.ini +++ b/examples/voice_remote_ctrl/flash_download.ini @@ -16,7 +16,7 @@ script= [bin-0] Name=Burn Bin #1 Checked=0 -FileName=../../bundles/typical/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 [bin-1] diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw index 0d85eee13..d795d25f8 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw @@ -1,291 +1,63 @@ { - "bundle_meta": { - "rom": { - "size": 131788, - "base": 16384 - }, - "ram": { - "size": 30560, - "base": 536880208 - }, - "app": { - "base": 155648 - }, - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_config", - "platform_shutdown", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_visit", - "xQueueGenericSend", - "xQueueReceive", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueSemaphoreTake", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "version": [ - 0, - 15, - 0 - ] + "bundle_meta": { + "rom": { + "size": 131796, + "base": 16384 }, - "series": "ING9188xx", - "tc_dir": "C:\\Keil_v5\\UV4", - "ide_ver": "5", - "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", - "ota": false, - "ide": "keil", - "git": false, - "scan_data": "0\r\n", - "log_uart1": false, - "enable_hci_log": false, - "ota_ver_minor": "0", - "ota_ver_major": "0", - "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", - "proj_name": "voice_remote_ctrl", - "sdk_release_path": "../..", - "legacy_adv": true, - "adv_data": "// 0x01 - «Flags»\r\n2, 0x01,\r\n0x06, \r\n\r\n// 0x09 - «Complete Local Name»\r\n25, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x56, 0x6F, 0x69, 0x63, \r\n0x65, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, \r\n0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, \r\n\r\n// Total size = 29 bytes\r\n", - "wizard_dir": "C:/projects/ingWizard", - "pb_adv": true, - "pb_gatt": true, - "deep_sleep": true, - "proj_dir": "C:/projects/svn/SDK_Release/examples\\voice_remote_ctrl", - "power_saving": false, - "gatt_handle_value": "6", - "bundle": "typical", - "app_rom_size": "385024", - "app_rom_addr": "155648", - "vcode": false, - "role": "peripheral", - "mesh": { - "lowpower": true, - "friend": true, - "relay": true, - "proxy": true + "ram": { + "size": 30528, + "base": 536880208 }, - "keil": true, - "cmsis": "", - "gatt_handle_name": "HANDLE_VOICE_CONTROL", - "app_ram_size": 25680, - "app_ram_addr": 536910768, - "uart_log": true, - "ota_ver_patch": "0", - "profile_data": "// Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n// Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x20, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x56, 0x6F, 0x69, 0x63, \r\n0x65, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, \r\n0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, \r\n\r\n// Service INGChips Voice Output Service: {00000001-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x01, 0x00, 0x00, 0x00, \r\n// Characteristic Voice Control: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n// Characteristic Voice Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n// total size = 189\r\n\r\n// HANDLE_DEVICE_NAME=3\r\n// HANDLE_VOICE_CONTROL=6\r\n// HANDLE_VOICE_OUTPUT=8\r\n\r\n// HANDLE_DEVICE_NAME_OFFSET=31\r\n// HANDLE_VOICE_CONTROL_OFFSET=128\r\n// HANDLE_VOICE_OUTPUT_OFFSET=177\r\n", - "coding_profile": false -} + "app": { + "base": 155648 + }, + "api": [ + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "version": [ + 0,15,0] + }, + "tc_dir": "C:\\Keil_v5\\UV4", + "ide_ver": "5", + "ide_exe": "C:\\Keil_v5\\UV4\\UV4.exe", + "ota": false, + "ide": "keil", + "git": false, + "scan_data": "0\r\n", + "log_uart1": false, + "enable_hci_log": false, + "ota_ver_minor": "0", + "ota_ver_major": "0", + "template": "C:\\projects\\ingWizard\\templates\\typical\\peripheral", + "series": "ING9188xx", + "proj_name": "voice_remote_ctrl", + "sdk_release_path": "..\/..", + "legacy_adv": true, + "adv_data": "\/\/ 0x01 - \ufffd\ufffdFlags\ufffd\ufffd\r\n2, 0x01,\r\n0x06, \r\n\r\n\/\/ 0x09 - \ufffd\ufffdComplete Local Name\ufffd\ufffd\r\n25, 0x09,\r\n0x49, 0x4E, 0x47, 0x20, 0x56, 0x6F, 0x69, 0x63, \r\n0x65, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, \r\n0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, \r\n\r\n\/\/ Total size = 29 bytes\r\n", + "wizard_dir": "C:\/projects\/ingWizard", + "pb_adv": true, + "pb_gatt": true, + "deep_sleep": true, + "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\voice_remote_ctrl", + "power_saving": false, + "gatt_handle_value": "6", + "bundle": "typical", + "app_rom_size": "385024", + "app_rom_addr": "155648", + "vcode": false, + "role": "peripheral", + "mesh": { + "lowpower": true, + "friend": true, + "relay": true, + "proxy": true + }, + "keil": true, + "cmsis": "", + "gatt_handle_name": "HANDLE_VOICE_CONTROL", + "app_ram_size": 25712, + "app_ram_addr": 536910736, + "uart_log": true, + "ota_ver_patch": "0", + "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x20, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x56, 0x6F, 0x69, 0x63, \r\n0x65, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, \r\n0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, \r\n\r\n\/\/ Service INGChips Voice Output Service: {00000001-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x01, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Voice Control: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Voice Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 189\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_VOICE_CONTROL=6\r\n\/\/ HANDLE_VOICE_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_VOICE_CONTROL_OFFSET=128\r\n\/\/ HANDLE_VOICE_OUTPUT_OFFSET=177\r\n", + "coding_profile": false +} \ No newline at end of file diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx index 9ce57a658..8fa1f6af5 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx @@ -254,7 +254,7 @@ StartUP - 0 + 1 0 0 0 @@ -277,7 +277,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj index 3c701a67e..a78b805e3 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj @@ -319,8 +319,8 @@ 0 - 536910768 - 25680 + 536910736 + 25712 0 diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx index 9fa073d07..63856da5f 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o voice_remote_ctrl.bin ./output/voice_remote_ctrl.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910768 - 25680 + 0x20009b90 + 0x6470 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER,DEV_BOARD - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -487,11 +490,12 @@ + - + @@ -499,4 +503,5 @@ +
diff --git a/src/Tools/SEGGER_RTT.h b/src/Tools/SEGGER_RTT.h index 19da8a8fa..6a732001c 100644 --- a/src/Tools/SEGGER_RTT.h +++ b/src/Tools/SEGGER_RTT.h @@ -49,7 +49,7 @@ ---------------------------END-OF-HEADER------------------------------ File : SEGGER_RTT.h Purpose : Implementation of SEGGER real-time transfer which allows - real-time communication on targets which support debugger + real-time communication on targets which support debugger memory accesses while the CPU is running. Revision: $Rev: 19464 $ ---------------------------------------------------------------------- @@ -58,9 +58,10 @@ Revision: $Rev: 19464 $ #ifndef SEGGER_RTT_H #define SEGGER_RTT_H -#include "SEGGER_RTT_Conf.h" +#include "SEGGER_RTT_Conf.h" +#ifndef C2NIM /********************************************************************* * @@ -164,6 +165,10 @@ Revision: $Rev: 19464 $ #endif #endif +#else +#assumendef RTT_USE_ASM +#endif + #ifndef SEGGER_RTT_ASM // defined when SEGGER_RTT.h is included from assembly file #include #include @@ -227,7 +232,12 @@ typedef struct { * ********************************************************************** */ + +#ifndef C2NIM extern SEGGER_RTT_CB _SEGGER_RTT; +#else + +#endif /********************************************************************* * @@ -265,6 +275,9 @@ unsigned SEGGER_RTT_PutCharSkip (unsigned BufferIndex, char c); unsigned SEGGER_RTT_PutCharSkipNoLock (unsigned BufferIndex, char c); unsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex); unsigned SEGGER_RTT_GetBytesInBuffer (unsigned BufferIndex); + +#ifndef C2NIM + // // Function macro for performance optimization // @@ -274,6 +287,8 @@ unsigned SEGGER_RTT_GetBytesInBuffer (unsigned BufferIndex); #define SEGGER_RTT_WriteSkipNoLock SEGGER_RTT_ASM_WriteSkipNoLock #endif +#endif + /********************************************************************* * * RTT transfer functions to send RTT data via other channels. @@ -285,7 +300,9 @@ unsigned SEGGER_RTT_ReadUpBufferNoLock (unsigned BufferIndex, void* pDa unsigned SEGGER_RTT_WriteDownBuffer (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); unsigned SEGGER_RTT_WriteDownBufferNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +#ifndef C2NIM #define SEGGER_RTT_HASDATA_UP(n) (_SEGGER_RTT.aUp[n].WrOff - _SEGGER_RTT.aUp[n].RdOff) +#endif /********************************************************************* * @@ -303,7 +320,10 @@ int SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s); ********************************************************************** */ int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...); + +#ifndef C2NIM int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); +#endif #ifdef __cplusplus } @@ -326,6 +346,10 @@ int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pPa #define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2) // Block: Wait until there is space in the buffer. #define SEGGER_RTT_MODE_MASK (3) +#ifndef SEGGER_RTT_MODE_DEFAULT + #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) +#endif + // // Control sequences, based on ANSI. // Can be used to control color, and clear the screen diff --git a/src/Tools/SEGGER_RTT.nim b/src/Tools/SEGGER_RTT.nim new file mode 100644 index 000000000..e0380aa96 --- /dev/null +++ b/src/Tools/SEGGER_RTT.nim @@ -0,0 +1,285 @@ +## ******************************************************************** +## SEGGER Microcontroller GmbH * +## The Embedded Experts * +## ********************************************************************* +## * +## (c) 1995 - 2019 SEGGER Microcontroller GmbH * +## * +## www.segger.com Support: support@segger.com * +## * +## ********************************************************************* +## * +## SEGGER RTT * Real Time Transfer for embedded targets * +## * +## ********************************************************************* +## * +## All rights reserved. * +## * +## SEGGER strongly recommends to not make any changes * +## to or modify the source code of this software in order to stay * +## compatible with the RTT protocol and J-Link. * +## * +## Redistribution and use in source and binary forms, with or * +## without modification, are permitted provided that the following * +## condition is met: * +## * +## o Redistributions of source code must retain the above copyright * +## notice, this condition and the following disclaimer. * +## * +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +## CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +## INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +## DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +## CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +## OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +## OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +## LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +## USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +## DAMAGE. * +## * +## ********************************************************************* +## * +## RTT version: 6.80c * +## * +## ********************************************************************* +## +## ---------------------------END-OF-HEADER------------------------------ +## File : SEGGER_RTT.h +## Purpose : Implementation of SEGGER real-time transfer which allows +## real-time communication on targets which support debugger +## memory accesses while the CPU is running. +## Revision: $Rev: 19464 $ +## ---------------------------------------------------------------------- +## + +import + SEGGER_RTT_Conf + +when not defined(SEGGER_RTT_ASM): ## defined when SEGGER_RTT.h is included from assembly file + ## ******************************************************************** + ## + ## Defines, fixed + ## + ## ********************************************************************* + ## + ## ******************************************************************** + ## + ## Types + ## + ## ********************************************************************* + ## + ## + ## Description for a circular buffer (also called "ring buffer") + ## which is used as up-buffer (T->H) + ## + type + SEGGER_RTT_BUFFER_UP* {.importc: "SEGGER_RTT_BUFFER_UP", + header: "SEGGER_RTT.h", bycopy.} = object + sName* {.importc: "sName".}: cstring ## Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + pBuffer* {.importc: "pBuffer".}: cstring ## Pointer to start of buffer + SizeOfBuffer* {.importc: "SizeOfBuffer".}: cuint ## Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + WrOff* {.importc: "WrOff".}: cuint ## Position of next item to be written by either target. + RdOff* {.importc: "RdOff".}: cuint ## Position of next item to be read by host. Must be volatile since it may be modified by host. + Flags* {.importc: "Flags".}: cuint ## Contains configuration flags + + ## + ## Description for a circular buffer (also called "ring buffer") + ## which is used as down-buffer (H->T) + ## + type + SEGGER_RTT_BUFFER_DOWN* {.importc: "SEGGER_RTT_BUFFER_DOWN", + header: "SEGGER_RTT.h", bycopy.} = object + sName* {.importc: "sName".}: cstring ## Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + pBuffer* {.importc: "pBuffer".}: cstring ## Pointer to start of buffer + SizeOfBuffer* {.importc: "SizeOfBuffer".}: cuint ## Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + WrOff* {.importc: "WrOff".}: cuint ## Position of next item to be written by host. Must be volatile since it may be modified by host. + RdOff* {.importc: "RdOff".}: cuint ## Position of next item to be read by target (down-buffer). + Flags* {.importc: "Flags".}: cuint ## Contains configuration flags + + ## + ## RTT control block which describes the number of buffers available + ## as well as the configuration for each buffer + ## + ## + type + SEGGER_RTT_CB* {.importc: "SEGGER_RTT_CB", header: "SEGGER_RTT.h", bycopy.} = object + acID* {.importc: "acID".}: array[16, char] ## Initialized to "SEGGER RTT" + MaxNumUpBuffers* {.importc: "MaxNumUpBuffers".}: cint ## Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) + MaxNumDownBuffers* {.importc: "MaxNumDownBuffers".}: cint ## Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) + aUp* {.importc: "aUp".}: array[SEGGER_RTT_MAX_NUM_UP_BUFFERS, + SEGGER_RTT_BUFFER_UP] ## Up buffers, transferring information up from target via debug probe to host + aDown* {.importc: "aDown".}: array[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS, + SEGGER_RTT_BUFFER_DOWN] ## Down buffers, transferring information down from host via debug probe to target + + ## ******************************************************************** + ## + ## Global data + ## + ## ********************************************************************* + ## + ## ******************************************************************** + ## + ## RTT API functions + ## + ## ********************************************************************* + ## + proc SEGGER_RTT_AllocDownBuffer*(sName: cstring; pBuffer: pointer; + BufferSize: cuint; Flags: cuint): cint {. + importc: "SEGGER_RTT_AllocDownBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_AllocUpBuffer*(sName: cstring; pBuffer: pointer; BufferSize: cuint; + Flags: cuint): cint {. + importc: "SEGGER_RTT_AllocUpBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_ConfigUpBuffer*(BufferIndex: cuint; sName: cstring; + pBuffer: pointer; BufferSize: cuint; Flags: cuint): cint {. + importc: "SEGGER_RTT_ConfigUpBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_ConfigDownBuffer*(BufferIndex: cuint; sName: cstring; + pBuffer: pointer; BufferSize: cuint; Flags: cuint): cint {. + importc: "SEGGER_RTT_ConfigDownBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_GetKey*(): cint {.importc: "SEGGER_RTT_GetKey", + header: "SEGGER_RTT.h".} + proc SEGGER_RTT_HasData*(BufferIndex: cuint): cuint {. + importc: "SEGGER_RTT_HasData", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_HasKey*(): cint {.importc: "SEGGER_RTT_HasKey", + header: "SEGGER_RTT.h".} + proc SEGGER_RTT_HasDataUp*(BufferIndex: cuint): cuint {. + importc: "SEGGER_RTT_HasDataUp", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_Init*() {.importc: "SEGGER_RTT_Init", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_Read*(BufferIndex: cuint; pBuffer: pointer; BufferSize: cuint): cuint {. + importc: "SEGGER_RTT_Read", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_ReadNoLock*(BufferIndex: cuint; pData: pointer; BufferSize: cuint): cuint {. + importc: "SEGGER_RTT_ReadNoLock", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_SetNameDownBuffer*(BufferIndex: cuint; sName: cstring): cint {. + importc: "SEGGER_RTT_SetNameDownBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_SetNameUpBuffer*(BufferIndex: cuint; sName: cstring): cint {. + importc: "SEGGER_RTT_SetNameUpBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_SetFlagsDownBuffer*(BufferIndex: cuint; Flags: cuint): cint {. + importc: "SEGGER_RTT_SetFlagsDownBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_SetFlagsUpBuffer*(BufferIndex: cuint; Flags: cuint): cint {. + importc: "SEGGER_RTT_SetFlagsUpBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_WaitKey*(): cint {.importc: "SEGGER_RTT_WaitKey", + header: "SEGGER_RTT.h".} + proc SEGGER_RTT_Write*(BufferIndex: cuint; pBuffer: pointer; NumBytes: cuint): cuint {. + importc: "SEGGER_RTT_Write", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_WriteNoLock*(BufferIndex: cuint; pBuffer: pointer; NumBytes: cuint): cuint {. + importc: "SEGGER_RTT_WriteNoLock", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_WriteSkipNoLock*(BufferIndex: cuint; pBuffer: pointer; + NumBytes: cuint): cuint {. + importc: "SEGGER_RTT_WriteSkipNoLock", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_ASM_WriteSkipNoLock*(BufferIndex: cuint; pBuffer: pointer; + NumBytes: cuint): cuint {. + importc: "SEGGER_RTT_ASM_WriteSkipNoLock", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_WriteString*(BufferIndex: cuint; s: cstring): cuint {. + importc: "SEGGER_RTT_WriteString", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_WriteWithOverwriteNoLock*(BufferIndex: cuint; pBuffer: pointer; + NumBytes: cuint) {.importc: "SEGGER_RTT_WriteWithOverwriteNoLock", + header: "SEGGER_RTT.h".} + proc SEGGER_RTT_PutChar*(BufferIndex: cuint; c: char): cuint {. + importc: "SEGGER_RTT_PutChar", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_PutCharSkip*(BufferIndex: cuint; c: char): cuint {. + importc: "SEGGER_RTT_PutCharSkip", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_PutCharSkipNoLock*(BufferIndex: cuint; c: char): cuint {. + importc: "SEGGER_RTT_PutCharSkipNoLock", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_GetAvailWriteSpace*(BufferIndex: cuint): cuint {. + importc: "SEGGER_RTT_GetAvailWriteSpace", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_GetBytesInBuffer*(BufferIndex: cuint): cuint {. + importc: "SEGGER_RTT_GetBytesInBuffer", header: "SEGGER_RTT.h".} + ## ******************************************************************** + ## + ## RTT transfer functions to send RTT data via other channels. + ## + ## ********************************************************************* + ## + proc SEGGER_RTT_ReadUpBuffer*(BufferIndex: cuint; pBuffer: pointer; + BufferSize: cuint): cuint {. + importc: "SEGGER_RTT_ReadUpBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_ReadUpBufferNoLock*(BufferIndex: cuint; pData: pointer; + BufferSize: cuint): cuint {. + importc: "SEGGER_RTT_ReadUpBufferNoLock", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_WriteDownBuffer*(BufferIndex: cuint; pBuffer: pointer; + NumBytes: cuint): cuint {. + importc: "SEGGER_RTT_WriteDownBuffer", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_WriteDownBufferNoLock*(BufferIndex: cuint; pBuffer: pointer; + NumBytes: cuint): cuint {. + importc: "SEGGER_RTT_WriteDownBufferNoLock", header: "SEGGER_RTT.h".} + ## ******************************************************************** + ## + ## RTT "Terminal" API functions + ## + ## ********************************************************************* + ## + proc SEGGER_RTT_SetTerminal*(TerminalId: cuchar): cint {. + importc: "SEGGER_RTT_SetTerminal", header: "SEGGER_RTT.h".} + proc SEGGER_RTT_TerminalOut*(TerminalId: cuchar; s: cstring): cint {. + importc: "SEGGER_RTT_TerminalOut", header: "SEGGER_RTT.h".} + ## ******************************************************************** + ## + ## RTT printf functions (require SEGGER_RTT_printf.c) + ## + ## ********************************************************************* + ## + proc SEGGER_RTT_printf*(BufferIndex: cuint; sFormat: cstring): cint {.varargs, + importc: "SEGGER_RTT_printf", header: "SEGGER_RTT.h".} +## ******************************************************************** +## +## Defines +## +## ********************************************************************* +## +## +## Operating modes. Define behavior if buffer is full (not enough space for entire message) +## + +const + SEGGER_RTT_MODE_NO_BLOCK_SKIP* = (0) ## Skip. Do not block, output nothing. (Default) + SEGGER_RTT_MODE_NO_BLOCK_TRIM* = (1) ## Trim: Do not block, output as much as fits. + SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL* = (2) ## Block: Wait until there is space in the buffer. + SEGGER_RTT_MODE_MASK* = (3) + +when not defined(SEGGER_RTT_MODE_DEFAULT): + const + SEGGER_RTT_MODE_DEFAULT* = SEGGER_RTT_MODE_NO_BLOCK_SKIP +## +## Control sequences, based on ANSI. +## Can be used to control color, and clear the screen +## + +const + RTT_CTRL_RESET* = "\e[0m" + RTT_CTRL_CLEAR* = "\e[2J" + RTT_CTRL_TEXT_BLACK* = "\e[2;30m" + RTT_CTRL_TEXT_RED* = "\e[2;31m" + RTT_CTRL_TEXT_GREEN* = "\e[2;32m" + RTT_CTRL_TEXT_YELLOW* = "\e[2;33m" + RTT_CTRL_TEXT_BLUE* = "\e[2;34m" + RTT_CTRL_TEXT_MAGENTA* = "\e[2;35m" + RTT_CTRL_TEXT_CYAN* = "\e[2;36m" + RTT_CTRL_TEXT_WHITE* = "\e[2;37m" + RTT_CTRL_TEXT_BRIGHT_BLACK* = "\e[1;30m" + RTT_CTRL_TEXT_BRIGHT_RED* = "\e[1;31m" + RTT_CTRL_TEXT_BRIGHT_GREEN* = "\e[1;32m" + RTT_CTRL_TEXT_BRIGHT_YELLOW* = "\e[1;33m" + RTT_CTRL_TEXT_BRIGHT_BLUE* = "\e[1;34m" + RTT_CTRL_TEXT_BRIGHT_MAGENTA* = "\e[1;35m" + RTT_CTRL_TEXT_BRIGHT_CYAN* = "\e[1;36m" + RTT_CTRL_TEXT_BRIGHT_WHITE* = "\e[1;37m" + RTT_CTRL_BG_BLACK* = "\e[24;40m" + RTT_CTRL_BG_RED* = "\e[24;41m" + RTT_CTRL_BG_GREEN* = "\e[24;42m" + RTT_CTRL_BG_YELLOW* = "\e[24;43m" + RTT_CTRL_BG_BLUE* = "\e[24;44m" + RTT_CTRL_BG_MAGENTA* = "\e[24;45m" + RTT_CTRL_BG_CYAN* = "\e[24;46m" + RTT_CTRL_BG_WHITE* = "\e[24;47m" + RTT_CTRL_BG_BRIGHT_BLACK* = "\e[4;40m" + RTT_CTRL_BG_BRIGHT_RED* = "\e[4;41m" + RTT_CTRL_BG_BRIGHT_GREEN* = "\e[4;42m" + RTT_CTRL_BG_BRIGHT_YELLOW* = "\e[4;43m" + RTT_CTRL_BG_BRIGHT_BLUE* = "\e[4;44m" + RTT_CTRL_BG_BRIGHT_MAGENTA* = "\e[4;45m" + RTT_CTRL_BG_BRIGHT_CYAN* = "\e[4;46m" + RTT_CTRL_BG_BRIGHT_WHITE* = "\e[4;47m" + +## ************************** End of file *************************** diff --git a/src/Tools/SEGGER_RTT_Conf.h b/src/Tools/SEGGER_RTT_Conf.h index 3893fa04c..e67ba1f65 100644 --- a/src/Tools/SEGGER_RTT_Conf.h +++ b/src/Tools/SEGGER_RTT_Conf.h @@ -58,10 +58,14 @@ Revision: $Rev: 18601 $ #ifndef SEGGER_RTT_CONF_H #define SEGGER_RTT_CONF_H +#ifndef C2NIM + #ifdef __IAR_SYSTEMS_ICC__ #include #endif +#endif + /********************************************************************* * * Defines, configurable @@ -88,20 +92,16 @@ Revision: $Rev: 18601 $ #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) #endif -#ifndef SEGGER_RTT_MODE_DEFAULT - #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) -#endif - /********************************************************************* * * RTT memcpy configuration * -* memcpy() is good for large amounts of data, +* memcpy() is good for large amounts of data, * but the overhead is big for small amounts, which are usually stored via RTT. * With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. * * SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. -* This is may be required with memory access restrictions, +* This is may be required with memory access restrictions, * such as on Cortex-A devices with MMU. */ #ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP @@ -110,7 +110,7 @@ Revision: $Rev: 18601 $ // // Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets // -//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) +//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) // #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) //#endif @@ -132,6 +132,8 @@ Revision: $Rev: 18601 $ #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) #endif +#ifndef C2NIM + /********************************************************************* * * RTT lock configuration for SEGGER Embedded Studio, @@ -209,7 +211,7 @@ Revision: $Rev: 18601 $ : \ : \ ); - + #define SEGGER_RTT_UNLOCK() __asm volatile ("csrr a1, mstatus \n\t" \ "or %0, %0, a1 \n\t" \ "csrs mstatus, %0 \n\t" \ @@ -350,8 +352,8 @@ Revision: $Rev: 18601 $ #define SEGGER_RTT_LOCK() { \ unsigned long LockState; \ LockState = get_psw() & 0x010000; \ - clrpsw_i(); - + clrpsw_i(); + #define SEGGER_RTT_UNLOCK() set_psw(get_psw() | LockState); \ } #endif @@ -373,6 +375,8 @@ void OS_SIM_LeaveCriticalSection(void); } #endif +#endif + /********************************************************************* * * RTT lock configuration fallback @@ -387,3 +391,4 @@ void OS_SIM_LeaveCriticalSection(void); #endif /*************************** End of file ****************************/ + diff --git a/src/Tools/SEGGER_RTT_Conf.nim b/src/Tools/SEGGER_RTT_Conf.nim new file mode 100644 index 000000000..2c701d7be --- /dev/null +++ b/src/Tools/SEGGER_RTT_Conf.nim @@ -0,0 +1,135 @@ +## ******************************************************************** +## SEGGER Microcontroller GmbH * +## The Embedded Experts * +## ********************************************************************* +## * +## (c) 1995 - 2019 SEGGER Microcontroller GmbH * +## * +## www.segger.com Support: support@segger.com * +## * +## ********************************************************************* +## * +## SEGGER RTT * Real Time Transfer for embedded targets * +## * +## ********************************************************************* +## * +## All rights reserved. * +## * +## SEGGER strongly recommends to not make any changes * +## to or modify the source code of this software in order to stay * +## compatible with the RTT protocol and J-Link. * +## * +## Redistribution and use in source and binary forms, with or * +## without modification, are permitted provided that the following * +## condition is met: * +## * +## o Redistributions of source code must retain the above copyright * +## notice, this condition and the following disclaimer. * +## * +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +## CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +## INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +## DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +## CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +## OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +## OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +## LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +## USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +## DAMAGE. * +## * +## ********************************************************************* +## * +## RTT version: 6.80c * +## * +## ********************************************************************* +## +## ---------------------------END-OF-HEADER------------------------------ +## File : SEGGER_RTT_Conf.h +## Purpose : Implementation of SEGGER real-time transfer (RTT) which +## allows real-time communication on targets which support +## debugger memory accesses while the CPU is running. +## Revision: $Rev: 18601 $ +## +## + +## ******************************************************************** +## +## Defines, configurable +## +## ********************************************************************* +## + +when not defined(SEGGER_RTT_MAX_NUM_UP_BUFFERS): + const + SEGGER_RTT_MAX_NUM_UP_BUFFERS* = (1) ## Max. number of up-buffers (T->H) available on this target (Default: 3) +when not defined(SEGGER_RTT_MAX_NUM_DOWN_BUFFERS): + const + SEGGER_RTT_MAX_NUM_DOWN_BUFFERS* = (1) ## Max. number of down-buffers (H->T) available on this target (Default: 3) +when not defined(BUFFER_SIZE_UP): + const + BUFFER_SIZE_UP* = (500) ## Size of the buffer for terminal output of target, up to host (Default: 1k) +when not defined(BUFFER_SIZE_DOWN): + const + BUFFER_SIZE_DOWN* = (16) ## Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) +when not defined(SEGGER_RTT_PRINTF_BUFFER_SIZE): + const + SEGGER_RTT_PRINTF_BUFFER_SIZE* = (64) ## Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) +## ******************************************************************** +## +## RTT memcpy configuration +## +## memcpy() is good for large amounts of data, +## but the overhead is big for small amounts, which are usually stored via RTT. +## With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. +## +## SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. +## This is may be required with memory access restrictions, +## such as on Cortex-A devices with MMU. +## + +when not defined(SEGGER_RTT_MEMCPY_USE_BYTELOOP): + const + SEGGER_RTT_MEMCPY_USE_BYTELOOP* = 0 +## +## Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets +## +## #if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) +## #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) +## #endif +## +## Target is not allowed to perform other RTT operations while string still has not been stored completely. +## Otherwise we would probably end up with a mixed string in the buffer. +## If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. +## +## SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. +## Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. +## When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. +## (Higher priority = lower priority number) +## Default value for embOS: 128u +## Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +## In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC +## or define SEGGER_RTT_LOCK() to completely disable interrupts. +## + +when not defined(SEGGER_RTT_MAX_INTERRUPT_PRIORITY): + const + SEGGER_RTT_MAX_INTERRUPT_PRIORITY* = (0x00000020) ## Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) +## ******************************************************************** +## +## RTT lock configuration fallback +## + +when not defined(SEGGER_RTT_LOCK): + template SEGGER_RTT_LOCK*(): void = + ## Lock RTT (nestable) (i.e. disable interrupts) + nil + +when not defined(SEGGER_RTT_UNLOCK): + template SEGGER_RTT_UNLOCK*(): void = + ## Unlock RTT (nestable) (i.e. enable previous interrupt lock state) + nil + +## ************************** End of file *************************** diff --git a/src/Tools/ota_service.c b/src/Tools/ota_service.c index 583ac22bd..eb84e537e 100644 --- a/src/Tools/ota_service.c +++ b/src/Tools/ota_service.c @@ -13,6 +13,7 @@ #include "att_db_util.h" #include "ota_service.h" #include "platform_api.h" +#include "rom_tools.h" #define RTC_CHIP_STAT_ADDR (0x40050004) #define CLK_FREQ_STAT_POS 3 @@ -92,10 +93,6 @@ void ota_init_handles(const uint16_t handler_ver, const uint16_t handle_ctrl, co att_ota_ctrl_handle = handle_ctrl; } -typedef uint16_t (* f_crc_t)(uint8_t *buffer , uint16_t usDataLen); - -#define crc ((f_crc_t)(0x000009fd)) - int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) { if (transaction_mode != ATT_TRANSACTION_MODE_NONE) diff --git a/src/Tools/rom_tools.h b/src/Tools/rom_tools.h new file mode 100644 index 000000000..f2eaa397a --- /dev/null +++ b/src/Tools/rom_tools.h @@ -0,0 +1,27 @@ +#ifndef _CRC_H +#define _CRC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + **************************************************************************************** + * @brief Calculate a 16bit CRC code (Polynomial x^16+x^15+x^5+1) + * + * @param[in] buffer input bytes + * @param[in] len data length + * @return CRC result + **************************************************************************************** + */ +typedef uint16_t (* f_crc_t)(uint8_t *buffer, uint16_t len); +#define crc ((f_crc_t)(0x00000f79)) + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/Tools/rom_tools.nim b/src/Tools/rom_tools.nim new file mode 100644 index 000000000..4727b2382 --- /dev/null +++ b/src/Tools/rom_tools.nim @@ -0,0 +1,15 @@ +## * +## *************************************************************************************** +## @brief Calculate a 16bit CRC code (Polynomial x^16+x^15+x^5+1) +## +## @param[in] buffer input bytes +## @param[in] len data length +## @return CRC result +## *************************************************************************************** +## + +type + f_crc_t* = proc (buffer: ptr uint8; len: uint16): uint16 {.noconv.} + +const + crc* = ((f_crc_t)(0x00000F79)) diff --git a/src/Tools/sig_uuid.nim b/src/Tools/sig_uuid.nim index 8e9eda71f..24d025ec2 100644 --- a/src/Tools/sig_uuid.nim +++ b/src/Tools/sig_uuid.nim @@ -85,7 +85,7 @@ const SIG_UUID_CHARACT_PLX_CONTINUOUS_MEASUREMENT* = 0x2a5fu16 SIG_UUID_CHARACT_ANAEROBIC_THRESHOLD* = 0x2a83u16 SIG_UUID_CHARACT_CSC_MEASUREMENT* = 0x2a5bu16 - SIG_UUID_CHARACT_BOOT_MOUSE_INPUT_REPORT* = 0x2a33u16 + SIG_UUID_CHARACT_MAGNETIC_FLUX_DENSITY_3D* = 0x2aa1u16 SIG_UUID_CHARACT_LOCAL_TIME_INFORMATION* = 0x2a0fu16 SIG_UUID_CHARACT_PRESSURE* = 0x2a6du16 SIG_UUID_CHARACT_FIVE_ZONE_HEART_RATE_LIMITS* = 0x2a8bu16 @@ -100,6 +100,7 @@ const SIG_UUID_CHARACT_WEIGHT_SCALE_FEATURE* = 0x2a9eu16 SIG_UUID_CHARACT_HTTPS_SECURITY* = 0x2abbu16 SIG_UUID_CHARACT_TEMPERATURE_MEASUREMENT* = 0x2a1cu16 + SIG_UUID_CHARACT_BOOT_MOUSE_INPUT_REPORT* = 0x2a33u16 SIG_UUID_CHARACT_DESCRIPTOR_VALUE_CHANGED* = 0x2a7du16 SIG_UUID_CHARACT_IDD_STATUS* = 0x2b21u16 SIG_UUID_CHARACT_GAP_APPEARANCE* = 0x2a01u16 @@ -118,6 +119,7 @@ const SIG_UUID_CHARACT_RECONNECTION_CONFIGURATION_CONTROL_POINT* = 0x2b1fu16 SIG_UUID_CHARACT_CGM_SESSION_RUN_TIME* = 0x2aabu16 SIG_UUID_CHARACT_APPARENT_WIND_SPEED* = 0x2a72u16 + SIG_UUID_CHARACT_MAGNETIC_FLUX_DENSITY_2D* = 0x2aa0u16 SIG_UUID_CHARACT_BOND_MANAGEMENT_CONTROL_POINT* = 0x2aa4u16 SIG_UUID_CHARACT_HEART_RATE_MAX* = 0x2a8du16 SIG_UUID_CHARACT_REPORT_MAP* = 0x2a4bu16 @@ -146,20 +148,20 @@ const SIG_UUID_CHARACT_MESH_PROVISIONING_DATA_OUT* = 0x2adcu16 SIG_UUID_CHARACT_ELEVATION* = 0x2a6cu16 SIG_UUID_CHARACT_IDD_FEATURES* = 0x2b23u16 + SIG_UUID_CHARACT_LONGITUDE* = 0x2aafu16 SIG_UUID_CHARACT_INTERMEDIATE_TEMPERATURE* = 0x2a1eu16 SIG_UUID_CHARACT_ALERT_NOTIFICATION_CONTROL_POINT* = 0x2a44u16 SIG_UUID_CHARACT_SC_CONTROL_POINT* = 0x2a55u16 SIG_UUID_CHARACT_RINGER_SETTING* = 0x2a41u16 - SIG_UUID_CHARACT_MAGNETIC_FLUX_DENSITY_3D* = 0x2aa1u16 + SIG_UUID_CHARACT_STEP_CLIMBER_DATA* = 0x2acfu16 SIG_UUID_CHARACT_FIRMWARE_REVISION_STRING* = 0x2a26u16 SIG_UUID_CHARACT_HARDWARE_REVISION_STRING* = 0x2a27u16 - SIG_UUID_CHARACT_HTTP_CONTROL_POINT* = 0x2abau16 SIG_UUID_CHARACT_BODY_COMPOSITION_MEASUREMENT* = 0x2a9cu16 SIG_UUID_CHARACT_GLUCOSE_FEATURE* = 0x2a51u16 SIG_UUID_CHARACT_PLX_FEATURES* = 0x2a60u16 SIG_UUID_CHARACT_IDD_STATUS_READER_CONTROL_POINT* = 0x2b24u16 SIG_UUID_CHARACT_OBJECT_TYPE* = 0x2abfu16 - SIG_UUID_CHARACT_STEP_CLIMBER_DATA* = 0x2acfu16 + SIG_UUID_CHARACT_SUPPORTED_UNREAD_ALERT_CATEGORY* = 0x2a48u16 SIG_UUID_CHARACT_TDS_CONTROL_POINT* = 0x2abcu16 SIG_UUID_CHARACT_LANGUAGE* = 0x2aa2u16 SIG_UUID_CHARACT_LN_CONTROL_POINT* = 0x2a6bu16 @@ -183,6 +185,7 @@ const SIG_UUID_CHARACT_VO2_MAX* = 0x2a96u16 SIG_UUID_CHARACT_OBJECT_ID* = 0x2ac3u16 SIG_UUID_CHARACT_APPARENT_WIND_DIRECTION* = 0x2a73u16 + SIG_UUID_CHARACT_HUMIDITY* = 0x2a6fu16 SIG_UUID_CHARACT_ALERT_CATEGORY_ID_BIT_MASK* = 0x2a42u16 SIG_UUID_CHARACT_BLOOD_PRESSURE_MEASUREMENT* = 0x2a35u16 SIG_UUID_CHARACT_PROTOCOL_MODE* = 0x2a4eu16 @@ -191,7 +194,6 @@ const SIG_UUID_CHARACT_MESH_PROXY_DATA_OUT* = 0x2adeu16 SIG_UUID_CHARACT_SOFTWARE_REVISION_STRING* = 0x2a28u16 SIG_UUID_CHARACT_GLUCOSE_MEASUREMENT_CONTEXT* = 0x2a34u16 - SIG_UUID_CHARACT_LONGITUDE* = 0x2aafu16 SIG_UUID_CHARACT_DIGITAL* = 0x2a56u16 SIG_UUID_CHARACT_LOCAL_NORTH_COORDINATE* = 0x2ab0u16 SIG_UUID_CHARACT_CSC_FEATURE* = 0x2a5cu16 @@ -207,7 +209,6 @@ const SIG_UUID_CHARACT_LAST_NAME* = 0x2a90u16 SIG_UUID_CHARACT_WEIGHT_MEASUREMENT* = 0x2a9du16 SIG_UUID_CHARACT_IDD_STATUS_CHANGED* = 0x2b20u16 - SIG_UUID_CHARACT_SUPPORTED_UNREAD_ALERT_CATEGORY* = 0x2a48u16 SIG_UUID_CHARACT_REFERENCE_TIME_INFORMATION* = 0x2a14u16 SIG_UUID_CHARACT_CGM_SESSION_START_TIME* = 0x2aaau16 SIG_UUID_CHARACT_POSITION_QUALITY* = 0x2a69u16 @@ -232,7 +233,6 @@ const SIG_UUID_CHARACT_OBJECT_CHANGED* = 0x2ac8u16 SIG_UUID_CHARACT_IDD_ANNUNCIATION_STATUS* = 0x2b22u16 SIG_UUID_CHARACT_TIME_UPDATE_CONTROL_POINT* = 0x2a16u16 - SIG_UUID_CHARACT_MAGNETIC_FLUX_DENSITY_2D* = 0x2aa0u16 SIG_UUID_CHARACT_RECORD_ACCESS_CONTROL_POINT* = 0x2a52u16 SIG_UUID_CHARACT_CGM_MEASUREMENT* = 0x2aa7u16 SIG_UUID_CHARACT_INDOOR_POSITIONING_CONFIGURATION* = 0x2aadu16 @@ -251,7 +251,7 @@ const SIG_UUID_CHARACT_WAIST_CIRCUMFERENCE* = 0x2a97u16 SIG_UUID_CHARACT_FAT_BURN_HEART_RATE_LOWER_LIMIT* = 0x2a88u16 SIG_UUID_CHARACT_UNCERTAINTY* = 0x2ab4u16 - SIG_UUID_CHARACT_HUMIDITY* = 0x2a6fu16 + SIG_UUID_CHARACT_HTTP_CONTROL_POINT* = 0x2abau16 SIG_UUID_CHARACT_MODEL_NUMBER_STRING* = 0x2a24u16 SIG_UUID_CHARACT_SPORT_TYPE_FOR_AEROBIC_AND_ANAEROBIC_THRESHOLDS* = 0x2a93u16 SIG_UUID_CHARACT_LOCAL_EAST_COORDINATE* = 0x2ab1u16 diff --git a/src/Tools/trace.h b/src/Tools/trace.h index b0a1342bc..1c070cb49 100644 --- a/src/Tools/trace.h +++ b/src/Tools/trace.h @@ -3,9 +3,12 @@ #include #include "FreeRTOS.h" +#ifndef C2NIM #include "task.h" #include "semphr.h" #include "queue.h" +#endif +#include "ingsoc.h" #include "platform_api.h" diff --git a/src/Tools/trace.nim b/src/Tools/trace.nim index d692ca4ff..620950c3c 100644 --- a/src/Tools/trace.nim +++ b/src/Tools/trace.nim @@ -1,6 +1,12 @@ import - FreeRTOS, task, semphr, queue, platform_api + FreeRTOS +import + ingsoc, platform_api + +when not defined(TRACE_BUFF_SIZE): + const + TRACE_BUFF_SIZE* = (4096) ## must be 2^n const TRACE_BUFF_SIZE_MASK* = (TRACE_BUFF_SIZE - 1) @@ -15,8 +21,42 @@ type port* {.importc: "port".}: ptr UART_TypeDef +## * +## *************************************************************************************** +## @brief Initialize UART trace +## +## @param[in] trace_info_t trace context +## *************************************************************************************** +## + proc trace_init*(ctx: ptr trace_info_t) {.importc: "trace_init", header: "trace.h".} +## * +## *************************************************************************************** +## @brief UART ISR callback +## +## @param[in] trace_info_t trace context +## *************************************************************************************** +## + proc trace_uart_isr*(ctx: ptr trace_info_t): uint32 {.importc: "trace_uart_isr", header: "trace.h".} +## * +## *************************************************************************************** +## @brief Trace event callback +## +## @param[in] trace trace event +## @param[in] trace_info_t trace context +## *************************************************************************************** +## + proc cb_trace*(trace: ptr platform_evt_trace_t; ctx: ptr trace_info_t): uint32 {. - importc: "cb_trace", header: "trace.h".} \ No newline at end of file + importc: "cb_trace", header: "trace.h".} +## * +## *************************************************************************************** +## @brief Flush saved trace data to UART +## +## @param[in] trace_info_t trace context +## *************************************************************************************** +## + +proc trace_flush*(ctx: ptr trace_info_t) {.importc: "trace_flush", header: "trace.h".} \ No newline at end of file From 74f0f78697b7936d7c9d790d47c17f38c1612471 Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Wed, 8 Jul 2020 11:55:47 +0800 Subject: [PATCH 07/10] update SEGGER_RTT for nim --- src/Tools/SEGGER_RTT.h | 6 ++++++ src/Tools/SEGGER_RTT.nim | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/src/Tools/SEGGER_RTT.h b/src/Tools/SEGGER_RTT.h index 6a732001c..3e832a950 100644 --- a/src/Tools/SEGGER_RTT.h +++ b/src/Tools/SEGGER_RTT.h @@ -236,6 +236,12 @@ typedef struct { #ifndef C2NIM extern SEGGER_RTT_CB _SEGGER_RTT; #else +#@ +var SEGGER_RTT* {.importc: "_SEGGER_RTT", header: "SEGGER_RTT.h".}: SEGGER_RTT_CB +@# + +#define SEGGER_RTT_HASDATA(n) (SEGGER_RTT.aDown[n].WrOff - SEGGER_RTT.aDown[n].RdOff) +#define SEGGER_RTT_HASDATA_UP(n) (SEGGER_RTT.aUp[n].WrOff - SEGGER_RTT.aUp[n].RdOff) #endif diff --git a/src/Tools/SEGGER_RTT.nim b/src/Tools/SEGGER_RTT.nim index e0380aa96..9dac5ca18 100644 --- a/src/Tools/SEGGER_RTT.nim +++ b/src/Tools/SEGGER_RTT.nim @@ -120,6 +120,13 @@ when not defined(SEGGER_RTT_ASM): ## defined when SEGGER_RTT.h is included from ## ## ********************************************************************* ## + var SEGGER_RTT* {.importc: "_SEGGER_RTT", header: "SEGGER_RTT.h".}: SEGGER_RTT_CB + template SEGGER_RTT_HASDATA*(n: untyped): untyped = + (SEGGER_RTT.aDown[n].WrOff - SEGGER_RTT.aDown[n].RdOff) + + template SEGGER_RTT_HASDATA_UP*(n: untyped): untyped = + (SEGGER_RTT.aUp[n].WrOff - SEGGER_RTT.aUp[n].RdOff) + ## ******************************************************************** ## ## RTT API functions From f67ff4c1de9705cf07812a9dc52b3b8fc90eece2 Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Sat, 11 Jul 2020 17:00:18 +0800 Subject: [PATCH 08/10] internal release: 3.0.0 rc1 --- bundles/typical/ING9188xx/meta.json | 23 +- bundles/typical/ING9188xx/platform.bin | Bin 131416 -> 132292 bytes bundles/typical/ING9188xx/symdefs.g | 509 +++++++++--------- bundles/typical/ING9188xx/symdefs.i | 509 +++++++++--------- bundles/typical/ING9188xx/symdefs.m | 509 +++++++++--------- bundles/typical/ING9188xx/symdefs.s | 509 +++++++++--------- bundles/typical/inc/bluetooth.h | 32 +- bundles/typical/inc/bluetooth.nim | 24 +- bundles/typical/inc/gap.h | 168 +++--- bundles/typical/inc/gap.nim | 119 ++-- bundles/typical/inc/os/FreeRTOS.nim | 57 +- bundles/typical/inc/platform_api.h | 25 +- bundles/typical/inc/platform_api.nim | 27 +- examples-gcc/peripheral_ibeacon/Makefile | 2 +- .../peripheral_ibeacon.ingw | 14 +- .../peripheral_ibeacon/peripheral_ibeacon.ld | 2 +- .../peripheral_ibeacon/generic_cortex.icf | 6 +- .../peripheral_ibeacon.ingw | 14 +- .../peripheral_battery.ingw | 14 +- .../peripheral_battery/peripheral_battery.ld | 2 +- .../smart_home_hub/smart_home_hub.ingw | 14 +- examples-nim/smart_home_hub/smart_home_hub.ld | 2 +- examples-nim/smart_home_hub/src/profile.nim | 2 +- .../peripheral_ibeacon/peripheral_ibeacon.hzp | 2 +- .../peripheral_ibeacon.ingw | 14 +- .../peripheral_ibeacon.emProject | 2 +- .../peripheral_ibeacon.ingw | 14 +- examples/anti_lost_mas/anti_lost_mas.ingw | 14 +- examples/anti_lost_mas/anti_lost_mas.uvproj | 4 +- examples/anti_lost_mas/anti_lost_mas.uvprojx | 4 +- examples/anti_lost_mas/src/main.c | 2 + examples/anti_lost_sla/anti_lost_sla.ingw | 14 +- examples/anti_lost_sla/anti_lost_sla.uvproj | 4 +- examples/anti_lost_sla/anti_lost_sla.uvprojx | 4 +- examples/anti_lost_sla/src/main.c | 1 + .../central_throughput.ingw | 14 +- .../central_throughput.uvproj | 4 +- .../central_throughput.uvprojx | 4 +- examples/central_throughput/src/main.c | 1 + examples/hid_keyboard/flash_download.ini | 6 +- examples/hid_keyboard/hid_keyboard.ingw | 14 +- examples/hid_keyboard/hid_keyboard.uvoptx | 31 +- examples/hid_keyboard/hid_keyboard.uvproj | 4 +- examples/hid_keyboard/hid_keyboard.uvprojx | 105 ++-- examples/hid_keyboard/src/main.c | 7 +- examples/hid_mouse/hid_mouse.ingw | 14 +- examples/hid_mouse/hid_mouse.uvproj | 4 +- examples/hid_mouse/hid_mouse.uvprojx | 4 +- examples/hid_mouse/src/main.c | 3 +- examples/ibeacon_scanner/ibeacon_scanner.ingw | 14 +- .../ibeacon_scanner/ibeacon_scanner.uvproj | 4 +- .../ibeacon_scanner/ibeacon_scanner.uvprojx | 4 +- examples/ibeacon_scanner/src/main.c | 2 + examples/io_over_ble_mas/io_over_ble_mas.ingw | 14 +- .../io_over_ble_mas/io_over_ble_mas.uvproj | 4 +- .../io_over_ble_mas/io_over_ble_mas.uvprojx | 4 +- examples/io_over_ble_mas/src/main.c | 2 + examples/io_over_ble_sla/io_over_ble_sla.ingw | 14 +- .../io_over_ble_sla/io_over_ble_sla.uvproj | 4 +- .../io_over_ble_sla/io_over_ble_sla.uvprojx | 105 ++-- examples/io_over_ble_sla/src/main.c | 1 + examples/mesh-light/mesh-light.uvopt | 40 +- examples/mesh-light/mesh-light.uvoptx | 16 +- examples/mesh-light/mesh-light.uvproj | 5 + examples/mesh-light/mesh-light.uvprojx | 5 + examples/mesh-light/src/main.c | 45 +- examples/periodic_advertiser/README.md | 2 +- .../periodic_advertiser/flash_download.ini | 6 +- .../periodic_advertiser.ingw | 14 +- .../periodic_advertiser.uvproj | 118 ++-- .../periodic_advertiser.uvprojx | 107 ++-- examples/periodic_advertiser/src/main.c | 3 +- examples/periodic_advertiser/src/profile.c | 7 +- examples/periodic_scanner/README.md | 4 + examples/periodic_scanner/flash_download.ini | 8 +- .../periodic_scanner/periodic_scanner.ingw | 14 +- .../periodic_scanner/periodic_scanner.uvopt | 32 +- .../periodic_scanner/periodic_scanner.uvoptx | 33 +- .../periodic_scanner/periodic_scanner.uvproj | 11 +- .../periodic_scanner/periodic_scanner.uvprojx | 11 +- examples/periodic_scanner/src/main.c | 22 +- examples/periodic_scanner/src/profile.c | 10 +- .../peripheral_all_in_one/flash_download.ini | 2 +- .../peripheral_all_in_one.ingw | 14 +- .../peripheral_all_in_one.uvproj | 4 +- .../peripheral_all_in_one.uvprojx | 4 +- examples/peripheral_all_in_one/src/main.c | 6 + examples/peripheral_ancs/flash_download.ini | 2 +- examples/peripheral_ancs/peripheral_ancs.ingw | 14 +- .../peripheral_ancs/peripheral_ancs.uvproj | 4 +- .../peripheral_ancs/peripheral_ancs.uvprojx | 105 ++-- examples/peripheral_ancs/src/main.c | 6 +- examples/peripheral_band/peripheral_band.ingw | 14 +- .../peripheral_band/peripheral_band.uvproj | 4 +- .../peripheral_band/peripheral_band.uvprojx | 4 +- examples/peripheral_band/src/main.c | 6 + .../peripheral_battery.ingw | 14 +- .../peripheral_battery.uvoptx | 2 +- .../peripheral_battery.uvproj | 4 +- .../peripheral_battery.uvprojx | 4 +- examples/peripheral_battery/src/main.c | 1 + .../peripheral_console.ingw | 14 +- .../peripheral_console.uvproj | 4 +- .../peripheral_console.uvprojx | 4 +- examples/peripheral_etag/peripheral_etag.ingw | 14 +- .../peripheral_etag/peripheral_etag.uvproj | 4 +- .../peripheral_etag/peripheral_etag.uvprojx | 4 +- examples/peripheral_etag/src/main.c | 1 + .../peripheral_ibeacon.ingw | 14 +- .../peripheral_ibeacon.uvoptx | 2 +- .../peripheral_ibeacon.uvproj | 4 +- .../peripheral_ibeacon.uvprojx | 4 +- examples/peripheral_ibeacon/src/main.c | 2 +- examples/peripheral_irc/peripheral_irc.ingw | 14 +- examples/peripheral_irc/peripheral_irc.uvproj | 4 +- .../peripheral_irc/peripheral_irc.uvprojx | 4 +- examples/peripheral_led/flash_download.ini | 6 +- examples/peripheral_led/peripheral_led.ingw | 14 +- examples/peripheral_led/peripheral_led.uvoptx | 21 +- examples/peripheral_led/peripheral_led.uvproj | 116 ++-- .../peripheral_led/peripheral_led.uvprojx | 4 +- examples/peripheral_led/src/impl_led.c | 4 + examples/peripheral_led/src/main.c | 2 +- examples/peripheral_led/src/profile.c | 3 +- .../peripheral_pedometer.ingw | 14 +- .../peripheral_pedometer.uvproj | 116 ++-- .../peripheral_pedometer.uvprojx | 105 ++-- examples/peripheral_pedometer/src/main.c | 2 + .../peripheral_piano/peripheral_piano.ingw | 14 +- .../peripheral_piano/peripheral_piano.uvproj | 4 +- .../peripheral_piano/peripheral_piano.uvprojx | 4 +- examples/peripheral_piano/src/main.c | 1 + .../peripheral_throughput.ingw | 14 +- .../peripheral_throughput.uvproj | 4 +- .../peripheral_throughput.uvprojx | 4 +- examples/peripheral_throughput/src/main.c | 2 + examples/secondary_fota/flash_download.ini | 2 +- examples/secondary_fota/secondary_fota.ingw | 14 +- examples/secondary_fota/secondary_fota.uvproj | 112 ++-- .../secondary_fota/secondary_fota.uvprojx | 101 ++-- examples/smart_meter/smart_meter.ingw | 14 +- examples/smart_meter/smart_meter.uvproj | 116 ++-- examples/smart_meter/smart_meter.uvprojx | 4 +- examples/smart_meter/src/main.c | 1 + examples/thermo_ota/src/main.c | 1 + examples/thermo_ota/thermo_ota.ingw | 14 +- examples/thermo_ota/thermo_ota.uvproj | 4 +- examples/thermo_ota/thermo_ota.uvprojx | 105 ++-- examples/uart_console/uart_console.ingw | 14 +- examples/uart_console/uart_console.uvproj | 4 +- examples/uart_console/uart_console.uvprojx | 4 +- examples/voice_remote_ctrl/src/main.c | 2 + .../voice_remote_ctrl/voice_remote_ctrl.ingw | 14 +- .../voice_remote_ctrl.uvproj | 4 +- .../voice_remote_ctrl.uvprojx | 105 ++-- src/FWlib/peripheral_adc.c | 5 - src/FWlib/peripheral_gpio.c | 3 + src/FWlib/peripheral_pinctrl.c | 2 - src/FWlib/peripheral_sysctrl.c | 10 + src/FWlib/peripheral_sysctrl.h | 30 +- src/FWlib/peripheral_sysctrl.nim | 25 +- 161 files changed, 2652 insertions(+), 2381 deletions(-) diff --git a/bundles/typical/ING9188xx/meta.json b/bundles/typical/ING9188xx/meta.json index deda073f1..d490faad0 100644 --- a/bundles/typical/ING9188xx/meta.json +++ b/bundles/typical/ING9188xx/meta.json @@ -86,6 +86,19 @@ "gap_read_periodic_adv_list_size", "gap_ext_create_connection", "gap_create_connection_cancel", + "gap_set_connectionless_cte_tx_param", + "gap_set_connectionless_cte_tx_enable", + "gap_set_connectionless_iq_sampling_enable", + "gap_set_connection_cte_rx_param", + "gap_set_connection_cte_tx_param", + "gap_set_connection_cte_request_enable", + "gap_set_connection_cte_response_enable", + "gap_read_antenna_info", + "gap_set_periodic_adv_rx_enable", + "gap_periodic_adv_sync_transfer", + "gap_periodic_adv_set_info_transfer", + "gap_periodic_adv_sync_transfer_param", + "gap_default_periodic_adv_sync_transfer_param", "gap_set_host_channel_classification", "gap_update_connection_parameters", "gap_get_connection_parameter_range", @@ -105,6 +118,7 @@ "platform_write_persistent_reg", "platform_read_persistent_reg", "platform_config", + "platform_hrng", "platform_printf", "sysSetPublicDeviceAddr", "platform_set_rf_clk_source", @@ -114,6 +128,7 @@ "ll_set_adv_coded_scheme", "ll_set_initiating_coded_scheme", "ll_hint_on_ce_len", + "ll_set_def_antenna", "big_endian_read_16", "big_endian_read_32", "big_endian_store_16", @@ -252,16 +267,16 @@ "base": 155648 }, "ram": { - "base": 536880208, - "size": 30528 + "base": 536880176, + "size": 30488 }, "rom": { "base": 16384, - "size": 131876 + "size": 132756 }, "version": [ + 1, 0, - 15, 0 ] } \ No newline at end of file diff --git a/bundles/typical/ING9188xx/platform.bin b/bundles/typical/ING9188xx/platform.bin index 760afbf6afb3efc26a9b8c4c808d6b620aa5e49f..ccb62fbb3b5fc497357625a646fe9203c4f9b02b 100644 GIT binary patch delta 64239 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 I)$l6z?_3NSq5uE@ diff --git a/bundles/typical/ING9188xx/symdefs.g b/bundles/typical/ING9188xx/symdefs.g index 5fd27d4c8..2508d58b7 100644 --- a/bundles/typical/ING9188xx/symdefs.g +++ b/bundles/typical/ING9188xx/symdefs.g @@ -1,247 +1,262 @@ -att_dispatch_client_can_send_now = 0x000058d1; -att_dispatch_client_request_can_send_now_event = 0x000058d9; -att_dispatch_register_client = 0x000058f1; -att_dispatch_register_server = 0x00005905; -att_dispatch_server_can_send_now = 0x00005919; -att_dispatch_server_request_can_send_now_event = 0x00005921; -att_emit_general_event = 0x000059f1; -att_server_can_send_packet_now = 0x00006135; -att_server_get_mtu = 0x00006139; -att_server_indicate = 0x000061ad; -att_server_init = 0x00006231; -att_server_notify = 0x0000626d; -att_server_register_packet_handler = 0x00006355; -att_server_request_can_send_now_event = 0x00006361; -att_set_db = 0x0000637d; -att_set_read_callback = 0x00006391; -att_set_write_callback = 0x0000639d; -bd_addr_cmp = 0x000064e1; -bd_addr_copy = 0x000064e7; -bd_addr_to_str = 0x000064f1; -big_endian_read_16 = 0x00006529; -big_endian_read_32 = 0x00006531; -big_endian_store_16 = 0x00006545; -big_endian_store_32 = 0x00006551; -btstack_push_user_msg = 0x000067fd; -char_for_nibble = 0x00006a55; -gap_add_dev_to_periodic_list = 0x000075b9; -gap_add_whitelist = 0x000075d1; -gap_aes_encrypt = 0x000075e5; -gap_clear_white_lists = 0x0000760d; -gap_clr_adv_set = 0x0000761d; -gap_clr_periodic_adv_list = 0x0000762d; -gap_create_connection_cancel = 0x00007689; -gap_disconnect = 0x00007699; -gap_disconnect_all = 0x000076c5; -gap_ext_create_connection = 0x0000776d; -gap_get_connection_parameter_range = 0x00007831; -gap_le_read_channel_map = 0x00007871; -gap_periodic_adv_create_sync = 0x00007981; -gap_periodic_adv_create_sync_cancel = 0x000079a5; -gap_periodic_adv_term_sync = 0x000079b5; -gap_read_periodic_adv_list_size = 0x00007a49; -gap_read_phy = 0x00007a59; -gap_read_remote_info = 0x00007a6d; -gap_read_remote_used_features = 0x00007a81; -gap_read_rssi = 0x00007a95; -gap_remove_whitelist = 0x00007aa9; -gap_rmv_adv_set = 0x00007b35; -gap_rmv_dev_from_periodic_list = 0x00007b49; -gap_set_adv_set_random_addr = 0x00007b89; -gap_set_connection_parameter_range = 0x00007bd5; -gap_set_def_phy = 0x00007bed; -gap_set_ext_adv_data = 0x00007c05; -gap_set_ext_adv_enable = 0x00007c1d; -gap_set_ext_adv_para = 0x00007c99; -gap_set_ext_scan_enable = 0x00007d79; -gap_set_ext_scan_para = 0x00007d91; -gap_set_ext_scan_response_data = 0x00007e39; -gap_set_host_channel_classification = 0x00007e51; -gap_set_periodic_adv_data = 0x00007e65; -gap_set_periodic_adv_enable = 0x00007ed9; -gap_set_periodic_adv_para = 0x00007eed; -gap_set_phy = 0x00007f05; -gap_set_random_device_address = 0x00007f21; -gap_start_ccm = 0x00007f85; -gap_update_connection_parameters = 0x00007fcd; -gatt_client_cancel_write = 0x000084b5; -gatt_client_discover_characteristic_descriptors = 0x000084db; -gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x0000851d; -gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x0000856d; -gatt_client_discover_characteristics_for_service = 0x000085bd; -gatt_client_discover_primary_services = 0x000085f3; -gatt_client_discover_primary_services_by_uuid128 = 0x00008625; -gatt_client_discover_primary_services_by_uuid16 = 0x00008669; -gatt_client_execute_write = 0x000086a5; -gatt_client_find_included_services_for_service = 0x000086cb; -gatt_client_get_mtu = 0x000086f9; -gatt_client_is_ready = 0x000087a1; -gatt_client_listen_for_characteristic_value_updates = 0x000087b7; -gatt_client_prepare_write = 0x000087db; -gatt_client_pts_suppress_mtu_exchange = 0x00008819; -gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x00008825; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x0000884f; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00008855; -gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00008883; -gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00008889; -gatt_client_read_multiple_characteristic_values = 0x000088b7; -gatt_client_read_value_of_characteristic_using_value_handle = 0x000088e7; -gatt_client_read_value_of_characteristics_by_uuid128 = 0x00008915; -gatt_client_read_value_of_characteristics_by_uuid16 = 0x00008961; -gatt_client_register_handler = 0x000089ad; -gatt_client_reliable_write_long_value_of_characteristic = 0x000089b9; -gatt_client_signed_write_without_response = 0x00008de5; -gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x00008ea9; -gatt_client_write_client_characteristic_configuration = 0x00008ee3; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x00008f35; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00008f45; -gatt_client_write_long_value_of_characteristic = 0x00008f81; -gatt_client_write_long_value_of_characteristic_with_offset = 0x00008f91; -gatt_client_write_value_of_characteristic = 0x00008fcd; -gatt_client_write_value_of_characteristic_without_response = 0x00009003; -hci_add_event_handler = 0x0000b29d; -hci_power_control = 0x0000b9e5; -hci_register_acl_packet_handler = 0x0000bb99; -kv_get = 0x0000c219; -kv_init = 0x0000c231; -kv_put = 0x0000c281; -kv_remove = 0x0000c2f9; -kv_value_modified = 0x0000c369; -kv_visit = 0x0000c36d; -l2cap_can_send_fixed_channel_packet_now = 0x0000c42d; -l2cap_can_send_packet_now = 0x0000c431; -l2cap_create_channel = 0x0000c5e9; -l2cap_disconnect = 0x0000c721; -l2cap_get_remote_mtu_for_local_cid = 0x0000c9c5; -l2cap_init = 0x0000ce45; -l2cap_le_send_flow_control_credit = 0x0000ce8d; -l2cap_max_le_mtu = 0x0000d0f1; -l2cap_max_mtu = 0x0000d0f5; -l2cap_next_local_cid = 0x0000d0f9; -l2cap_next_sig_id = 0x0000d109; -l2cap_register_fixed_channel = 0x0000d1a1; -l2cap_register_packet_handler = 0x0000d1bd; -l2cap_register_service = 0x0000d1c9; -l2cap_request_can_send_fix_channel_now_event = 0x0000d2b1; -l2cap_request_can_send_now_event = 0x0000d2d5; -l2cap_request_connection_parameter_update = 0x0000d2ef; -l2cap_require_security_level_2_for_outgoing_sdp = 0x0000d321; -l2cap_send = 0x0000d6e5; -l2cap_send_connectionless = 0x0000d75d; -l2cap_send_connectionless3 = 0x0000d7ed; -l2cap_send_echo_request = 0x0000d885; -l2cap_send_signaling_le = 0x0000d8e9; -l2cap_unregister_service = 0x0000d941; -ll_hint_on_ce_len = 0x0000db25; -ll_set_adv_coded_scheme = 0x0000de01; -ll_set_initiating_coded_scheme = 0x0000de31; -nibble_for_char = 0x0001c60d; -platform_config = 0x0001c6b1; -platform_get_heap_status = 0x0001c6e5; -platform_get_version = 0x0001c6fd; -platform_patch_rf_init_data = 0x0001c705; -platform_printf = 0x0001c721; -platform_raise_assertion = 0x0001c735; -platform_read_persistent_reg = 0x0001c749; -platform_reset = 0x0001c759; -platform_set_evt_callback = 0x0001c78d; -platform_set_irq_callback = 0x0001c7a1; -platform_set_rf_clk_source = 0x0001c7d9; -platform_set_rf_init_data = 0x0001c7e5; -platform_set_rf_power_mapping = 0x0001c7f1; -platform_switch_app = 0x0001c7fd; -platform_write_persistent_reg = 0x0001c821; -printf_hexdump = 0x0001d511; -pvPortMalloc = 0x0001dfa1; -pvTaskIncrementMutexHeldCount = 0x0001e089; -pvTimerGetTimerID = 0x0001e0a1; -pxPortInitialiseStack = 0x0001e0cd; -reverse_128 = 0x0001e275; -reverse_24 = 0x0001e27b; -reverse_48 = 0x0001e281; -reverse_56 = 0x0001e287; -reverse_64 = 0x0001e28d; -reverse_bd_addr = 0x0001e293; -reverse_bytes = 0x0001e299; -sm_add_event_handler = 0x0001e3f9; -sm_address_resolution_lookup = 0x0001e525; -sm_authenticated = 0x0001e5ff; -sm_authorization_decline = 0x0001e60d; -sm_authorization_grant = 0x0001e62d; -sm_authorization_state = 0x0001e64d; -sm_bonding_decline = 0x0001e669; -sm_config = 0x0001ea41; -sm_encryption_key_size = 0x0001eb4d; -sm_just_works_confirm = 0x0001f31d; -sm_le_device_key = 0x0001f56d; -sm_passkey_input = 0x0001f605; -sm_private_random_address_generation_get = 0x0001f991; -sm_private_random_address_generation_get_mode = 0x0001f999; -sm_private_random_address_generation_set_mode = 0x0001f9a5; -sm_private_random_address_generation_set_update_period = 0x0001f9cd; -sm_register_oob_data_callback = 0x0001fa05; -sm_request_pairing = 0x0001fa11; -sm_send_security_request = 0x0002044b; -sm_set_accepted_stk_generation_methods = 0x00020471; -sm_set_authentication_requirements = 0x0002047d; -sm_set_encryption_key_size_range = 0x00020489; -sscanf_bd_addr = 0x00020785; -sysSetPublicDeviceAddr = 0x00020811; -uuid128_to_str = 0x00020b85; -uuid_add_bluetooth_prefix = 0x00020bdd; -uuid_has_bluetooth_prefix = 0x00020bfd; -uxQueueMessagesWaiting = 0x00020c41; -uxQueueMessagesWaitingFromISR = 0x00020c69; -uxQueueSpacesAvailable = 0x00020c85; -vPortFree = 0x00020db5; -vQueueDelete = 0x00020e89; -vQueueWaitForMessageRestricted = 0x00020eb5; -vTaskDelay = 0x00020efd; -vTaskInternalSetTimeOutState = 0x00020f49; -vTaskMissedYield = 0x00020f59; -vTaskPlaceOnEventList = 0x00020f65; -vTaskPlaceOnEventListRestricted = 0x00020f9d; -vTaskPriorityDisinheritAfterTimeout = 0x00020fdd; -vTaskStartScheduler = 0x00021089; -vTaskSuspendAll = 0x00021119; -vTaskSwitchContext = 0x00021129; -xPortStartScheduler = 0x000211d1; -xQueueAddToSet = 0x0002128d; -xQueueCreateCountingSemaphore = 0x000212b1; -xQueueCreateCountingSemaphoreStatic = 0x000212ed; -xQueueCreateMutex = 0x00021331; -xQueueCreateMutexStatic = 0x00021347; -xQueueCreateSet = 0x00021361; -xQueueGenericCreate = 0x00021369; -xQueueGenericCreateStatic = 0x000213b5; -xQueueGenericReset = 0x0002141d; -xQueueGenericSend = 0x000214a9; -xQueueGenericSendFromISR = 0x00021615; -xQueueGiveFromISR = 0x000216d5; -xQueueGiveMutexRecursive = 0x00021779; -xQueueIsQueueEmptyFromISR = 0x000217b9; -xQueueIsQueueFullFromISR = 0x000217dd; -xQueuePeek = 0x00021805; -xQueuePeekFromISR = 0x0002192d; -xQueueReceive = 0x00021999; -xQueueReceiveFromISR = 0x00021ac5; -xQueueRemoveFromSet = 0x00021b59; -xQueueSelectFromSet = 0x00021b7b; -xQueueSelectFromSetFromISR = 0x00021b8d; -xQueueSemaphoreTake = 0x00021ba1; -xQueueTakeMutexRecursive = 0x00021d0d; -xTaskCheckForTimeOut = 0x00021d51; -xTaskCreate = 0x00021dc1; -xTaskCreateStatic = 0x00021e1d; -xTaskGetCurrentTaskHandle = 0x00021e8d; -xTaskGetSchedulerState = 0x00021e99; -xTaskGetTickCount = 0x00021eb5; -xTaskIncrementTick = 0x00021ec1; -xTaskPriorityDisinherit = 0x00021f8d; -xTaskPriorityInherit = 0x00022021; -xTaskRemoveFromEventList = 0x000220b5; -xTaskResumeAll = 0x00022131; -xTimerCreate = 0x000221f9; -xTimerCreateStatic = 0x0002222d; -xTimerCreateTimerTask = 0x00022265; -xTimerGenericCommand = 0x000222d1; +att_dispatch_client_can_send_now = 0x00006259; +att_dispatch_client_request_can_send_now_event = 0x00006261; +att_dispatch_register_client = 0x00006279; +att_dispatch_register_server = 0x0000628d; +att_dispatch_server_can_send_now = 0x000062a1; +att_dispatch_server_request_can_send_now_event = 0x000062a9; +att_emit_general_event = 0x00006379; +att_server_can_send_packet_now = 0x00006abd; +att_server_get_mtu = 0x00006ac1; +att_server_indicate = 0x00006b35; +att_server_init = 0x00006bb9; +att_server_notify = 0x00006bf5; +att_server_register_packet_handler = 0x00006cdd; +att_server_request_can_send_now_event = 0x00006ce9; +att_set_db = 0x00006d05; +att_set_read_callback = 0x00006d19; +att_set_write_callback = 0x00006d25; +bd_addr_cmp = 0x00006e69; +bd_addr_copy = 0x00006e6f; +bd_addr_to_str = 0x00006e79; +big_endian_read_16 = 0x00006eb1; +big_endian_read_32 = 0x00006eb9; +big_endian_store_16 = 0x00006ecd; +big_endian_store_32 = 0x00006ed9; +btstack_push_user_msg = 0x00007185; +char_for_nibble = 0x000073dd; +gap_add_dev_to_periodic_list = 0x00007f4d; +gap_add_whitelist = 0x00007f65; +gap_aes_encrypt = 0x00007f79; +gap_clear_white_lists = 0x00007fa1; +gap_clr_adv_set = 0x00007fb1; +gap_clr_periodic_adv_list = 0x00007fc1; +gap_create_connection_cancel = 0x00007fed; +gap_default_periodic_adv_sync_transfer_param = 0x00007ffd; +gap_disconnect = 0x00008015; +gap_disconnect_all = 0x00008041; +gap_ext_create_connection = 0x000080e9; +gap_get_connection_parameter_range = 0x000081ad; +gap_le_read_channel_map = 0x000081e9; +gap_periodic_adv_create_sync = 0x0000825d; +gap_periodic_adv_create_sync_cancel = 0x00008281; +gap_periodic_adv_set_info_transfer = 0x00008291; +gap_periodic_adv_sync_transfer = 0x000082a9; +gap_periodic_adv_sync_transfer_param = 0x000082c1; +gap_periodic_adv_term_sync = 0x000082dd; +gap_read_antenna_info = 0x00008371; +gap_read_periodic_adv_list_size = 0x00008381; +gap_read_phy = 0x00008391; +gap_read_remote_info = 0x000083a5; +gap_read_remote_used_features = 0x000083b9; +gap_read_rssi = 0x000083cd; +gap_remove_whitelist = 0x000083e1; +gap_rmv_adv_set = 0x0000846d; +gap_rmv_dev_from_periodic_list = 0x00008481; +gap_set_adv_set_random_addr = 0x000084c1; +gap_set_connection_cte_request_enable = 0x0000850d; +gap_set_connection_cte_response_enable = 0x00008529; +gap_set_connection_cte_rx_param = 0x0000853d; +gap_set_connection_cte_tx_param = 0x00008599; +gap_set_connection_parameter_range = 0x000085ed; +gap_set_connectionless_cte_tx_enable = 0x00008605; +gap_set_connectionless_cte_tx_param = 0x00008619; +gap_set_connectionless_iq_sampling_enable = 0x0000867d; +gap_set_def_phy = 0x000086e1; +gap_set_ext_adv_data = 0x000086f9; +gap_set_ext_adv_enable = 0x00008711; +gap_set_ext_adv_para = 0x0000878d; +gap_set_ext_scan_enable = 0x0000886d; +gap_set_ext_scan_para = 0x00008885; +gap_set_ext_scan_response_data = 0x0000892d; +gap_set_host_channel_classification = 0x00008945; +gap_set_periodic_adv_data = 0x00008959; +gap_set_periodic_adv_enable = 0x000089cd; +gap_set_periodic_adv_para = 0x000089e1; +gap_set_periodic_adv_rx_enable = 0x000089f9; +gap_set_phy = 0x00008a0d; +gap_set_random_device_address = 0x00008a29; +gap_start_ccm = 0x00008a8d; +gap_update_connection_parameters = 0x00008ac1; +gatt_client_cancel_write = 0x00008fa9; +gatt_client_discover_characteristic_descriptors = 0x00008fcf; +gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x00009011; +gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x00009061; +gatt_client_discover_characteristics_for_service = 0x000090b1; +gatt_client_discover_primary_services = 0x000090e7; +gatt_client_discover_primary_services_by_uuid128 = 0x00009119; +gatt_client_discover_primary_services_by_uuid16 = 0x0000915d; +gatt_client_execute_write = 0x00009199; +gatt_client_find_included_services_for_service = 0x000091bf; +gatt_client_get_mtu = 0x000091ed; +gatt_client_is_ready = 0x00009295; +gatt_client_listen_for_characteristic_value_updates = 0x000092ab; +gatt_client_prepare_write = 0x000092cf; +gatt_client_pts_suppress_mtu_exchange = 0x0000930d; +gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x00009319; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x00009343; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00009349; +gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00009377; +gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x0000937d; +gatt_client_read_multiple_characteristic_values = 0x000093ab; +gatt_client_read_value_of_characteristic_using_value_handle = 0x000093db; +gatt_client_read_value_of_characteristics_by_uuid128 = 0x00009409; +gatt_client_read_value_of_characteristics_by_uuid16 = 0x00009455; +gatt_client_register_handler = 0x000094a1; +gatt_client_reliable_write_long_value_of_characteristic = 0x000094ad; +gatt_client_signed_write_without_response = 0x000098d9; +gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x0000999d; +gatt_client_write_client_characteristic_configuration = 0x000099d7; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x00009a29; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00009a39; +gatt_client_write_long_value_of_characteristic = 0x00009a75; +gatt_client_write_long_value_of_characteristic_with_offset = 0x00009a85; +gatt_client_write_value_of_characteristic = 0x00009ac1; +gatt_client_write_value_of_characteristic_without_response = 0x00009af7; +hci_add_event_handler = 0x0000b055; +hci_power_control = 0x0000b79d; +hci_register_acl_packet_handler = 0x0000b951; +kv_get = 0x0000bfd1; +kv_init = 0x0000bfe9; +kv_put = 0x0000c039; +kv_remove = 0x0000c0b1; +kv_value_modified = 0x0000c121; +kv_visit = 0x0000c125; +l2cap_can_send_fixed_channel_packet_now = 0x0000c1e5; +l2cap_can_send_packet_now = 0x0000c1e9; +l2cap_create_channel = 0x0000c3a1; +l2cap_disconnect = 0x0000c4d9; +l2cap_get_remote_mtu_for_local_cid = 0x0000c77d; +l2cap_init = 0x0000cbfd; +l2cap_le_send_flow_control_credit = 0x0000cc45; +l2cap_max_le_mtu = 0x0000cea9; +l2cap_max_mtu = 0x0000cead; +l2cap_next_local_cid = 0x0000ceb1; +l2cap_next_sig_id = 0x0000cec1; +l2cap_register_fixed_channel = 0x0000cf59; +l2cap_register_packet_handler = 0x0000cf75; +l2cap_register_service = 0x0000cf81; +l2cap_request_can_send_fix_channel_now_event = 0x0000d069; +l2cap_request_can_send_now_event = 0x0000d08d; +l2cap_request_connection_parameter_update = 0x0000d0a7; +l2cap_require_security_level_2_for_outgoing_sdp = 0x0000d0d9; +l2cap_send = 0x0000d49d; +l2cap_send_connectionless = 0x0000d515; +l2cap_send_connectionless3 = 0x0000d5a5; +l2cap_send_echo_request = 0x0000d63d; +l2cap_send_signaling_le = 0x0000d6a1; +l2cap_unregister_service = 0x0000d6f9; +ll_hint_on_ce_len = 0x0000d8dd; +ll_set_adv_coded_scheme = 0x0000dbc1; +ll_set_def_antenna = 0x0000dbf1; +ll_set_initiating_coded_scheme = 0x0000dc0d; +nibble_for_char = 0x0001d851; +platform_config = 0x0001d8f5; +platform_get_heap_status = 0x0001d941; +platform_get_version = 0x0001d959; +platform_hrng = 0x0001d961; +platform_patch_rf_init_data = 0x0001d969; +platform_printf = 0x0001d985; +platform_raise_assertion = 0x0001d999; +platform_read_persistent_reg = 0x0001d9ad; +platform_reset = 0x0001d9bd; +platform_set_evt_callback = 0x0001d9f1; +platform_set_irq_callback = 0x0001da05; +platform_set_rf_clk_source = 0x0001da3d; +platform_set_rf_init_data = 0x0001da49; +platform_set_rf_power_mapping = 0x0001da55; +platform_switch_app = 0x0001da61; +platform_write_persistent_reg = 0x0001da85; +printf_hexdump = 0x0001da95; +pvPortMalloc = 0x0001e525; +pvTaskIncrementMutexHeldCount = 0x0001e60d; +pvTimerGetTimerID = 0x0001e625; +pxPortInitialiseStack = 0x0001e651; +reverse_128 = 0x0001e811; +reverse_24 = 0x0001e817; +reverse_48 = 0x0001e81d; +reverse_56 = 0x0001e823; +reverse_64 = 0x0001e829; +reverse_bd_addr = 0x0001e82f; +reverse_bytes = 0x0001e835; +sm_add_event_handler = 0x0001e9d9; +sm_address_resolution_lookup = 0x0001eb05; +sm_authenticated = 0x0001ebdf; +sm_authorization_decline = 0x0001ebed; +sm_authorization_grant = 0x0001ec0d; +sm_authorization_state = 0x0001ec2d; +sm_bonding_decline = 0x0001ec49; +sm_config = 0x0001f021; +sm_encryption_key_size = 0x0001f12d; +sm_just_works_confirm = 0x0001f8fd; +sm_le_device_key = 0x0001fb4d; +sm_passkey_input = 0x0001fbe5; +sm_private_random_address_generation_get = 0x0001ff71; +sm_private_random_address_generation_get_mode = 0x0001ff79; +sm_private_random_address_generation_set_mode = 0x0001ff85; +sm_private_random_address_generation_set_update_period = 0x0001ffad; +sm_register_oob_data_callback = 0x0001ffe5; +sm_request_pairing = 0x0001fff1; +sm_send_security_request = 0x00020a2b; +sm_set_accepted_stk_generation_methods = 0x00020a51; +sm_set_authentication_requirements = 0x00020a5d; +sm_set_encryption_key_size_range = 0x00020a69; +sscanf_bd_addr = 0x00020d3d; +sysSetPublicDeviceAddr = 0x00020dc9; +uuid128_to_str = 0x0002126d; +uuid_add_bluetooth_prefix = 0x000212c5; +uuid_has_bluetooth_prefix = 0x000212e5; +uxQueueMessagesWaiting = 0x00021329; +uxQueueMessagesWaitingFromISR = 0x00021351; +uxQueueSpacesAvailable = 0x0002136d; +vPortFree = 0x0002149d; +vQueueDelete = 0x00021571; +vQueueWaitForMessageRestricted = 0x0002159d; +vTaskDelay = 0x000215e5; +vTaskInternalSetTimeOutState = 0x00021631; +vTaskMissedYield = 0x00021641; +vTaskPlaceOnEventList = 0x0002164d; +vTaskPlaceOnEventListRestricted = 0x00021685; +vTaskPriorityDisinheritAfterTimeout = 0x000216c5; +vTaskStartScheduler = 0x00021771; +vTaskSuspendAll = 0x00021801; +vTaskSwitchContext = 0x00021811; +xPortStartScheduler = 0x000218b9; +xQueueAddToSet = 0x00021975; +xQueueCreateCountingSemaphore = 0x00021999; +xQueueCreateCountingSemaphoreStatic = 0x000219d5; +xQueueCreateMutex = 0x00021a19; +xQueueCreateMutexStatic = 0x00021a2f; +xQueueCreateSet = 0x00021a49; +xQueueGenericCreate = 0x00021a51; +xQueueGenericCreateStatic = 0x00021a9d; +xQueueGenericReset = 0x00021b05; +xQueueGenericSend = 0x00021b91; +xQueueGenericSendFromISR = 0x00021cfd; +xQueueGiveFromISR = 0x00021dbd; +xQueueGiveMutexRecursive = 0x00021e61; +xQueueIsQueueEmptyFromISR = 0x00021ea1; +xQueueIsQueueFullFromISR = 0x00021ec5; +xQueuePeek = 0x00021eed; +xQueuePeekFromISR = 0x00022015; +xQueueReceive = 0x00022081; +xQueueReceiveFromISR = 0x000221ad; +xQueueRemoveFromSet = 0x00022241; +xQueueSelectFromSet = 0x00022263; +xQueueSelectFromSetFromISR = 0x00022275; +xQueueSemaphoreTake = 0x00022289; +xQueueTakeMutexRecursive = 0x000223f5; +xTaskCheckForTimeOut = 0x00022439; +xTaskCreate = 0x000224a9; +xTaskCreateStatic = 0x00022505; +xTaskGetCurrentTaskHandle = 0x00022575; +xTaskGetSchedulerState = 0x00022581; +xTaskGetTickCount = 0x0002259d; +xTaskIncrementTick = 0x000225a9; +xTaskPriorityDisinherit = 0x00022675; +xTaskPriorityInherit = 0x00022709; +xTaskRemoveFromEventList = 0x0002279d; +xTaskResumeAll = 0x00022819; +xTimerCreate = 0x000228e1; +xTimerCreateStatic = 0x00022915; +xTimerCreateTimerTask = 0x0002294d; +xTimerGenericCommand = 0x000229b9; diff --git a/bundles/typical/ING9188xx/symdefs.i b/bundles/typical/ING9188xx/symdefs.i index 18ad7d5ba..c285d37d4 100644 --- a/bundles/typical/ING9188xx/symdefs.i +++ b/bundles/typical/ING9188xx/symdefs.i @@ -1,247 +1,262 @@ ---define_symbol att_dispatch_client_can_send_now=0x000058d1 ---define_symbol att_dispatch_client_request_can_send_now_event=0x000058d9 ---define_symbol att_dispatch_register_client=0x000058f1 ---define_symbol att_dispatch_register_server=0x00005905 ---define_symbol att_dispatch_server_can_send_now=0x00005919 ---define_symbol att_dispatch_server_request_can_send_now_event=0x00005921 ---define_symbol att_emit_general_event=0x000059f1 ---define_symbol att_server_can_send_packet_now=0x00006135 ---define_symbol att_server_get_mtu=0x00006139 ---define_symbol att_server_indicate=0x000061ad ---define_symbol att_server_init=0x00006231 ---define_symbol att_server_notify=0x0000626d ---define_symbol att_server_register_packet_handler=0x00006355 ---define_symbol att_server_request_can_send_now_event=0x00006361 ---define_symbol att_set_db=0x0000637d ---define_symbol att_set_read_callback=0x00006391 ---define_symbol att_set_write_callback=0x0000639d ---define_symbol bd_addr_cmp=0x000064e1 ---define_symbol bd_addr_copy=0x000064e7 ---define_symbol bd_addr_to_str=0x000064f1 ---define_symbol big_endian_read_16=0x00006529 ---define_symbol big_endian_read_32=0x00006531 ---define_symbol big_endian_store_16=0x00006545 ---define_symbol big_endian_store_32=0x00006551 ---define_symbol btstack_push_user_msg=0x000067fd ---define_symbol char_for_nibble=0x00006a55 ---define_symbol gap_add_dev_to_periodic_list=0x000075b9 ---define_symbol gap_add_whitelist=0x000075d1 ---define_symbol gap_aes_encrypt=0x000075e5 ---define_symbol gap_clear_white_lists=0x0000760d ---define_symbol gap_clr_adv_set=0x0000761d ---define_symbol gap_clr_periodic_adv_list=0x0000762d ---define_symbol gap_create_connection_cancel=0x00007689 ---define_symbol gap_disconnect=0x00007699 ---define_symbol gap_disconnect_all=0x000076c5 ---define_symbol gap_ext_create_connection=0x0000776d ---define_symbol gap_get_connection_parameter_range=0x00007831 ---define_symbol gap_le_read_channel_map=0x00007871 ---define_symbol gap_periodic_adv_create_sync=0x00007981 ---define_symbol gap_periodic_adv_create_sync_cancel=0x000079a5 ---define_symbol gap_periodic_adv_term_sync=0x000079b5 ---define_symbol gap_read_periodic_adv_list_size=0x00007a49 ---define_symbol gap_read_phy=0x00007a59 ---define_symbol gap_read_remote_info=0x00007a6d ---define_symbol gap_read_remote_used_features=0x00007a81 ---define_symbol gap_read_rssi=0x00007a95 ---define_symbol gap_remove_whitelist=0x00007aa9 ---define_symbol gap_rmv_adv_set=0x00007b35 ---define_symbol gap_rmv_dev_from_periodic_list=0x00007b49 ---define_symbol gap_set_adv_set_random_addr=0x00007b89 ---define_symbol gap_set_connection_parameter_range=0x00007bd5 ---define_symbol gap_set_def_phy=0x00007bed ---define_symbol gap_set_ext_adv_data=0x00007c05 ---define_symbol gap_set_ext_adv_enable=0x00007c1d ---define_symbol gap_set_ext_adv_para=0x00007c99 ---define_symbol gap_set_ext_scan_enable=0x00007d79 ---define_symbol gap_set_ext_scan_para=0x00007d91 ---define_symbol gap_set_ext_scan_response_data=0x00007e39 ---define_symbol gap_set_host_channel_classification=0x00007e51 ---define_symbol gap_set_periodic_adv_data=0x00007e65 ---define_symbol gap_set_periodic_adv_enable=0x00007ed9 ---define_symbol gap_set_periodic_adv_para=0x00007eed ---define_symbol gap_set_phy=0x00007f05 ---define_symbol gap_set_random_device_address=0x00007f21 ---define_symbol gap_start_ccm=0x00007f85 ---define_symbol gap_update_connection_parameters=0x00007fcd ---define_symbol gatt_client_cancel_write=0x000084b5 ---define_symbol gatt_client_discover_characteristic_descriptors=0x000084db ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x0000851d ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000856d ---define_symbol gatt_client_discover_characteristics_for_service=0x000085bd ---define_symbol gatt_client_discover_primary_services=0x000085f3 ---define_symbol gatt_client_discover_primary_services_by_uuid128=0x00008625 ---define_symbol gatt_client_discover_primary_services_by_uuid16=0x00008669 ---define_symbol gatt_client_execute_write=0x000086a5 ---define_symbol gatt_client_find_included_services_for_service=0x000086cb ---define_symbol gatt_client_get_mtu=0x000086f9 ---define_symbol gatt_client_is_ready=0x000087a1 ---define_symbol gatt_client_listen_for_characteristic_value_updates=0x000087b7 ---define_symbol gatt_client_prepare_write=0x000087db ---define_symbol gatt_client_pts_suppress_mtu_exchange=0x00008819 ---define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00008825 ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x0000884f ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008855 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008883 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008889 ---define_symbol gatt_client_read_multiple_characteristic_values=0x000088b7 ---define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x000088e7 ---define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00008915 ---define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00008961 ---define_symbol gatt_client_register_handler=0x000089ad ---define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x000089b9 ---define_symbol gatt_client_signed_write_without_response=0x00008de5 ---define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00008ea9 ---define_symbol gatt_client_write_client_characteristic_configuration=0x00008ee3 ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00008f35 ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008f45 ---define_symbol gatt_client_write_long_value_of_characteristic=0x00008f81 ---define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00008f91 ---define_symbol gatt_client_write_value_of_characteristic=0x00008fcd ---define_symbol gatt_client_write_value_of_characteristic_without_response=0x00009003 ---define_symbol hci_add_event_handler=0x0000b29d ---define_symbol hci_power_control=0x0000b9e5 ---define_symbol hci_register_acl_packet_handler=0x0000bb99 ---define_symbol kv_get=0x0000c219 ---define_symbol kv_init=0x0000c231 ---define_symbol kv_put=0x0000c281 ---define_symbol kv_remove=0x0000c2f9 ---define_symbol kv_value_modified=0x0000c369 ---define_symbol kv_visit=0x0000c36d ---define_symbol l2cap_can_send_fixed_channel_packet_now=0x0000c42d ---define_symbol l2cap_can_send_packet_now=0x0000c431 ---define_symbol l2cap_create_channel=0x0000c5e9 ---define_symbol l2cap_disconnect=0x0000c721 ---define_symbol l2cap_get_remote_mtu_for_local_cid=0x0000c9c5 ---define_symbol l2cap_init=0x0000ce45 ---define_symbol l2cap_le_send_flow_control_credit=0x0000ce8d ---define_symbol l2cap_max_le_mtu=0x0000d0f1 ---define_symbol l2cap_max_mtu=0x0000d0f5 ---define_symbol l2cap_next_local_cid=0x0000d0f9 ---define_symbol l2cap_next_sig_id=0x0000d109 ---define_symbol l2cap_register_fixed_channel=0x0000d1a1 ---define_symbol l2cap_register_packet_handler=0x0000d1bd ---define_symbol l2cap_register_service=0x0000d1c9 ---define_symbol l2cap_request_can_send_fix_channel_now_event=0x0000d2b1 ---define_symbol l2cap_request_can_send_now_event=0x0000d2d5 ---define_symbol l2cap_request_connection_parameter_update=0x0000d2ef ---define_symbol l2cap_require_security_level_2_for_outgoing_sdp=0x0000d321 ---define_symbol l2cap_send=0x0000d6e5 ---define_symbol l2cap_send_connectionless=0x0000d75d ---define_symbol l2cap_send_connectionless3=0x0000d7ed ---define_symbol l2cap_send_echo_request=0x0000d885 ---define_symbol l2cap_send_signaling_le=0x0000d8e9 ---define_symbol l2cap_unregister_service=0x0000d941 ---define_symbol ll_hint_on_ce_len=0x0000db25 ---define_symbol ll_set_adv_coded_scheme=0x0000de01 ---define_symbol ll_set_initiating_coded_scheme=0x0000de31 ---define_symbol nibble_for_char=0x0001c60d ---define_symbol platform_config=0x0001c6b1 ---define_symbol platform_get_heap_status=0x0001c6e5 ---define_symbol platform_get_version=0x0001c6fd ---define_symbol platform_patch_rf_init_data=0x0001c705 ---define_symbol platform_printf=0x0001c721 ---define_symbol platform_raise_assertion=0x0001c735 ---define_symbol platform_read_persistent_reg=0x0001c749 ---define_symbol platform_reset=0x0001c759 ---define_symbol platform_set_evt_callback=0x0001c78d ---define_symbol platform_set_irq_callback=0x0001c7a1 ---define_symbol platform_set_rf_clk_source=0x0001c7d9 ---define_symbol platform_set_rf_init_data=0x0001c7e5 ---define_symbol platform_set_rf_power_mapping=0x0001c7f1 ---define_symbol platform_switch_app=0x0001c7fd ---define_symbol platform_write_persistent_reg=0x0001c821 ---define_symbol printf_hexdump=0x0001d511 ---define_symbol pvPortMalloc=0x0001dfa1 ---define_symbol pvTaskIncrementMutexHeldCount=0x0001e089 ---define_symbol pvTimerGetTimerID=0x0001e0a1 ---define_symbol pxPortInitialiseStack=0x0001e0cd ---define_symbol reverse_128=0x0001e275 ---define_symbol reverse_24=0x0001e27b ---define_symbol reverse_48=0x0001e281 ---define_symbol reverse_56=0x0001e287 ---define_symbol reverse_64=0x0001e28d ---define_symbol reverse_bd_addr=0x0001e293 ---define_symbol reverse_bytes=0x0001e299 ---define_symbol sm_add_event_handler=0x0001e3f9 ---define_symbol sm_address_resolution_lookup=0x0001e525 ---define_symbol sm_authenticated=0x0001e5ff ---define_symbol sm_authorization_decline=0x0001e60d ---define_symbol sm_authorization_grant=0x0001e62d ---define_symbol sm_authorization_state=0x0001e64d ---define_symbol sm_bonding_decline=0x0001e669 ---define_symbol sm_config=0x0001ea41 ---define_symbol sm_encryption_key_size=0x0001eb4d ---define_symbol sm_just_works_confirm=0x0001f31d ---define_symbol sm_le_device_key=0x0001f56d ---define_symbol sm_passkey_input=0x0001f605 ---define_symbol sm_private_random_address_generation_get=0x0001f991 ---define_symbol sm_private_random_address_generation_get_mode=0x0001f999 ---define_symbol sm_private_random_address_generation_set_mode=0x0001f9a5 ---define_symbol sm_private_random_address_generation_set_update_period=0x0001f9cd ---define_symbol sm_register_oob_data_callback=0x0001fa05 ---define_symbol sm_request_pairing=0x0001fa11 ---define_symbol sm_send_security_request=0x0002044b ---define_symbol sm_set_accepted_stk_generation_methods=0x00020471 ---define_symbol sm_set_authentication_requirements=0x0002047d ---define_symbol sm_set_encryption_key_size_range=0x00020489 ---define_symbol sscanf_bd_addr=0x00020785 ---define_symbol sysSetPublicDeviceAddr=0x00020811 ---define_symbol uuid128_to_str=0x00020b85 ---define_symbol uuid_add_bluetooth_prefix=0x00020bdd ---define_symbol uuid_has_bluetooth_prefix=0x00020bfd ---define_symbol uxQueueMessagesWaiting=0x00020c41 ---define_symbol uxQueueMessagesWaitingFromISR=0x00020c69 ---define_symbol uxQueueSpacesAvailable=0x00020c85 ---define_symbol vPortFree=0x00020db5 ---define_symbol vQueueDelete=0x00020e89 ---define_symbol vQueueWaitForMessageRestricted=0x00020eb5 ---define_symbol vTaskDelay=0x00020efd ---define_symbol vTaskInternalSetTimeOutState=0x00020f49 ---define_symbol vTaskMissedYield=0x00020f59 ---define_symbol vTaskPlaceOnEventList=0x00020f65 ---define_symbol vTaskPlaceOnEventListRestricted=0x00020f9d ---define_symbol vTaskPriorityDisinheritAfterTimeout=0x00020fdd ---define_symbol vTaskStartScheduler=0x00021089 ---define_symbol vTaskSuspendAll=0x00021119 ---define_symbol vTaskSwitchContext=0x00021129 ---define_symbol xPortStartScheduler=0x000211d1 ---define_symbol xQueueAddToSet=0x0002128d ---define_symbol xQueueCreateCountingSemaphore=0x000212b1 ---define_symbol xQueueCreateCountingSemaphoreStatic=0x000212ed ---define_symbol xQueueCreateMutex=0x00021331 ---define_symbol xQueueCreateMutexStatic=0x00021347 ---define_symbol xQueueCreateSet=0x00021361 ---define_symbol xQueueGenericCreate=0x00021369 ---define_symbol xQueueGenericCreateStatic=0x000213b5 ---define_symbol xQueueGenericReset=0x0002141d ---define_symbol xQueueGenericSend=0x000214a9 ---define_symbol xQueueGenericSendFromISR=0x00021615 ---define_symbol xQueueGiveFromISR=0x000216d5 ---define_symbol xQueueGiveMutexRecursive=0x00021779 ---define_symbol xQueueIsQueueEmptyFromISR=0x000217b9 ---define_symbol xQueueIsQueueFullFromISR=0x000217dd ---define_symbol xQueuePeek=0x00021805 ---define_symbol xQueuePeekFromISR=0x0002192d ---define_symbol xQueueReceive=0x00021999 ---define_symbol xQueueReceiveFromISR=0x00021ac5 ---define_symbol xQueueRemoveFromSet=0x00021b59 ---define_symbol xQueueSelectFromSet=0x00021b7b ---define_symbol xQueueSelectFromSetFromISR=0x00021b8d ---define_symbol xQueueSemaphoreTake=0x00021ba1 ---define_symbol xQueueTakeMutexRecursive=0x00021d0d ---define_symbol xTaskCheckForTimeOut=0x00021d51 ---define_symbol xTaskCreate=0x00021dc1 ---define_symbol xTaskCreateStatic=0x00021e1d ---define_symbol xTaskGetCurrentTaskHandle=0x00021e8d ---define_symbol xTaskGetSchedulerState=0x00021e99 ---define_symbol xTaskGetTickCount=0x00021eb5 ---define_symbol xTaskIncrementTick=0x00021ec1 ---define_symbol xTaskPriorityDisinherit=0x00021f8d ---define_symbol xTaskPriorityInherit=0x00022021 ---define_symbol xTaskRemoveFromEventList=0x000220b5 ---define_symbol xTaskResumeAll=0x00022131 ---define_symbol xTimerCreate=0x000221f9 ---define_symbol xTimerCreateStatic=0x0002222d ---define_symbol xTimerCreateTimerTask=0x00022265 ---define_symbol xTimerGenericCommand=0x000222d1 +--define_symbol att_dispatch_client_can_send_now=0x00006259 +--define_symbol att_dispatch_client_request_can_send_now_event=0x00006261 +--define_symbol att_dispatch_register_client=0x00006279 +--define_symbol att_dispatch_register_server=0x0000628d +--define_symbol att_dispatch_server_can_send_now=0x000062a1 +--define_symbol att_dispatch_server_request_can_send_now_event=0x000062a9 +--define_symbol att_emit_general_event=0x00006379 +--define_symbol att_server_can_send_packet_now=0x00006abd +--define_symbol att_server_get_mtu=0x00006ac1 +--define_symbol att_server_indicate=0x00006b35 +--define_symbol att_server_init=0x00006bb9 +--define_symbol att_server_notify=0x00006bf5 +--define_symbol att_server_register_packet_handler=0x00006cdd +--define_symbol att_server_request_can_send_now_event=0x00006ce9 +--define_symbol att_set_db=0x00006d05 +--define_symbol att_set_read_callback=0x00006d19 +--define_symbol att_set_write_callback=0x00006d25 +--define_symbol bd_addr_cmp=0x00006e69 +--define_symbol bd_addr_copy=0x00006e6f +--define_symbol bd_addr_to_str=0x00006e79 +--define_symbol big_endian_read_16=0x00006eb1 +--define_symbol big_endian_read_32=0x00006eb9 +--define_symbol big_endian_store_16=0x00006ecd +--define_symbol big_endian_store_32=0x00006ed9 +--define_symbol btstack_push_user_msg=0x00007185 +--define_symbol char_for_nibble=0x000073dd +--define_symbol gap_add_dev_to_periodic_list=0x00007f4d +--define_symbol gap_add_whitelist=0x00007f65 +--define_symbol gap_aes_encrypt=0x00007f79 +--define_symbol gap_clear_white_lists=0x00007fa1 +--define_symbol gap_clr_adv_set=0x00007fb1 +--define_symbol gap_clr_periodic_adv_list=0x00007fc1 +--define_symbol gap_create_connection_cancel=0x00007fed +--define_symbol gap_default_periodic_adv_sync_transfer_param=0x00007ffd +--define_symbol gap_disconnect=0x00008015 +--define_symbol gap_disconnect_all=0x00008041 +--define_symbol gap_ext_create_connection=0x000080e9 +--define_symbol gap_get_connection_parameter_range=0x000081ad +--define_symbol gap_le_read_channel_map=0x000081e9 +--define_symbol gap_periodic_adv_create_sync=0x0000825d +--define_symbol gap_periodic_adv_create_sync_cancel=0x00008281 +--define_symbol gap_periodic_adv_set_info_transfer=0x00008291 +--define_symbol gap_periodic_adv_sync_transfer=0x000082a9 +--define_symbol gap_periodic_adv_sync_transfer_param=0x000082c1 +--define_symbol gap_periodic_adv_term_sync=0x000082dd +--define_symbol gap_read_antenna_info=0x00008371 +--define_symbol gap_read_periodic_adv_list_size=0x00008381 +--define_symbol gap_read_phy=0x00008391 +--define_symbol gap_read_remote_info=0x000083a5 +--define_symbol gap_read_remote_used_features=0x000083b9 +--define_symbol gap_read_rssi=0x000083cd +--define_symbol gap_remove_whitelist=0x000083e1 +--define_symbol gap_rmv_adv_set=0x0000846d +--define_symbol gap_rmv_dev_from_periodic_list=0x00008481 +--define_symbol gap_set_adv_set_random_addr=0x000084c1 +--define_symbol gap_set_connection_cte_request_enable=0x0000850d +--define_symbol gap_set_connection_cte_response_enable=0x00008529 +--define_symbol gap_set_connection_cte_rx_param=0x0000853d +--define_symbol gap_set_connection_cte_tx_param=0x00008599 +--define_symbol gap_set_connection_parameter_range=0x000085ed +--define_symbol gap_set_connectionless_cte_tx_enable=0x00008605 +--define_symbol gap_set_connectionless_cte_tx_param=0x00008619 +--define_symbol gap_set_connectionless_iq_sampling_enable=0x0000867d +--define_symbol gap_set_def_phy=0x000086e1 +--define_symbol gap_set_ext_adv_data=0x000086f9 +--define_symbol gap_set_ext_adv_enable=0x00008711 +--define_symbol gap_set_ext_adv_para=0x0000878d +--define_symbol gap_set_ext_scan_enable=0x0000886d +--define_symbol gap_set_ext_scan_para=0x00008885 +--define_symbol gap_set_ext_scan_response_data=0x0000892d +--define_symbol gap_set_host_channel_classification=0x00008945 +--define_symbol gap_set_periodic_adv_data=0x00008959 +--define_symbol gap_set_periodic_adv_enable=0x000089cd +--define_symbol gap_set_periodic_adv_para=0x000089e1 +--define_symbol gap_set_periodic_adv_rx_enable=0x000089f9 +--define_symbol gap_set_phy=0x00008a0d +--define_symbol gap_set_random_device_address=0x00008a29 +--define_symbol gap_start_ccm=0x00008a8d +--define_symbol gap_update_connection_parameters=0x00008ac1 +--define_symbol gatt_client_cancel_write=0x00008fa9 +--define_symbol gatt_client_discover_characteristic_descriptors=0x00008fcf +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00009011 +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00009061 +--define_symbol gatt_client_discover_characteristics_for_service=0x000090b1 +--define_symbol gatt_client_discover_primary_services=0x000090e7 +--define_symbol gatt_client_discover_primary_services_by_uuid128=0x00009119 +--define_symbol gatt_client_discover_primary_services_by_uuid16=0x0000915d +--define_symbol gatt_client_execute_write=0x00009199 +--define_symbol gatt_client_find_included_services_for_service=0x000091bf +--define_symbol gatt_client_get_mtu=0x000091ed +--define_symbol gatt_client_is_ready=0x00009295 +--define_symbol gatt_client_listen_for_characteristic_value_updates=0x000092ab +--define_symbol gatt_client_prepare_write=0x000092cf +--define_symbol gatt_client_pts_suppress_mtu_exchange=0x0000930d +--define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00009319 +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00009343 +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009349 +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00009377 +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x0000937d +--define_symbol gatt_client_read_multiple_characteristic_values=0x000093ab +--define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x000093db +--define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00009409 +--define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00009455 +--define_symbol gatt_client_register_handler=0x000094a1 +--define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x000094ad +--define_symbol gatt_client_signed_write_without_response=0x000098d9 +--define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0000999d +--define_symbol gatt_client_write_client_characteristic_configuration=0x000099d7 +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009a29 +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009a39 +--define_symbol gatt_client_write_long_value_of_characteristic=0x00009a75 +--define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00009a85 +--define_symbol gatt_client_write_value_of_characteristic=0x00009ac1 +--define_symbol gatt_client_write_value_of_characteristic_without_response=0x00009af7 +--define_symbol hci_add_event_handler=0x0000b055 +--define_symbol hci_power_control=0x0000b79d +--define_symbol hci_register_acl_packet_handler=0x0000b951 +--define_symbol kv_get=0x0000bfd1 +--define_symbol kv_init=0x0000bfe9 +--define_symbol kv_put=0x0000c039 +--define_symbol kv_remove=0x0000c0b1 +--define_symbol kv_value_modified=0x0000c121 +--define_symbol kv_visit=0x0000c125 +--define_symbol l2cap_can_send_fixed_channel_packet_now=0x0000c1e5 +--define_symbol l2cap_can_send_packet_now=0x0000c1e9 +--define_symbol l2cap_create_channel=0x0000c3a1 +--define_symbol l2cap_disconnect=0x0000c4d9 +--define_symbol l2cap_get_remote_mtu_for_local_cid=0x0000c77d +--define_symbol l2cap_init=0x0000cbfd +--define_symbol l2cap_le_send_flow_control_credit=0x0000cc45 +--define_symbol l2cap_max_le_mtu=0x0000cea9 +--define_symbol l2cap_max_mtu=0x0000cead +--define_symbol l2cap_next_local_cid=0x0000ceb1 +--define_symbol l2cap_next_sig_id=0x0000cec1 +--define_symbol l2cap_register_fixed_channel=0x0000cf59 +--define_symbol l2cap_register_packet_handler=0x0000cf75 +--define_symbol l2cap_register_service=0x0000cf81 +--define_symbol l2cap_request_can_send_fix_channel_now_event=0x0000d069 +--define_symbol l2cap_request_can_send_now_event=0x0000d08d +--define_symbol l2cap_request_connection_parameter_update=0x0000d0a7 +--define_symbol l2cap_require_security_level_2_for_outgoing_sdp=0x0000d0d9 +--define_symbol l2cap_send=0x0000d49d +--define_symbol l2cap_send_connectionless=0x0000d515 +--define_symbol l2cap_send_connectionless3=0x0000d5a5 +--define_symbol l2cap_send_echo_request=0x0000d63d +--define_symbol l2cap_send_signaling_le=0x0000d6a1 +--define_symbol l2cap_unregister_service=0x0000d6f9 +--define_symbol ll_hint_on_ce_len=0x0000d8dd +--define_symbol ll_set_adv_coded_scheme=0x0000dbc1 +--define_symbol ll_set_def_antenna=0x0000dbf1 +--define_symbol ll_set_initiating_coded_scheme=0x0000dc0d +--define_symbol nibble_for_char=0x0001d851 +--define_symbol platform_config=0x0001d8f5 +--define_symbol platform_get_heap_status=0x0001d941 +--define_symbol platform_get_version=0x0001d959 +--define_symbol platform_hrng=0x0001d961 +--define_symbol platform_patch_rf_init_data=0x0001d969 +--define_symbol platform_printf=0x0001d985 +--define_symbol platform_raise_assertion=0x0001d999 +--define_symbol platform_read_persistent_reg=0x0001d9ad +--define_symbol platform_reset=0x0001d9bd +--define_symbol platform_set_evt_callback=0x0001d9f1 +--define_symbol platform_set_irq_callback=0x0001da05 +--define_symbol platform_set_rf_clk_source=0x0001da3d +--define_symbol platform_set_rf_init_data=0x0001da49 +--define_symbol platform_set_rf_power_mapping=0x0001da55 +--define_symbol platform_switch_app=0x0001da61 +--define_symbol platform_write_persistent_reg=0x0001da85 +--define_symbol printf_hexdump=0x0001da95 +--define_symbol pvPortMalloc=0x0001e525 +--define_symbol pvTaskIncrementMutexHeldCount=0x0001e60d +--define_symbol pvTimerGetTimerID=0x0001e625 +--define_symbol pxPortInitialiseStack=0x0001e651 +--define_symbol reverse_128=0x0001e811 +--define_symbol reverse_24=0x0001e817 +--define_symbol reverse_48=0x0001e81d +--define_symbol reverse_56=0x0001e823 +--define_symbol reverse_64=0x0001e829 +--define_symbol reverse_bd_addr=0x0001e82f +--define_symbol reverse_bytes=0x0001e835 +--define_symbol sm_add_event_handler=0x0001e9d9 +--define_symbol sm_address_resolution_lookup=0x0001eb05 +--define_symbol sm_authenticated=0x0001ebdf +--define_symbol sm_authorization_decline=0x0001ebed +--define_symbol sm_authorization_grant=0x0001ec0d +--define_symbol sm_authorization_state=0x0001ec2d +--define_symbol sm_bonding_decline=0x0001ec49 +--define_symbol sm_config=0x0001f021 +--define_symbol sm_encryption_key_size=0x0001f12d +--define_symbol sm_just_works_confirm=0x0001f8fd +--define_symbol sm_le_device_key=0x0001fb4d +--define_symbol sm_passkey_input=0x0001fbe5 +--define_symbol sm_private_random_address_generation_get=0x0001ff71 +--define_symbol sm_private_random_address_generation_get_mode=0x0001ff79 +--define_symbol sm_private_random_address_generation_set_mode=0x0001ff85 +--define_symbol sm_private_random_address_generation_set_update_period=0x0001ffad +--define_symbol sm_register_oob_data_callback=0x0001ffe5 +--define_symbol sm_request_pairing=0x0001fff1 +--define_symbol sm_send_security_request=0x00020a2b +--define_symbol sm_set_accepted_stk_generation_methods=0x00020a51 +--define_symbol sm_set_authentication_requirements=0x00020a5d +--define_symbol sm_set_encryption_key_size_range=0x00020a69 +--define_symbol sscanf_bd_addr=0x00020d3d +--define_symbol sysSetPublicDeviceAddr=0x00020dc9 +--define_symbol uuid128_to_str=0x0002126d +--define_symbol uuid_add_bluetooth_prefix=0x000212c5 +--define_symbol uuid_has_bluetooth_prefix=0x000212e5 +--define_symbol uxQueueMessagesWaiting=0x00021329 +--define_symbol uxQueueMessagesWaitingFromISR=0x00021351 +--define_symbol uxQueueSpacesAvailable=0x0002136d +--define_symbol vPortFree=0x0002149d +--define_symbol vQueueDelete=0x00021571 +--define_symbol vQueueWaitForMessageRestricted=0x0002159d +--define_symbol vTaskDelay=0x000215e5 +--define_symbol vTaskInternalSetTimeOutState=0x00021631 +--define_symbol vTaskMissedYield=0x00021641 +--define_symbol vTaskPlaceOnEventList=0x0002164d +--define_symbol vTaskPlaceOnEventListRestricted=0x00021685 +--define_symbol vTaskPriorityDisinheritAfterTimeout=0x000216c5 +--define_symbol vTaskStartScheduler=0x00021771 +--define_symbol vTaskSuspendAll=0x00021801 +--define_symbol vTaskSwitchContext=0x00021811 +--define_symbol xPortStartScheduler=0x000218b9 +--define_symbol xQueueAddToSet=0x00021975 +--define_symbol xQueueCreateCountingSemaphore=0x00021999 +--define_symbol xQueueCreateCountingSemaphoreStatic=0x000219d5 +--define_symbol xQueueCreateMutex=0x00021a19 +--define_symbol xQueueCreateMutexStatic=0x00021a2f +--define_symbol xQueueCreateSet=0x00021a49 +--define_symbol xQueueGenericCreate=0x00021a51 +--define_symbol xQueueGenericCreateStatic=0x00021a9d +--define_symbol xQueueGenericReset=0x00021b05 +--define_symbol xQueueGenericSend=0x00021b91 +--define_symbol xQueueGenericSendFromISR=0x00021cfd +--define_symbol xQueueGiveFromISR=0x00021dbd +--define_symbol xQueueGiveMutexRecursive=0x00021e61 +--define_symbol xQueueIsQueueEmptyFromISR=0x00021ea1 +--define_symbol xQueueIsQueueFullFromISR=0x00021ec5 +--define_symbol xQueuePeek=0x00021eed +--define_symbol xQueuePeekFromISR=0x00022015 +--define_symbol xQueueReceive=0x00022081 +--define_symbol xQueueReceiveFromISR=0x000221ad +--define_symbol xQueueRemoveFromSet=0x00022241 +--define_symbol xQueueSelectFromSet=0x00022263 +--define_symbol xQueueSelectFromSetFromISR=0x00022275 +--define_symbol xQueueSemaphoreTake=0x00022289 +--define_symbol xQueueTakeMutexRecursive=0x000223f5 +--define_symbol xTaskCheckForTimeOut=0x00022439 +--define_symbol xTaskCreate=0x000224a9 +--define_symbol xTaskCreateStatic=0x00022505 +--define_symbol xTaskGetCurrentTaskHandle=0x00022575 +--define_symbol xTaskGetSchedulerState=0x00022581 +--define_symbol xTaskGetTickCount=0x0002259d +--define_symbol xTaskIncrementTick=0x000225a9 +--define_symbol xTaskPriorityDisinherit=0x00022675 +--define_symbol xTaskPriorityInherit=0x00022709 +--define_symbol xTaskRemoveFromEventList=0x0002279d +--define_symbol xTaskResumeAll=0x00022819 +--define_symbol xTimerCreate=0x000228e1 +--define_symbol xTimerCreateStatic=0x00022915 +--define_symbol xTimerCreateTimerTask=0x0002294d +--define_symbol xTimerGenericCommand=0x000229b9 diff --git a/bundles/typical/ING9188xx/symdefs.m b/bundles/typical/ING9188xx/symdefs.m index 5ed6c435a..947fde13f 100644 --- a/bundles/typical/ING9188xx/symdefs.m +++ b/bundles/typical/ING9188xx/symdefs.m @@ -1,248 +1,263 @@ ## ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 -0x000058d1 T att_dispatch_client_can_send_now -0x000058d9 T att_dispatch_client_request_can_send_now_event -0x000058f1 T att_dispatch_register_client -0x00005905 T att_dispatch_register_server -0x00005919 T att_dispatch_server_can_send_now -0x00005921 T att_dispatch_server_request_can_send_now_event -0x000059f1 T att_emit_general_event -0x00006135 T att_server_can_send_packet_now -0x00006139 T att_server_get_mtu -0x000061ad T att_server_indicate -0x00006231 T att_server_init -0x0000626d T att_server_notify -0x00006355 T att_server_register_packet_handler -0x00006361 T att_server_request_can_send_now_event -0x0000637d T att_set_db -0x00006391 T att_set_read_callback -0x0000639d T att_set_write_callback -0x000064e1 T bd_addr_cmp -0x000064e7 T bd_addr_copy -0x000064f1 T bd_addr_to_str -0x00006529 T big_endian_read_16 -0x00006531 T big_endian_read_32 -0x00006545 T big_endian_store_16 -0x00006551 T big_endian_store_32 -0x000067fd T btstack_push_user_msg -0x00006a55 T char_for_nibble -0x000075b9 T gap_add_dev_to_periodic_list -0x000075d1 T gap_add_whitelist -0x000075e5 T gap_aes_encrypt -0x0000760d T gap_clear_white_lists -0x0000761d T gap_clr_adv_set -0x0000762d T gap_clr_periodic_adv_list -0x00007689 T gap_create_connection_cancel -0x00007699 T gap_disconnect -0x000076c5 T gap_disconnect_all -0x0000776d T gap_ext_create_connection -0x00007831 T gap_get_connection_parameter_range -0x00007871 T gap_le_read_channel_map -0x00007981 T gap_periodic_adv_create_sync -0x000079a5 T gap_periodic_adv_create_sync_cancel -0x000079b5 T gap_periodic_adv_term_sync -0x00007a49 T gap_read_periodic_adv_list_size -0x00007a59 T gap_read_phy -0x00007a6d T gap_read_remote_info -0x00007a81 T gap_read_remote_used_features -0x00007a95 T gap_read_rssi -0x00007aa9 T gap_remove_whitelist -0x00007b35 T gap_rmv_adv_set -0x00007b49 T gap_rmv_dev_from_periodic_list -0x00007b89 T gap_set_adv_set_random_addr -0x00007bd5 T gap_set_connection_parameter_range -0x00007bed T gap_set_def_phy -0x00007c05 T gap_set_ext_adv_data -0x00007c1d T gap_set_ext_adv_enable -0x00007c99 T gap_set_ext_adv_para -0x00007d79 T gap_set_ext_scan_enable -0x00007d91 T gap_set_ext_scan_para -0x00007e39 T gap_set_ext_scan_response_data -0x00007e51 T gap_set_host_channel_classification -0x00007e65 T gap_set_periodic_adv_data -0x00007ed9 T gap_set_periodic_adv_enable -0x00007eed T gap_set_periodic_adv_para -0x00007f05 T gap_set_phy -0x00007f21 T gap_set_random_device_address -0x00007f85 T gap_start_ccm -0x00007fcd T gap_update_connection_parameters -0x000084b5 T gatt_client_cancel_write -0x000084db T gatt_client_discover_characteristic_descriptors -0x0000851d T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x0000856d T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x000085bd T gatt_client_discover_characteristics_for_service -0x000085f3 T gatt_client_discover_primary_services -0x00008625 T gatt_client_discover_primary_services_by_uuid128 -0x00008669 T gatt_client_discover_primary_services_by_uuid16 -0x000086a5 T gatt_client_execute_write -0x000086cb T gatt_client_find_included_services_for_service -0x000086f9 T gatt_client_get_mtu -0x000087a1 T gatt_client_is_ready -0x000087b7 T gatt_client_listen_for_characteristic_value_updates -0x000087db T gatt_client_prepare_write -0x00008819 T gatt_client_pts_suppress_mtu_exchange -0x00008825 T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x0000884f T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x00008855 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00008883 T gatt_client_read_long_value_of_characteristic_using_value_handle -0x00008889 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x000088b7 T gatt_client_read_multiple_characteristic_values -0x000088e7 T gatt_client_read_value_of_characteristic_using_value_handle -0x00008915 T gatt_client_read_value_of_characteristics_by_uuid128 -0x00008961 T gatt_client_read_value_of_characteristics_by_uuid16 -0x000089ad T gatt_client_register_handler -0x000089b9 T gatt_client_reliable_write_long_value_of_characteristic -0x00008de5 T gatt_client_signed_write_without_response -0x00008ea9 T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x00008ee3 T gatt_client_write_client_characteristic_configuration -0x00008f35 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x00008f45 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00008f81 T gatt_client_write_long_value_of_characteristic -0x00008f91 T gatt_client_write_long_value_of_characteristic_with_offset -0x00008fcd T gatt_client_write_value_of_characteristic -0x00009003 T gatt_client_write_value_of_characteristic_without_response -0x0000b29d T hci_add_event_handler -0x0000b9e5 T hci_power_control -0x0000bb99 T hci_register_acl_packet_handler -0x0000c219 T kv_get -0x0000c231 T kv_init -0x0000c281 T kv_put -0x0000c2f9 T kv_remove -0x0000c369 T kv_value_modified -0x0000c36d T kv_visit -0x0000c42d T l2cap_can_send_fixed_channel_packet_now -0x0000c431 T l2cap_can_send_packet_now -0x0000c5e9 T l2cap_create_channel -0x0000c721 T l2cap_disconnect -0x0000c9c5 T l2cap_get_remote_mtu_for_local_cid -0x0000ce45 T l2cap_init -0x0000ce8d T l2cap_le_send_flow_control_credit -0x0000d0f1 T l2cap_max_le_mtu -0x0000d0f5 T l2cap_max_mtu -0x0000d0f9 T l2cap_next_local_cid -0x0000d109 T l2cap_next_sig_id -0x0000d1a1 T l2cap_register_fixed_channel -0x0000d1bd T l2cap_register_packet_handler -0x0000d1c9 T l2cap_register_service -0x0000d2b1 T l2cap_request_can_send_fix_channel_now_event -0x0000d2d5 T l2cap_request_can_send_now_event -0x0000d2ef T l2cap_request_connection_parameter_update -0x0000d321 T l2cap_require_security_level_2_for_outgoing_sdp -0x0000d6e5 T l2cap_send -0x0000d75d T l2cap_send_connectionless -0x0000d7ed T l2cap_send_connectionless3 -0x0000d885 T l2cap_send_echo_request -0x0000d8e9 T l2cap_send_signaling_le -0x0000d941 T l2cap_unregister_service -0x0000db25 T ll_hint_on_ce_len -0x0000de01 T ll_set_adv_coded_scheme -0x0000de31 T ll_set_initiating_coded_scheme -0x0001c60d T nibble_for_char -0x0001c6b1 T platform_config -0x0001c6e5 T platform_get_heap_status -0x0001c6fd T platform_get_version -0x0001c705 T platform_patch_rf_init_data -0x0001c721 T platform_printf -0x0001c735 T platform_raise_assertion -0x0001c749 T platform_read_persistent_reg -0x0001c759 T platform_reset -0x0001c78d T platform_set_evt_callback -0x0001c7a1 T platform_set_irq_callback -0x0001c7d9 T platform_set_rf_clk_source -0x0001c7e5 T platform_set_rf_init_data -0x0001c7f1 T platform_set_rf_power_mapping -0x0001c7fd T platform_switch_app -0x0001c821 T platform_write_persistent_reg -0x0001d511 T printf_hexdump -0x0001dfa1 T pvPortMalloc -0x0001e089 T pvTaskIncrementMutexHeldCount -0x0001e0a1 T pvTimerGetTimerID -0x0001e0cd T pxPortInitialiseStack -0x0001e275 T reverse_128 -0x0001e27b T reverse_24 -0x0001e281 T reverse_48 -0x0001e287 T reverse_56 -0x0001e28d T reverse_64 -0x0001e293 T reverse_bd_addr -0x0001e299 T reverse_bytes -0x0001e3f9 T sm_add_event_handler -0x0001e525 T sm_address_resolution_lookup -0x0001e5ff T sm_authenticated -0x0001e60d T sm_authorization_decline -0x0001e62d T sm_authorization_grant -0x0001e64d T sm_authorization_state -0x0001e669 T sm_bonding_decline -0x0001ea41 T sm_config -0x0001eb4d T sm_encryption_key_size -0x0001f31d T sm_just_works_confirm -0x0001f56d T sm_le_device_key -0x0001f605 T sm_passkey_input -0x0001f991 T sm_private_random_address_generation_get -0x0001f999 T sm_private_random_address_generation_get_mode -0x0001f9a5 T sm_private_random_address_generation_set_mode -0x0001f9cd T sm_private_random_address_generation_set_update_period -0x0001fa05 T sm_register_oob_data_callback -0x0001fa11 T sm_request_pairing -0x0002044b T sm_send_security_request -0x00020471 T sm_set_accepted_stk_generation_methods -0x0002047d T sm_set_authentication_requirements -0x00020489 T sm_set_encryption_key_size_range -0x00020785 T sscanf_bd_addr -0x00020811 T sysSetPublicDeviceAddr -0x00020b85 T uuid128_to_str -0x00020bdd T uuid_add_bluetooth_prefix -0x00020bfd T uuid_has_bluetooth_prefix -0x00020c41 T uxQueueMessagesWaiting -0x00020c69 T uxQueueMessagesWaitingFromISR -0x00020c85 T uxQueueSpacesAvailable -0x00020db5 T vPortFree -0x00020e89 T vQueueDelete -0x00020eb5 T vQueueWaitForMessageRestricted -0x00020efd T vTaskDelay -0x00020f49 T vTaskInternalSetTimeOutState -0x00020f59 T vTaskMissedYield -0x00020f65 T vTaskPlaceOnEventList -0x00020f9d T vTaskPlaceOnEventListRestricted -0x00020fdd T vTaskPriorityDisinheritAfterTimeout -0x00021089 T vTaskStartScheduler -0x00021119 T vTaskSuspendAll -0x00021129 T vTaskSwitchContext -0x000211d1 T xPortStartScheduler -0x0002128d T xQueueAddToSet -0x000212b1 T xQueueCreateCountingSemaphore -0x000212ed T xQueueCreateCountingSemaphoreStatic -0x00021331 T xQueueCreateMutex -0x00021347 T xQueueCreateMutexStatic -0x00021361 T xQueueCreateSet -0x00021369 T xQueueGenericCreate -0x000213b5 T xQueueGenericCreateStatic -0x0002141d T xQueueGenericReset -0x000214a9 T xQueueGenericSend -0x00021615 T xQueueGenericSendFromISR -0x000216d5 T xQueueGiveFromISR -0x00021779 T xQueueGiveMutexRecursive -0x000217b9 T xQueueIsQueueEmptyFromISR -0x000217dd T xQueueIsQueueFullFromISR -0x00021805 T xQueuePeek -0x0002192d T xQueuePeekFromISR -0x00021999 T xQueueReceive -0x00021ac5 T xQueueReceiveFromISR -0x00021b59 T xQueueRemoveFromSet -0x00021b7b T xQueueSelectFromSet -0x00021b8d T xQueueSelectFromSetFromISR -0x00021ba1 T xQueueSemaphoreTake -0x00021d0d T xQueueTakeMutexRecursive -0x00021d51 T xTaskCheckForTimeOut -0x00021dc1 T xTaskCreate -0x00021e1d T xTaskCreateStatic -0x00021e8d T xTaskGetCurrentTaskHandle -0x00021e99 T xTaskGetSchedulerState -0x00021eb5 T xTaskGetTickCount -0x00021ec1 T xTaskIncrementTick -0x00021f8d T xTaskPriorityDisinherit -0x00022021 T xTaskPriorityInherit -0x000220b5 T xTaskRemoveFromEventList -0x00022131 T xTaskResumeAll -0x000221f9 T xTimerCreate -0x0002222d T xTimerCreateStatic -0x00022265 T xTimerCreateTimerTask -0x000222d1 T xTimerGenericCommand +0x00006259 T att_dispatch_client_can_send_now +0x00006261 T att_dispatch_client_request_can_send_now_event +0x00006279 T att_dispatch_register_client +0x0000628d T att_dispatch_register_server +0x000062a1 T att_dispatch_server_can_send_now +0x000062a9 T att_dispatch_server_request_can_send_now_event +0x00006379 T att_emit_general_event +0x00006abd T att_server_can_send_packet_now +0x00006ac1 T att_server_get_mtu +0x00006b35 T att_server_indicate +0x00006bb9 T att_server_init +0x00006bf5 T att_server_notify +0x00006cdd T att_server_register_packet_handler +0x00006ce9 T att_server_request_can_send_now_event +0x00006d05 T att_set_db +0x00006d19 T att_set_read_callback +0x00006d25 T att_set_write_callback +0x00006e69 T bd_addr_cmp +0x00006e6f T bd_addr_copy +0x00006e79 T bd_addr_to_str +0x00006eb1 T big_endian_read_16 +0x00006eb9 T big_endian_read_32 +0x00006ecd T big_endian_store_16 +0x00006ed9 T big_endian_store_32 +0x00007185 T btstack_push_user_msg +0x000073dd T char_for_nibble +0x00007f4d T gap_add_dev_to_periodic_list +0x00007f65 T gap_add_whitelist +0x00007f79 T gap_aes_encrypt +0x00007fa1 T gap_clear_white_lists +0x00007fb1 T gap_clr_adv_set +0x00007fc1 T gap_clr_periodic_adv_list +0x00007fed T gap_create_connection_cancel +0x00007ffd T gap_default_periodic_adv_sync_transfer_param +0x00008015 T gap_disconnect +0x00008041 T gap_disconnect_all +0x000080e9 T gap_ext_create_connection +0x000081ad T gap_get_connection_parameter_range +0x000081e9 T gap_le_read_channel_map +0x0000825d T gap_periodic_adv_create_sync +0x00008281 T gap_periodic_adv_create_sync_cancel +0x00008291 T gap_periodic_adv_set_info_transfer +0x000082a9 T gap_periodic_adv_sync_transfer +0x000082c1 T gap_periodic_adv_sync_transfer_param +0x000082dd T gap_periodic_adv_term_sync +0x00008371 T gap_read_antenna_info +0x00008381 T gap_read_periodic_adv_list_size +0x00008391 T gap_read_phy +0x000083a5 T gap_read_remote_info +0x000083b9 T gap_read_remote_used_features +0x000083cd T gap_read_rssi +0x000083e1 T gap_remove_whitelist +0x0000846d T gap_rmv_adv_set +0x00008481 T gap_rmv_dev_from_periodic_list +0x000084c1 T gap_set_adv_set_random_addr +0x0000850d T gap_set_connection_cte_request_enable +0x00008529 T gap_set_connection_cte_response_enable +0x0000853d T gap_set_connection_cte_rx_param +0x00008599 T gap_set_connection_cte_tx_param +0x000085ed T gap_set_connection_parameter_range +0x00008605 T gap_set_connectionless_cte_tx_enable +0x00008619 T gap_set_connectionless_cte_tx_param +0x0000867d T gap_set_connectionless_iq_sampling_enable +0x000086e1 T gap_set_def_phy +0x000086f9 T gap_set_ext_adv_data +0x00008711 T gap_set_ext_adv_enable +0x0000878d T gap_set_ext_adv_para +0x0000886d T gap_set_ext_scan_enable +0x00008885 T gap_set_ext_scan_para +0x0000892d T gap_set_ext_scan_response_data +0x00008945 T gap_set_host_channel_classification +0x00008959 T gap_set_periodic_adv_data +0x000089cd T gap_set_periodic_adv_enable +0x000089e1 T gap_set_periodic_adv_para +0x000089f9 T gap_set_periodic_adv_rx_enable +0x00008a0d T gap_set_phy +0x00008a29 T gap_set_random_device_address +0x00008a8d T gap_start_ccm +0x00008ac1 T gap_update_connection_parameters +0x00008fa9 T gatt_client_cancel_write +0x00008fcf T gatt_client_discover_characteristic_descriptors +0x00009011 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 +0x00009061 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 +0x000090b1 T gatt_client_discover_characteristics_for_service +0x000090e7 T gatt_client_discover_primary_services +0x00009119 T gatt_client_discover_primary_services_by_uuid128 +0x0000915d T gatt_client_discover_primary_services_by_uuid16 +0x00009199 T gatt_client_execute_write +0x000091bf T gatt_client_find_included_services_for_service +0x000091ed T gatt_client_get_mtu +0x00009295 T gatt_client_is_ready +0x000092ab T gatt_client_listen_for_characteristic_value_updates +0x000092cf T gatt_client_prepare_write +0x0000930d T gatt_client_pts_suppress_mtu_exchange +0x00009319 T gatt_client_read_characteristic_descriptor_using_descriptor_handle +0x00009343 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle +0x00009349 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00009377 T gatt_client_read_long_value_of_characteristic_using_value_handle +0x0000937d T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset +0x000093ab T gatt_client_read_multiple_characteristic_values +0x000093db T gatt_client_read_value_of_characteristic_using_value_handle +0x00009409 T gatt_client_read_value_of_characteristics_by_uuid128 +0x00009455 T gatt_client_read_value_of_characteristics_by_uuid16 +0x000094a1 T gatt_client_register_handler +0x000094ad T gatt_client_reliable_write_long_value_of_characteristic +0x000098d9 T gatt_client_signed_write_without_response +0x0000999d T gatt_client_write_characteristic_descriptor_using_descriptor_handle +0x000099d7 T gatt_client_write_client_characteristic_configuration +0x00009a29 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle +0x00009a39 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00009a75 T gatt_client_write_long_value_of_characteristic +0x00009a85 T gatt_client_write_long_value_of_characteristic_with_offset +0x00009ac1 T gatt_client_write_value_of_characteristic +0x00009af7 T gatt_client_write_value_of_characteristic_without_response +0x0000b055 T hci_add_event_handler +0x0000b79d T hci_power_control +0x0000b951 T hci_register_acl_packet_handler +0x0000bfd1 T kv_get +0x0000bfe9 T kv_init +0x0000c039 T kv_put +0x0000c0b1 T kv_remove +0x0000c121 T kv_value_modified +0x0000c125 T kv_visit +0x0000c1e5 T l2cap_can_send_fixed_channel_packet_now +0x0000c1e9 T l2cap_can_send_packet_now +0x0000c3a1 T l2cap_create_channel +0x0000c4d9 T l2cap_disconnect +0x0000c77d T l2cap_get_remote_mtu_for_local_cid +0x0000cbfd T l2cap_init +0x0000cc45 T l2cap_le_send_flow_control_credit +0x0000cea9 T l2cap_max_le_mtu +0x0000cead T l2cap_max_mtu +0x0000ceb1 T l2cap_next_local_cid +0x0000cec1 T l2cap_next_sig_id +0x0000cf59 T l2cap_register_fixed_channel +0x0000cf75 T l2cap_register_packet_handler +0x0000cf81 T l2cap_register_service +0x0000d069 T l2cap_request_can_send_fix_channel_now_event +0x0000d08d T l2cap_request_can_send_now_event +0x0000d0a7 T l2cap_request_connection_parameter_update +0x0000d0d9 T l2cap_require_security_level_2_for_outgoing_sdp +0x0000d49d T l2cap_send +0x0000d515 T l2cap_send_connectionless +0x0000d5a5 T l2cap_send_connectionless3 +0x0000d63d T l2cap_send_echo_request +0x0000d6a1 T l2cap_send_signaling_le +0x0000d6f9 T l2cap_unregister_service +0x0000d8dd T ll_hint_on_ce_len +0x0000dbc1 T ll_set_adv_coded_scheme +0x0000dbf1 T ll_set_def_antenna +0x0000dc0d T ll_set_initiating_coded_scheme +0x0001d851 T nibble_for_char +0x0001d8f5 T platform_config +0x0001d941 T platform_get_heap_status +0x0001d959 T platform_get_version +0x0001d961 T platform_hrng +0x0001d969 T platform_patch_rf_init_data +0x0001d985 T platform_printf +0x0001d999 T platform_raise_assertion +0x0001d9ad T platform_read_persistent_reg +0x0001d9bd T platform_reset +0x0001d9f1 T platform_set_evt_callback +0x0001da05 T platform_set_irq_callback +0x0001da3d T platform_set_rf_clk_source +0x0001da49 T platform_set_rf_init_data +0x0001da55 T platform_set_rf_power_mapping +0x0001da61 T platform_switch_app +0x0001da85 T platform_write_persistent_reg +0x0001da95 T printf_hexdump +0x0001e525 T pvPortMalloc +0x0001e60d T pvTaskIncrementMutexHeldCount +0x0001e625 T pvTimerGetTimerID +0x0001e651 T pxPortInitialiseStack +0x0001e811 T reverse_128 +0x0001e817 T reverse_24 +0x0001e81d T reverse_48 +0x0001e823 T reverse_56 +0x0001e829 T reverse_64 +0x0001e82f T reverse_bd_addr +0x0001e835 T reverse_bytes +0x0001e9d9 T sm_add_event_handler +0x0001eb05 T sm_address_resolution_lookup +0x0001ebdf T sm_authenticated +0x0001ebed T sm_authorization_decline +0x0001ec0d T sm_authorization_grant +0x0001ec2d T sm_authorization_state +0x0001ec49 T sm_bonding_decline +0x0001f021 T sm_config +0x0001f12d T sm_encryption_key_size +0x0001f8fd T sm_just_works_confirm +0x0001fb4d T sm_le_device_key +0x0001fbe5 T sm_passkey_input +0x0001ff71 T sm_private_random_address_generation_get +0x0001ff79 T sm_private_random_address_generation_get_mode +0x0001ff85 T sm_private_random_address_generation_set_mode +0x0001ffad T sm_private_random_address_generation_set_update_period +0x0001ffe5 T sm_register_oob_data_callback +0x0001fff1 T sm_request_pairing +0x00020a2b T sm_send_security_request +0x00020a51 T sm_set_accepted_stk_generation_methods +0x00020a5d T sm_set_authentication_requirements +0x00020a69 T sm_set_encryption_key_size_range +0x00020d3d T sscanf_bd_addr +0x00020dc9 T sysSetPublicDeviceAddr +0x0002126d T uuid128_to_str +0x000212c5 T uuid_add_bluetooth_prefix +0x000212e5 T uuid_has_bluetooth_prefix +0x00021329 T uxQueueMessagesWaiting +0x00021351 T uxQueueMessagesWaitingFromISR +0x0002136d T uxQueueSpacesAvailable +0x0002149d T vPortFree +0x00021571 T vQueueDelete +0x0002159d T vQueueWaitForMessageRestricted +0x000215e5 T vTaskDelay +0x00021631 T vTaskInternalSetTimeOutState +0x00021641 T vTaskMissedYield +0x0002164d T vTaskPlaceOnEventList +0x00021685 T vTaskPlaceOnEventListRestricted +0x000216c5 T vTaskPriorityDisinheritAfterTimeout +0x00021771 T vTaskStartScheduler +0x00021801 T vTaskSuspendAll +0x00021811 T vTaskSwitchContext +0x000218b9 T xPortStartScheduler +0x00021975 T xQueueAddToSet +0x00021999 T xQueueCreateCountingSemaphore +0x000219d5 T xQueueCreateCountingSemaphoreStatic +0x00021a19 T xQueueCreateMutex +0x00021a2f T xQueueCreateMutexStatic +0x00021a49 T xQueueCreateSet +0x00021a51 T xQueueGenericCreate +0x00021a9d T xQueueGenericCreateStatic +0x00021b05 T xQueueGenericReset +0x00021b91 T xQueueGenericSend +0x00021cfd T xQueueGenericSendFromISR +0x00021dbd T xQueueGiveFromISR +0x00021e61 T xQueueGiveMutexRecursive +0x00021ea1 T xQueueIsQueueEmptyFromISR +0x00021ec5 T xQueueIsQueueFullFromISR +0x00021eed T xQueuePeek +0x00022015 T xQueuePeekFromISR +0x00022081 T xQueueReceive +0x000221ad T xQueueReceiveFromISR +0x00022241 T xQueueRemoveFromSet +0x00022263 T xQueueSelectFromSet +0x00022275 T xQueueSelectFromSetFromISR +0x00022289 T xQueueSemaphoreTake +0x000223f5 T xQueueTakeMutexRecursive +0x00022439 T xTaskCheckForTimeOut +0x000224a9 T xTaskCreate +0x00022505 T xTaskCreateStatic +0x00022575 T xTaskGetCurrentTaskHandle +0x00022581 T xTaskGetSchedulerState +0x0002259d T xTaskGetTickCount +0x000225a9 T xTaskIncrementTick +0x00022675 T xTaskPriorityDisinherit +0x00022709 T xTaskPriorityInherit +0x0002279d T xTaskRemoveFromEventList +0x00022819 T xTaskResumeAll +0x000228e1 T xTimerCreate +0x00022915 T xTimerCreateStatic +0x0002294d T xTimerCreateTimerTask +0x000229b9 T xTimerGenericCommand diff --git a/bundles/typical/ING9188xx/symdefs.s b/bundles/typical/ING9188xx/symdefs.s index dfcfe348c..5356aee90 100644 --- a/bundles/typical/ING9188xx/symdefs.s +++ b/bundles/typical/ING9188xx/symdefs.s @@ -1,247 +1,262 @@ ---defsym:att_dispatch_client_can_send_now=0x000058d1 ---defsym:att_dispatch_client_request_can_send_now_event=0x000058d9 ---defsym:att_dispatch_register_client=0x000058f1 ---defsym:att_dispatch_register_server=0x00005905 ---defsym:att_dispatch_server_can_send_now=0x00005919 ---defsym:att_dispatch_server_request_can_send_now_event=0x00005921 ---defsym:att_emit_general_event=0x000059f1 ---defsym:att_server_can_send_packet_now=0x00006135 ---defsym:att_server_get_mtu=0x00006139 ---defsym:att_server_indicate=0x000061ad ---defsym:att_server_init=0x00006231 ---defsym:att_server_notify=0x0000626d ---defsym:att_server_register_packet_handler=0x00006355 ---defsym:att_server_request_can_send_now_event=0x00006361 ---defsym:att_set_db=0x0000637d ---defsym:att_set_read_callback=0x00006391 ---defsym:att_set_write_callback=0x0000639d ---defsym:bd_addr_cmp=0x000064e1 ---defsym:bd_addr_copy=0x000064e7 ---defsym:bd_addr_to_str=0x000064f1 ---defsym:big_endian_read_16=0x00006529 ---defsym:big_endian_read_32=0x00006531 ---defsym:big_endian_store_16=0x00006545 ---defsym:big_endian_store_32=0x00006551 ---defsym:btstack_push_user_msg=0x000067fd ---defsym:char_for_nibble=0x00006a55 ---defsym:gap_add_dev_to_periodic_list=0x000075b9 ---defsym:gap_add_whitelist=0x000075d1 ---defsym:gap_aes_encrypt=0x000075e5 ---defsym:gap_clear_white_lists=0x0000760d ---defsym:gap_clr_adv_set=0x0000761d ---defsym:gap_clr_periodic_adv_list=0x0000762d ---defsym:gap_create_connection_cancel=0x00007689 ---defsym:gap_disconnect=0x00007699 ---defsym:gap_disconnect_all=0x000076c5 ---defsym:gap_ext_create_connection=0x0000776d ---defsym:gap_get_connection_parameter_range=0x00007831 ---defsym:gap_le_read_channel_map=0x00007871 ---defsym:gap_periodic_adv_create_sync=0x00007981 ---defsym:gap_periodic_adv_create_sync_cancel=0x000079a5 ---defsym:gap_periodic_adv_term_sync=0x000079b5 ---defsym:gap_read_periodic_adv_list_size=0x00007a49 ---defsym:gap_read_phy=0x00007a59 ---defsym:gap_read_remote_info=0x00007a6d ---defsym:gap_read_remote_used_features=0x00007a81 ---defsym:gap_read_rssi=0x00007a95 ---defsym:gap_remove_whitelist=0x00007aa9 ---defsym:gap_rmv_adv_set=0x00007b35 ---defsym:gap_rmv_dev_from_periodic_list=0x00007b49 ---defsym:gap_set_adv_set_random_addr=0x00007b89 ---defsym:gap_set_connection_parameter_range=0x00007bd5 ---defsym:gap_set_def_phy=0x00007bed ---defsym:gap_set_ext_adv_data=0x00007c05 ---defsym:gap_set_ext_adv_enable=0x00007c1d ---defsym:gap_set_ext_adv_para=0x00007c99 ---defsym:gap_set_ext_scan_enable=0x00007d79 ---defsym:gap_set_ext_scan_para=0x00007d91 ---defsym:gap_set_ext_scan_response_data=0x00007e39 ---defsym:gap_set_host_channel_classification=0x00007e51 ---defsym:gap_set_periodic_adv_data=0x00007e65 ---defsym:gap_set_periodic_adv_enable=0x00007ed9 ---defsym:gap_set_periodic_adv_para=0x00007eed ---defsym:gap_set_phy=0x00007f05 ---defsym:gap_set_random_device_address=0x00007f21 ---defsym:gap_start_ccm=0x00007f85 ---defsym:gap_update_connection_parameters=0x00007fcd ---defsym:gatt_client_cancel_write=0x000084b5 ---defsym:gatt_client_discover_characteristic_descriptors=0x000084db ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x0000851d ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x0000856d ---defsym:gatt_client_discover_characteristics_for_service=0x000085bd ---defsym:gatt_client_discover_primary_services=0x000085f3 ---defsym:gatt_client_discover_primary_services_by_uuid128=0x00008625 ---defsym:gatt_client_discover_primary_services_by_uuid16=0x00008669 ---defsym:gatt_client_execute_write=0x000086a5 ---defsym:gatt_client_find_included_services_for_service=0x000086cb ---defsym:gatt_client_get_mtu=0x000086f9 ---defsym:gatt_client_is_ready=0x000087a1 ---defsym:gatt_client_listen_for_characteristic_value_updates=0x000087b7 ---defsym:gatt_client_prepare_write=0x000087db ---defsym:gatt_client_pts_suppress_mtu_exchange=0x00008819 ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00008825 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x0000884f ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008855 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008883 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008889 ---defsym:gatt_client_read_multiple_characteristic_values=0x000088b7 ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x000088e7 ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00008915 ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00008961 ---defsym:gatt_client_register_handler=0x000089ad ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x000089b9 ---defsym:gatt_client_signed_write_without_response=0x00008de5 ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00008ea9 ---defsym:gatt_client_write_client_characteristic_configuration=0x00008ee3 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00008f35 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008f45 ---defsym:gatt_client_write_long_value_of_characteristic=0x00008f81 ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00008f91 ---defsym:gatt_client_write_value_of_characteristic=0x00008fcd ---defsym:gatt_client_write_value_of_characteristic_without_response=0x00009003 ---defsym:hci_add_event_handler=0x0000b29d ---defsym:hci_power_control=0x0000b9e5 ---defsym:hci_register_acl_packet_handler=0x0000bb99 ---defsym:kv_get=0x0000c219 ---defsym:kv_init=0x0000c231 ---defsym:kv_put=0x0000c281 ---defsym:kv_remove=0x0000c2f9 ---defsym:kv_value_modified=0x0000c369 ---defsym:kv_visit=0x0000c36d ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c42d ---defsym:l2cap_can_send_packet_now=0x0000c431 ---defsym:l2cap_create_channel=0x0000c5e9 ---defsym:l2cap_disconnect=0x0000c721 ---defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c9c5 ---defsym:l2cap_init=0x0000ce45 ---defsym:l2cap_le_send_flow_control_credit=0x0000ce8d ---defsym:l2cap_max_le_mtu=0x0000d0f1 ---defsym:l2cap_max_mtu=0x0000d0f5 ---defsym:l2cap_next_local_cid=0x0000d0f9 ---defsym:l2cap_next_sig_id=0x0000d109 ---defsym:l2cap_register_fixed_channel=0x0000d1a1 ---defsym:l2cap_register_packet_handler=0x0000d1bd ---defsym:l2cap_register_service=0x0000d1c9 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d2b1 ---defsym:l2cap_request_can_send_now_event=0x0000d2d5 ---defsym:l2cap_request_connection_parameter_update=0x0000d2ef ---defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d321 ---defsym:l2cap_send=0x0000d6e5 ---defsym:l2cap_send_connectionless=0x0000d75d ---defsym:l2cap_send_connectionless3=0x0000d7ed ---defsym:l2cap_send_echo_request=0x0000d885 ---defsym:l2cap_send_signaling_le=0x0000d8e9 ---defsym:l2cap_unregister_service=0x0000d941 ---defsym:ll_hint_on_ce_len=0x0000db25 ---defsym:ll_set_adv_coded_scheme=0x0000de01 ---defsym:ll_set_initiating_coded_scheme=0x0000de31 ---defsym:nibble_for_char=0x0001c60d ---defsym:platform_config=0x0001c6b1 ---defsym:platform_get_heap_status=0x0001c6e5 ---defsym:platform_get_version=0x0001c6fd ---defsym:platform_patch_rf_init_data=0x0001c705 ---defsym:platform_printf=0x0001c721 ---defsym:platform_raise_assertion=0x0001c735 ---defsym:platform_read_persistent_reg=0x0001c749 ---defsym:platform_reset=0x0001c759 ---defsym:platform_set_evt_callback=0x0001c78d ---defsym:platform_set_irq_callback=0x0001c7a1 ---defsym:platform_set_rf_clk_source=0x0001c7d9 ---defsym:platform_set_rf_init_data=0x0001c7e5 ---defsym:platform_set_rf_power_mapping=0x0001c7f1 ---defsym:platform_switch_app=0x0001c7fd ---defsym:platform_write_persistent_reg=0x0001c821 ---defsym:printf_hexdump=0x0001d511 ---defsym:pvPortMalloc=0x0001dfa1 ---defsym:pvTaskIncrementMutexHeldCount=0x0001e089 ---defsym:pvTimerGetTimerID=0x0001e0a1 ---defsym:pxPortInitialiseStack=0x0001e0cd ---defsym:reverse_128=0x0001e275 ---defsym:reverse_24=0x0001e27b ---defsym:reverse_48=0x0001e281 ---defsym:reverse_56=0x0001e287 ---defsym:reverse_64=0x0001e28d ---defsym:reverse_bd_addr=0x0001e293 ---defsym:reverse_bytes=0x0001e299 ---defsym:sm_add_event_handler=0x0001e3f9 ---defsym:sm_address_resolution_lookup=0x0001e525 ---defsym:sm_authenticated=0x0001e5ff ---defsym:sm_authorization_decline=0x0001e60d ---defsym:sm_authorization_grant=0x0001e62d ---defsym:sm_authorization_state=0x0001e64d ---defsym:sm_bonding_decline=0x0001e669 ---defsym:sm_config=0x0001ea41 ---defsym:sm_encryption_key_size=0x0001eb4d ---defsym:sm_just_works_confirm=0x0001f31d ---defsym:sm_le_device_key=0x0001f56d ---defsym:sm_passkey_input=0x0001f605 ---defsym:sm_private_random_address_generation_get=0x0001f991 ---defsym:sm_private_random_address_generation_get_mode=0x0001f999 ---defsym:sm_private_random_address_generation_set_mode=0x0001f9a5 ---defsym:sm_private_random_address_generation_set_update_period=0x0001f9cd ---defsym:sm_register_oob_data_callback=0x0001fa05 ---defsym:sm_request_pairing=0x0001fa11 ---defsym:sm_send_security_request=0x0002044b ---defsym:sm_set_accepted_stk_generation_methods=0x00020471 ---defsym:sm_set_authentication_requirements=0x0002047d ---defsym:sm_set_encryption_key_size_range=0x00020489 ---defsym:sscanf_bd_addr=0x00020785 ---defsym:sysSetPublicDeviceAddr=0x00020811 ---defsym:uuid128_to_str=0x00020b85 ---defsym:uuid_add_bluetooth_prefix=0x00020bdd ---defsym:uuid_has_bluetooth_prefix=0x00020bfd ---defsym:uxQueueMessagesWaiting=0x00020c41 ---defsym:uxQueueMessagesWaitingFromISR=0x00020c69 ---defsym:uxQueueSpacesAvailable=0x00020c85 ---defsym:vPortFree=0x00020db5 ---defsym:vQueueDelete=0x00020e89 ---defsym:vQueueWaitForMessageRestricted=0x00020eb5 ---defsym:vTaskDelay=0x00020efd ---defsym:vTaskInternalSetTimeOutState=0x00020f49 ---defsym:vTaskMissedYield=0x00020f59 ---defsym:vTaskPlaceOnEventList=0x00020f65 ---defsym:vTaskPlaceOnEventListRestricted=0x00020f9d ---defsym:vTaskPriorityDisinheritAfterTimeout=0x00020fdd ---defsym:vTaskStartScheduler=0x00021089 ---defsym:vTaskSuspendAll=0x00021119 ---defsym:vTaskSwitchContext=0x00021129 ---defsym:xPortStartScheduler=0x000211d1 ---defsym:xQueueAddToSet=0x0002128d ---defsym:xQueueCreateCountingSemaphore=0x000212b1 ---defsym:xQueueCreateCountingSemaphoreStatic=0x000212ed ---defsym:xQueueCreateMutex=0x00021331 ---defsym:xQueueCreateMutexStatic=0x00021347 ---defsym:xQueueCreateSet=0x00021361 ---defsym:xQueueGenericCreate=0x00021369 ---defsym:xQueueGenericCreateStatic=0x000213b5 ---defsym:xQueueGenericReset=0x0002141d ---defsym:xQueueGenericSend=0x000214a9 ---defsym:xQueueGenericSendFromISR=0x00021615 ---defsym:xQueueGiveFromISR=0x000216d5 ---defsym:xQueueGiveMutexRecursive=0x00021779 ---defsym:xQueueIsQueueEmptyFromISR=0x000217b9 ---defsym:xQueueIsQueueFullFromISR=0x000217dd ---defsym:xQueuePeek=0x00021805 ---defsym:xQueuePeekFromISR=0x0002192d ---defsym:xQueueReceive=0x00021999 ---defsym:xQueueReceiveFromISR=0x00021ac5 ---defsym:xQueueRemoveFromSet=0x00021b59 ---defsym:xQueueSelectFromSet=0x00021b7b ---defsym:xQueueSelectFromSetFromISR=0x00021b8d ---defsym:xQueueSemaphoreTake=0x00021ba1 ---defsym:xQueueTakeMutexRecursive=0x00021d0d ---defsym:xTaskCheckForTimeOut=0x00021d51 ---defsym:xTaskCreate=0x00021dc1 ---defsym:xTaskCreateStatic=0x00021e1d ---defsym:xTaskGetCurrentTaskHandle=0x00021e8d ---defsym:xTaskGetSchedulerState=0x00021e99 ---defsym:xTaskGetTickCount=0x00021eb5 ---defsym:xTaskIncrementTick=0x00021ec1 ---defsym:xTaskPriorityDisinherit=0x00021f8d ---defsym:xTaskPriorityInherit=0x00022021 ---defsym:xTaskRemoveFromEventList=0x000220b5 ---defsym:xTaskResumeAll=0x00022131 ---defsym:xTimerCreate=0x000221f9 ---defsym:xTimerCreateStatic=0x0002222d ---defsym:xTimerCreateTimerTask=0x00022265 ---defsym:xTimerGenericCommand=0x000222d1 +--defsym:att_dispatch_client_can_send_now=0x00006259 +--defsym:att_dispatch_client_request_can_send_now_event=0x00006261 +--defsym:att_dispatch_register_client=0x00006279 +--defsym:att_dispatch_register_server=0x0000628d +--defsym:att_dispatch_server_can_send_now=0x000062a1 +--defsym:att_dispatch_server_request_can_send_now_event=0x000062a9 +--defsym:att_emit_general_event=0x00006379 +--defsym:att_server_can_send_packet_now=0x00006abd +--defsym:att_server_get_mtu=0x00006ac1 +--defsym:att_server_indicate=0x00006b35 +--defsym:att_server_init=0x00006bb9 +--defsym:att_server_notify=0x00006bf5 +--defsym:att_server_register_packet_handler=0x00006cdd +--defsym:att_server_request_can_send_now_event=0x00006ce9 +--defsym:att_set_db=0x00006d05 +--defsym:att_set_read_callback=0x00006d19 +--defsym:att_set_write_callback=0x00006d25 +--defsym:bd_addr_cmp=0x00006e69 +--defsym:bd_addr_copy=0x00006e6f +--defsym:bd_addr_to_str=0x00006e79 +--defsym:big_endian_read_16=0x00006eb1 +--defsym:big_endian_read_32=0x00006eb9 +--defsym:big_endian_store_16=0x00006ecd +--defsym:big_endian_store_32=0x00006ed9 +--defsym:btstack_push_user_msg=0x00007185 +--defsym:char_for_nibble=0x000073dd +--defsym:gap_add_dev_to_periodic_list=0x00007f4d +--defsym:gap_add_whitelist=0x00007f65 +--defsym:gap_aes_encrypt=0x00007f79 +--defsym:gap_clear_white_lists=0x00007fa1 +--defsym:gap_clr_adv_set=0x00007fb1 +--defsym:gap_clr_periodic_adv_list=0x00007fc1 +--defsym:gap_create_connection_cancel=0x00007fed +--defsym:gap_default_periodic_adv_sync_transfer_param=0x00007ffd +--defsym:gap_disconnect=0x00008015 +--defsym:gap_disconnect_all=0x00008041 +--defsym:gap_ext_create_connection=0x000080e9 +--defsym:gap_get_connection_parameter_range=0x000081ad +--defsym:gap_le_read_channel_map=0x000081e9 +--defsym:gap_periodic_adv_create_sync=0x0000825d +--defsym:gap_periodic_adv_create_sync_cancel=0x00008281 +--defsym:gap_periodic_adv_set_info_transfer=0x00008291 +--defsym:gap_periodic_adv_sync_transfer=0x000082a9 +--defsym:gap_periodic_adv_sync_transfer_param=0x000082c1 +--defsym:gap_periodic_adv_term_sync=0x000082dd +--defsym:gap_read_antenna_info=0x00008371 +--defsym:gap_read_periodic_adv_list_size=0x00008381 +--defsym:gap_read_phy=0x00008391 +--defsym:gap_read_remote_info=0x000083a5 +--defsym:gap_read_remote_used_features=0x000083b9 +--defsym:gap_read_rssi=0x000083cd +--defsym:gap_remove_whitelist=0x000083e1 +--defsym:gap_rmv_adv_set=0x0000846d +--defsym:gap_rmv_dev_from_periodic_list=0x00008481 +--defsym:gap_set_adv_set_random_addr=0x000084c1 +--defsym:gap_set_connection_cte_request_enable=0x0000850d +--defsym:gap_set_connection_cte_response_enable=0x00008529 +--defsym:gap_set_connection_cte_rx_param=0x0000853d +--defsym:gap_set_connection_cte_tx_param=0x00008599 +--defsym:gap_set_connection_parameter_range=0x000085ed +--defsym:gap_set_connectionless_cte_tx_enable=0x00008605 +--defsym:gap_set_connectionless_cte_tx_param=0x00008619 +--defsym:gap_set_connectionless_iq_sampling_enable=0x0000867d +--defsym:gap_set_def_phy=0x000086e1 +--defsym:gap_set_ext_adv_data=0x000086f9 +--defsym:gap_set_ext_adv_enable=0x00008711 +--defsym:gap_set_ext_adv_para=0x0000878d +--defsym:gap_set_ext_scan_enable=0x0000886d +--defsym:gap_set_ext_scan_para=0x00008885 +--defsym:gap_set_ext_scan_response_data=0x0000892d +--defsym:gap_set_host_channel_classification=0x00008945 +--defsym:gap_set_periodic_adv_data=0x00008959 +--defsym:gap_set_periodic_adv_enable=0x000089cd +--defsym:gap_set_periodic_adv_para=0x000089e1 +--defsym:gap_set_periodic_adv_rx_enable=0x000089f9 +--defsym:gap_set_phy=0x00008a0d +--defsym:gap_set_random_device_address=0x00008a29 +--defsym:gap_start_ccm=0x00008a8d +--defsym:gap_update_connection_parameters=0x00008ac1 +--defsym:gatt_client_cancel_write=0x00008fa9 +--defsym:gatt_client_discover_characteristic_descriptors=0x00008fcf +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00009011 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00009061 +--defsym:gatt_client_discover_characteristics_for_service=0x000090b1 +--defsym:gatt_client_discover_primary_services=0x000090e7 +--defsym:gatt_client_discover_primary_services_by_uuid128=0x00009119 +--defsym:gatt_client_discover_primary_services_by_uuid16=0x0000915d +--defsym:gatt_client_execute_write=0x00009199 +--defsym:gatt_client_find_included_services_for_service=0x000091bf +--defsym:gatt_client_get_mtu=0x000091ed +--defsym:gatt_client_is_ready=0x00009295 +--defsym:gatt_client_listen_for_characteristic_value_updates=0x000092ab +--defsym:gatt_client_prepare_write=0x000092cf +--defsym:gatt_client_pts_suppress_mtu_exchange=0x0000930d +--defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00009319 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00009343 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009349 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00009377 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x0000937d +--defsym:gatt_client_read_multiple_characteristic_values=0x000093ab +--defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x000093db +--defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00009409 +--defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00009455 +--defsym:gatt_client_register_handler=0x000094a1 +--defsym:gatt_client_reliable_write_long_value_of_characteristic=0x000094ad +--defsym:gatt_client_signed_write_without_response=0x000098d9 +--defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0000999d +--defsym:gatt_client_write_client_characteristic_configuration=0x000099d7 +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009a29 +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009a39 +--defsym:gatt_client_write_long_value_of_characteristic=0x00009a75 +--defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00009a85 +--defsym:gatt_client_write_value_of_characteristic=0x00009ac1 +--defsym:gatt_client_write_value_of_characteristic_without_response=0x00009af7 +--defsym:hci_add_event_handler=0x0000b055 +--defsym:hci_power_control=0x0000b79d +--defsym:hci_register_acl_packet_handler=0x0000b951 +--defsym:kv_get=0x0000bfd1 +--defsym:kv_init=0x0000bfe9 +--defsym:kv_put=0x0000c039 +--defsym:kv_remove=0x0000c0b1 +--defsym:kv_value_modified=0x0000c121 +--defsym:kv_visit=0x0000c125 +--defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c1e5 +--defsym:l2cap_can_send_packet_now=0x0000c1e9 +--defsym:l2cap_create_channel=0x0000c3a1 +--defsym:l2cap_disconnect=0x0000c4d9 +--defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c77d +--defsym:l2cap_init=0x0000cbfd +--defsym:l2cap_le_send_flow_control_credit=0x0000cc45 +--defsym:l2cap_max_le_mtu=0x0000cea9 +--defsym:l2cap_max_mtu=0x0000cead +--defsym:l2cap_next_local_cid=0x0000ceb1 +--defsym:l2cap_next_sig_id=0x0000cec1 +--defsym:l2cap_register_fixed_channel=0x0000cf59 +--defsym:l2cap_register_packet_handler=0x0000cf75 +--defsym:l2cap_register_service=0x0000cf81 +--defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d069 +--defsym:l2cap_request_can_send_now_event=0x0000d08d +--defsym:l2cap_request_connection_parameter_update=0x0000d0a7 +--defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d0d9 +--defsym:l2cap_send=0x0000d49d +--defsym:l2cap_send_connectionless=0x0000d515 +--defsym:l2cap_send_connectionless3=0x0000d5a5 +--defsym:l2cap_send_echo_request=0x0000d63d +--defsym:l2cap_send_signaling_le=0x0000d6a1 +--defsym:l2cap_unregister_service=0x0000d6f9 +--defsym:ll_hint_on_ce_len=0x0000d8dd +--defsym:ll_set_adv_coded_scheme=0x0000dbc1 +--defsym:ll_set_def_antenna=0x0000dbf1 +--defsym:ll_set_initiating_coded_scheme=0x0000dc0d +--defsym:nibble_for_char=0x0001d851 +--defsym:platform_config=0x0001d8f5 +--defsym:platform_get_heap_status=0x0001d941 +--defsym:platform_get_version=0x0001d959 +--defsym:platform_hrng=0x0001d961 +--defsym:platform_patch_rf_init_data=0x0001d969 +--defsym:platform_printf=0x0001d985 +--defsym:platform_raise_assertion=0x0001d999 +--defsym:platform_read_persistent_reg=0x0001d9ad +--defsym:platform_reset=0x0001d9bd +--defsym:platform_set_evt_callback=0x0001d9f1 +--defsym:platform_set_irq_callback=0x0001da05 +--defsym:platform_set_rf_clk_source=0x0001da3d +--defsym:platform_set_rf_init_data=0x0001da49 +--defsym:platform_set_rf_power_mapping=0x0001da55 +--defsym:platform_switch_app=0x0001da61 +--defsym:platform_write_persistent_reg=0x0001da85 +--defsym:printf_hexdump=0x0001da95 +--defsym:pvPortMalloc=0x0001e525 +--defsym:pvTaskIncrementMutexHeldCount=0x0001e60d +--defsym:pvTimerGetTimerID=0x0001e625 +--defsym:pxPortInitialiseStack=0x0001e651 +--defsym:reverse_128=0x0001e811 +--defsym:reverse_24=0x0001e817 +--defsym:reverse_48=0x0001e81d +--defsym:reverse_56=0x0001e823 +--defsym:reverse_64=0x0001e829 +--defsym:reverse_bd_addr=0x0001e82f +--defsym:reverse_bytes=0x0001e835 +--defsym:sm_add_event_handler=0x0001e9d9 +--defsym:sm_address_resolution_lookup=0x0001eb05 +--defsym:sm_authenticated=0x0001ebdf +--defsym:sm_authorization_decline=0x0001ebed +--defsym:sm_authorization_grant=0x0001ec0d +--defsym:sm_authorization_state=0x0001ec2d +--defsym:sm_bonding_decline=0x0001ec49 +--defsym:sm_config=0x0001f021 +--defsym:sm_encryption_key_size=0x0001f12d +--defsym:sm_just_works_confirm=0x0001f8fd +--defsym:sm_le_device_key=0x0001fb4d +--defsym:sm_passkey_input=0x0001fbe5 +--defsym:sm_private_random_address_generation_get=0x0001ff71 +--defsym:sm_private_random_address_generation_get_mode=0x0001ff79 +--defsym:sm_private_random_address_generation_set_mode=0x0001ff85 +--defsym:sm_private_random_address_generation_set_update_period=0x0001ffad +--defsym:sm_register_oob_data_callback=0x0001ffe5 +--defsym:sm_request_pairing=0x0001fff1 +--defsym:sm_send_security_request=0x00020a2b +--defsym:sm_set_accepted_stk_generation_methods=0x00020a51 +--defsym:sm_set_authentication_requirements=0x00020a5d +--defsym:sm_set_encryption_key_size_range=0x00020a69 +--defsym:sscanf_bd_addr=0x00020d3d +--defsym:sysSetPublicDeviceAddr=0x00020dc9 +--defsym:uuid128_to_str=0x0002126d +--defsym:uuid_add_bluetooth_prefix=0x000212c5 +--defsym:uuid_has_bluetooth_prefix=0x000212e5 +--defsym:uxQueueMessagesWaiting=0x00021329 +--defsym:uxQueueMessagesWaitingFromISR=0x00021351 +--defsym:uxQueueSpacesAvailable=0x0002136d +--defsym:vPortFree=0x0002149d +--defsym:vQueueDelete=0x00021571 +--defsym:vQueueWaitForMessageRestricted=0x0002159d +--defsym:vTaskDelay=0x000215e5 +--defsym:vTaskInternalSetTimeOutState=0x00021631 +--defsym:vTaskMissedYield=0x00021641 +--defsym:vTaskPlaceOnEventList=0x0002164d +--defsym:vTaskPlaceOnEventListRestricted=0x00021685 +--defsym:vTaskPriorityDisinheritAfterTimeout=0x000216c5 +--defsym:vTaskStartScheduler=0x00021771 +--defsym:vTaskSuspendAll=0x00021801 +--defsym:vTaskSwitchContext=0x00021811 +--defsym:xPortStartScheduler=0x000218b9 +--defsym:xQueueAddToSet=0x00021975 +--defsym:xQueueCreateCountingSemaphore=0x00021999 +--defsym:xQueueCreateCountingSemaphoreStatic=0x000219d5 +--defsym:xQueueCreateMutex=0x00021a19 +--defsym:xQueueCreateMutexStatic=0x00021a2f +--defsym:xQueueCreateSet=0x00021a49 +--defsym:xQueueGenericCreate=0x00021a51 +--defsym:xQueueGenericCreateStatic=0x00021a9d +--defsym:xQueueGenericReset=0x00021b05 +--defsym:xQueueGenericSend=0x00021b91 +--defsym:xQueueGenericSendFromISR=0x00021cfd +--defsym:xQueueGiveFromISR=0x00021dbd +--defsym:xQueueGiveMutexRecursive=0x00021e61 +--defsym:xQueueIsQueueEmptyFromISR=0x00021ea1 +--defsym:xQueueIsQueueFullFromISR=0x00021ec5 +--defsym:xQueuePeek=0x00021eed +--defsym:xQueuePeekFromISR=0x00022015 +--defsym:xQueueReceive=0x00022081 +--defsym:xQueueReceiveFromISR=0x000221ad +--defsym:xQueueRemoveFromSet=0x00022241 +--defsym:xQueueSelectFromSet=0x00022263 +--defsym:xQueueSelectFromSetFromISR=0x00022275 +--defsym:xQueueSemaphoreTake=0x00022289 +--defsym:xQueueTakeMutexRecursive=0x000223f5 +--defsym:xTaskCheckForTimeOut=0x00022439 +--defsym:xTaskCreate=0x000224a9 +--defsym:xTaskCreateStatic=0x00022505 +--defsym:xTaskGetCurrentTaskHandle=0x00022575 +--defsym:xTaskGetSchedulerState=0x00022581 +--defsym:xTaskGetTickCount=0x0002259d +--defsym:xTaskIncrementTick=0x000225a9 +--defsym:xTaskPriorityDisinherit=0x00022675 +--defsym:xTaskPriorityInherit=0x00022709 +--defsym:xTaskRemoveFromEventList=0x0002279d +--defsym:xTaskResumeAll=0x00022819 +--defsym:xTimerCreate=0x000228e1 +--defsym:xTimerCreateStatic=0x00022915 +--defsym:xTimerCreateTimerTask=0x0002294d +--defsym:xTimerGenericCommand=0x000229b9 diff --git a/bundles/typical/inc/bluetooth.h b/bundles/typical/inc/bluetooth.h index d1ec9d45a..c9ace3555 100644 --- a/bundles/typical/inc/bluetooth.h +++ b/bundles/typical/inc/bluetooth.h @@ -1,14 +1,16 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- +/** @file +* @brief basic bluetooth macro definition +* +* Copyright Message +* +* +* INGCHIPS confidential and proprietary. +* COPYRIGHT (c) 2018 by INGCHIPS +* +* All rights are reserved. Reproduction in whole or in part is +* prohibited without the written consent of the copyright owner. +* +*/ #ifndef __BLUETOOTH_H #define __BLUETOOTH_H @@ -494,7 +496,10 @@ typedef enum { #define HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED 0X12 #define HCI_SUBEVENT_LE_SCAN_REQUEST_RECEIVED 0X13 #define HCI_SUBEVENT_LE_CHANNEL_SELECTION_ALGORITHM 0X14 - +#define HCI_SUBEVENT_LE_CONNECTIONLESS_IQ_REPORT 0x15 +#define HCI_SUBEVENT_LE_CONNECTION_IQ_REPORT 0x16 +#define HCI_SUBEVENT_LE_CTE_REQ_FAILED 0x17 +#define HCI_SUBEVENT_LE_PRD_ADV_SYNC_TRANSFER_RCVD 0x18 // last used HCI_EVENT in 2.1 is 0x3d // last used HCI_EVENT in 4.1 is 0x57 @@ -606,7 +611,8 @@ typedef enum { #define ATT_ERROR_INSUFFICIENT_ENCRYPTION 0x0f #define ATT_ERROR_UNSUPPORTED_GROUP_TYPE 0x10 #define ATT_ERROR_INSUFFICIENT_RESOURCES 0x11 - +#define ATT_ERROR_DATABASE_OUT_OF_SYNC 0x12 +#define ATT_ERROR_VALUE_NOT_ALLOWED 0x13 // MARK: Attribute Property Flags #define ATT_PROPERTY_BROADCAST 0x01 #define ATT_PROPERTY_READ 0x02 diff --git a/bundles/typical/inc/bluetooth.nim b/bundles/typical/inc/bluetooth.nim index 8f56e531b..974d5ed35 100644 --- a/bundles/typical/inc/bluetooth.nim +++ b/bundles/typical/inc/bluetooth.nim @@ -1,14 +1,16 @@ -## ---------------------------------------------------------------------------- -## Copyright Message -## ---------------------------------------------------------------------------- +## * @file +## @brief basic bluetooth macro definition ## -## INGCHIPS confidential and proprietary. -## COPYRIGHT (c) 2018 by INGCHIPS +## Copyright Message +## +## +## INGCHIPS confidential and proprietary. +## COPYRIGHT (c) 2018 by INGCHIPS +## +## All rights are reserved. Reproduction in whole or in part is +## prohibited without the written consent of the copyright owner. ## -## All rights are reserved. Reproduction in whole or in part is -## prohibited without the written consent of the copyright owner. ## -## ---------------------------------------------------------------------------- const BD_ADDR_LEN* = 0x00000006 @@ -595,6 +597,10 @@ const HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED* = 0x00000012 HCI_SUBEVENT_LE_SCAN_REQUEST_RECEIVED* = 0x00000013 HCI_SUBEVENT_LE_CHANNEL_SELECTION_ALGORITHM* = 0x00000014 + HCI_SUBEVENT_LE_CONNECTIONLESS_IQ_REPORT* = 0x00000015 + HCI_SUBEVENT_LE_CONNECTION_IQ_REPORT* = 0x00000016 + HCI_SUBEVENT_LE_CTE_REQ_FAILED* = 0x00000017 + HCI_SUBEVENT_LE_PRD_ADV_SYNC_TRANSFER_RCVD* = 0x00000018 ## last used HCI_EVENT in 2.1 is 0x3d ## last used HCI_EVENT in 4.1 is 0x57 @@ -718,6 +724,8 @@ const ATT_ERROR_INSUFFICIENT_ENCRYPTION* = 0x0000000F ATT_ERROR_UNSUPPORTED_GROUP_TYPE* = 0x00000010 ATT_ERROR_INSUFFICIENT_RESOURCES* = 0x00000011 + ATT_ERROR_DATABASE_OUT_OF_SYNC* = 0x00000012 + ATT_ERROR_VALUE_NOT_ALLOWED* = 0x00000013 ## MARK: Attribute Property Flags diff --git a/bundles/typical/inc/gap.h b/bundles/typical/inc/gap.h index fb17e6a36..fafabe39a 100644 --- a/bundles/typical/inc/gap.h +++ b/bundles/typical/inc/gap.h @@ -1,5 +1,5 @@ -/** @file -* @brief function API and data structure for BLE +/** @file +* @brief function API and data structure for BLE * @version 1.0.0. * * @date 2019/10/10 * * * @@ -20,7 +20,7 @@ extern "C" { #endif /** - * @brief Bluetooth + * @brief Bluetooth * @defgroup Bluetooth_gap * @ingroup bluetooth_host * @{ @@ -65,7 +65,7 @@ void gap_disconnect_all(void); /** * @brief add whitelist to the controller * - * @param[in] address BLE address + * @param[in] address BLE address * @param[in] addtype BLE address type * @return 0: Message is sent to controller */ @@ -74,7 +74,7 @@ uint8_t gap_add_whitelist(const uint8_t *address,bd_addr_type_t addtype); /** * @brief remove whitelist from controller * - * @param address BLE address + * @param address BLE address * @param addtype BLE address type * @return 0: Message is sent to controller */ @@ -186,7 +186,7 @@ uint8_t gap_read_phy(const uint16_t con_handle); * @brief Host to specify its preferred values for the transmitter PHY and receiver PHY * * @param all_phys BIT(0): no preference for transmit channel - * BIT(1): no preference for receive channel + * BIT(1): no preference for receive channel * Others: reserved for future * * @param tx_phys BIT(0): prefer LE 1M transmitter PHY @@ -205,7 +205,7 @@ uint8_t gap_set_def_phy(const uint8_t all_phys, const phy_bittypes_t tx_phys, co /** * @brief enum of the PHY option - * + * */ typedef enum phy_option { @@ -220,7 +220,7 @@ typedef enum phy_option * @param con_handle connection handl. (0x000--0x0EFF) * * @param all_phys BIT(0): no preference for transmit channel - * BIT(1): no preference for receive channel + * BIT(1): no preference for receive channel * Others: reserved for future * * @param tx_phys BIT(0): prefer LE 1M transmitter PHY @@ -411,7 +411,7 @@ typedef enum adv_filter_policy * @param primary_adv_channel_map see structure @link #adv_channel_bits_t @endlink * * @param own_addr_type own BLE device address type - * + * * @param peer_addr_type peer BLE device address type * * @param peer_addr peer BLE device address @@ -464,10 +464,10 @@ typedef enum adv_data_frag_pref } adv_data_frag_pref_t_t; /** - * @brief to set extended advertising data + * @brief to set extended advertising data * * @param adv_handle advertising set handle. - * + * * @param length advertising data length * * @param data pointer to advertising data @@ -480,7 +480,7 @@ uint8_t gap_set_ext_adv_data(const uint8_t adv_handle, uint16_t length, const ui * @brief LE Set Periodic Advertising Data command * * @param adv_handle advertising set handle. - * + * * @param length advertising data length * * @param data pointer to periodic advertising data @@ -493,8 +493,8 @@ uint8_t gap_set_periodic_adv_data(const uint8_t adv_handle, uint16_t length, con * @brief LE Set Periodic Advertising Enable command * * @param enable 0x00: Periodic advertising is disabled (default) - * 0x01: Periodic advertising is enabled - * + * 0x01: Periodic advertising is enabled + * * @param adv_handle handle of advertising set * * @return 0: message sent to controller @@ -503,8 +503,8 @@ uint8_t gap_set_periodic_adv_enable(const uint8_t enable, const uint8_t adv_hand /** * @brief LE Set Periodic Advertising Parameters command * - * @param adv_handle handle of advertising set - * + * @param adv_handle handle of advertising set + * * @param interval_min 0xXXXX Range: 0x0006 to 0xFFFF * Time = N * 1.25 ms * Time Range: 7.5ms to 81.91875 s @@ -529,7 +529,7 @@ uint8_t gap_clr_adv_set(void); /** * @brief LE Remove Advertising Set command * - * @param adv_handle handle of advertising set to be removed + * @param adv_handle handle of advertising set to be removed * * @return 0: message sent to controller */ @@ -561,7 +561,7 @@ typedef enum periodic_adv_filter_policy * Range: 0x000A to 0x4000 * Time = N*10 ms * Time Range: 100 ms to 163.84 s - * + * * @return 0: message sent to controller */ uint8_t gap_periodic_adv_create_sync(const periodic_adv_filter_policy_t filter_policy, @@ -581,7 +581,7 @@ uint8_t gap_periodic_adv_create_sync_cancel(void); /** * @brief LE Periodic Advertising Terminate Sync command * - * @param sync_handle Sync_Handle identifying the periodic advertising train + * @param sync_handle Sync_Handle identifying the periodic advertising train * * @return 0: message sent to controller */ @@ -720,14 +720,12 @@ typedef enum * @param antenna_ids List of Antenna IDs in the pattern * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_set_connectionless_cte_tx_param(const uint8_t adv_handle, -// const uint8_t cte_len, -// const cte_type_t cte_type, -// const uint8_t cte_count, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_connectionless_cte_tx_param(const uint8_t adv_handle, + const uint8_t cte_len, + const cte_type_t cte_type, + const uint8_t cte_count, + const uint8_t switching_pattern_len, + const uint8_t *antenna_ids); /** * @brief Request that the Controller enables or disables the use of Constant Tone @@ -739,18 +737,16 @@ typedef enum * @param cte_enable Disable (0x00), Enable (0x01) * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_set_connectionless_cte_tx_enable(const uint8_t adv_handle, -// const uint8_t cte_enable); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_connectionless_cte_tx_enable(const uint8_t adv_handle, + const uint8_t cte_enable); /** * @brief structure:cte_slot_duration_type_t * */ typedef enum { - CTE_SLOT_DURATION_1US, - CTE_SLOT_DURATION_2US + CTE_SLOT_DURATION_1US = 1, + CTE_SLOT_DURATION_2US = 2 } cte_slot_duration_type_t; /** @@ -769,14 +765,12 @@ typedef enum * * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_set_connectionless_iq_sampling_enable(const uint16_t sync_handle, -// const uint8_t sampling_enable, -// const uint8_t slot_durations, -// const uint8_t max_sampled_ctes, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_connectionless_iq_sampling_enable(const uint16_t sync_handle, + const uint8_t sampling_enable, + const uint8_t slot_durations, + const uint8_t max_sampled_ctes, + const uint8_t switching_pattern_len, + const uint8_t *antenna_ids); /** * @brief Enable or disable sampling received Constant Tone Extension fields on the @@ -792,13 +786,11 @@ typedef enum * @return 0: Message is sent out; Other: Message is not sent out * */ -// uint8_t gap_set_connection_cte_rx_param(const hci_con_handle_t conn_handle, -// const uint8_t sampling_enable, -// const uint8_t slot_durations, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_connection_cte_rx_param(const hci_con_handle_t conn_handle, + const uint8_t sampling_enable, + const uint8_t slot_durations, + const uint8_t switching_pattern_len, + const uint8_t *antenna_ids); /** * @brief Set the antenna switching pattern and permitted Constant Tone Extension @@ -812,12 +804,10 @@ typedef enum * @return 0: Message is sent out; Other: Message is not sent out * */ -// uint8_t gap_set_connection_cte_tx_param(const hci_con_handle_t conn_handle, -// const uint8_t cte_types, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_connection_cte_tx_param(const hci_con_handle_t conn_handle, + const uint8_t cte_types, + const uint8_t switching_pattern_len, + const uint8_t *antenna_ids); /** @@ -838,13 +828,11 @@ typedef enum * @return 0: Message is sent out; Other: Message is not sent out * */ -// uint8_t gap_set_connection_cte_request_enable(const hci_con_handle_t conn_handle, -// const uint8_t enable, -// const uint16_t requested_cte_interval, -// const uint8_t requested_cte_length, -// const cte_type_t requested_cte_type); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_connection_cte_request_enable(const hci_con_handle_t conn_handle, + const uint8_t enable, + const uint16_t requested_cte_interval, + const uint8_t requested_cte_length, + const cte_type_t requested_cte_type); /** @@ -855,19 +843,15 @@ typedef enum * @param enable Disable (0x00), Enable (0x01) * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_set_connection_cte_response_enable(const hci_con_handle_t conn_handle, -// const uint8_t enable); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_connection_cte_response_enable(const hci_con_handle_t conn_handle, + const uint8_t enable); /** * @brief Read the switching rates, the sampling rates, the number of antennae, and the * maximum length of a transmitted Constant Tone Extension supported by the * Controller. * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_read_antenna_info(void); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_read_antenna_info(void); /** * @brief Enable or disable reports for the periodic advertising train identified by the @@ -878,10 +862,8 @@ typedef enum * * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_set_periodic_adv_rx_enable(const uint16_t sync_handle, -// const uint8_t enable); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_set_periodic_adv_rx_enable(const uint16_t sync_handle, + const uint8_t enable); /** * @brief Instruct the Controller to send synchronization information about the periodic @@ -895,11 +877,9 @@ typedef enum * * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_periodic_adv_sync_transfer(const hci_con_handle_t conn_handle, -// const uint16_t service_data, -// const uint16_t sync_handle); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_periodic_adv_sync_transfer(const hci_con_handle_t conn_handle, + const uint16_t service_data, + const uint16_t sync_handle); /** * @brief Instruct the Controller to send synchronization information about the periodic @@ -912,11 +892,9 @@ typedef enum * * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_periodic_adv_set_info_transfer(const hci_con_handle_t conn_handle, -// const uint16_t service_data, -// const uint8_t adv_handle); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_periodic_adv_set_info_transfer(const hci_con_handle_t conn_handle, + const uint16_t service_data, + const uint8_t adv_handle); typedef enum @@ -950,13 +928,11 @@ typedef enum * Combination of SYNC_EXCL_XXX * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_periodic_adv_sync_transfer_param(const hci_con_handle_t conn_handle, -// const periodic_adv_sync_transfer_mode_t mode, -// const uint16_t skip, -// const uint16_t sync_timeout, -// const uint8_t cte_excl_types); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_periodic_adv_sync_transfer_param(const hci_con_handle_t conn_handle, + const periodic_adv_sync_transfer_mode_t mode, + const uint16_t skip, + const uint16_t sync_timeout, + const uint8_t cte_excl_types); /** * @brief Specify the initial value for the mode, skip, timeout, and @@ -977,13 +953,11 @@ typedef enum * Combination of SYNC_EXCL_XXX * @return 0: Message is sent out; Other: Message is not sent out */ -// uint8_t gap_default_periodic_adv_sync_transfer_param( -// const periodic_adv_sync_transfer_mode_t mode, -// const uint16_t skip, -// const uint16_t sync_timeout, -// const uint8_t cte_excl_types); -// WARNING: ^^^ this API is not available in this release - +uint8_t gap_default_periodic_adv_sync_transfer_param( + const periodic_adv_sync_transfer_mode_t mode, + const uint16_t skip, + const uint16_t sync_timeout, + const uint8_t cte_excl_types); uint8_t gap_set_host_channel_classification(const uint32_t channel_low, const uint8_t channel_high); @@ -1093,7 +1067,7 @@ void hci_register_acl_packet_handler(btstack_packet_handler_t handler); * @brief Requests the change of BTstack power mode. * * @param mode 0:HCI_POWER_OFF ,1:HCI_POWER_ON , 2:HCI_POWER_SLEEP - * + * * @return 0: succss */ int hci_power_control(HCI_POWER_MODE mode); diff --git a/bundles/typical/inc/gap.nim b/bundles/typical/inc/gap.nim index 190d20337..9e70a2f5c 100644 --- a/bundles/typical/inc/gap.nim +++ b/bundles/typical/inc/gap.nim @@ -731,13 +731,11 @@ type ## @param antenna_ids List of Antenna IDs in the pattern ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_set_connectionless_cte_tx_param(const uint8_t adv_handle, -## const uint8_t cte_len, -## const cte_type_t cte_type, -## const uint8_t cte_count, -## const uint8_t switching_pattern_len, -## const uint8_t *antenna_ids); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_connectionless_cte_tx_param*(adv_handle: uint8; cte_len: uint8; + cte_type: cte_type_t; cte_count: uint8; switching_pattern_len: uint8; + antenna_ids: ptr uint8): uint8 {.importc: "gap_set_connectionless_cte_tx_param", + header: "gap.h".} ## * ## @brief Request that the Controller enables or disables the use of Constant Tone ## Extensions in any periodic advertising on the advertising set identified by @@ -748,9 +746,9 @@ type ## @param cte_enable Disable (0x00), Enable (0x01) ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_set_connectionless_cte_tx_enable(const uint8_t adv_handle, -## const uint8_t cte_enable); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_connectionless_cte_tx_enable*(adv_handle: uint8; cte_enable: uint8): uint8 {. + importc: "gap_set_connectionless_cte_tx_enable", header: "gap.h".} ## * ## @brief structure:cte_slot_duration_type_t ## @@ -777,13 +775,11 @@ type ## ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_set_connectionless_iq_sampling_enable(const uint16_t sync_handle, -## const uint8_t sampling_enable, -## const uint8_t slot_durations, -## const uint8_t max_sampled_ctes, -## const uint8_t switching_pattern_len, -## const uint8_t *antenna_ids); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_connectionless_iq_sampling_enable*(sync_handle: uint16; + sampling_enable: uint8; slot_durations: uint8; max_sampled_ctes: uint8; + switching_pattern_len: uint8; antenna_ids: ptr uint8): uint8 {. + importc: "gap_set_connectionless_iq_sampling_enable", header: "gap.h".} ## * ## @brief Enable or disable sampling received Constant Tone Extension fields on the ## connection identified by the Connection_Handle parameter and to set the @@ -798,12 +794,13 @@ type ## @return 0: Message is sent out; Other: Message is not sent out ## ## -## uint8_t gap_set_connection_cte_rx_param(const hci_con_handle_t conn_handle, -## const uint8_t sampling_enable, -## const uint8_t slot_durations, -## const uint8_t switching_pattern_len, -## const uint8_t *antenna_ids); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_connection_cte_rx_param*(conn_handle: hci_con_handle_t; + sampling_enable: uint8; + slot_durations: uint8; + switching_pattern_len: uint8; + antenna_ids: ptr uint8): uint8 {. + importc: "gap_set_connection_cte_rx_param", header: "gap.h".} ## * ## @brief Set the antenna switching pattern and permitted Constant Tone Extension ## types used for transmitting Constant Tone Extensions requested by the peer @@ -816,11 +813,12 @@ type ## @return 0: Message is sent out; Other: Message is not sent out ## ## -## uint8_t gap_set_connection_cte_tx_param(const hci_con_handle_t conn_handle, -## const uint8_t cte_types, -## const uint8_t switching_pattern_len, -## const uint8_t *antenna_ids); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_connection_cte_tx_param*(conn_handle: hci_con_handle_t; + cte_types: uint8; + switching_pattern_len: uint8; + antenna_ids: ptr uint8): uint8 {. + importc: "gap_set_connection_cte_tx_param", header: "gap.h".} ## * ## @brief Set the antenna switching pattern and permitted Constant Tone Extension ## types used for transmitting Constant Tone Extensions requested by the peer @@ -839,12 +837,11 @@ type ## @return 0: Message is sent out; Other: Message is not sent out ## ## -## uint8_t gap_set_connection_cte_request_enable(const hci_con_handle_t conn_handle, -## const uint8_t enable, -## const uint16_t requested_cte_interval, -## const uint8_t requested_cte_length, -## const cte_type_t requested_cte_type); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_connection_cte_request_enable*(conn_handle: hci_con_handle_t; + enable: uint8; requested_cte_interval: uint16; requested_cte_length: uint8; + requested_cte_type: cte_type_t): uint8 {. + importc: "gap_set_connection_cte_request_enable", header: "gap.h".} ## * ## @brief Request the Controller to respond to LL_CTE_REQ PDUs with LL_CTE_RSP ## PDUs on the specified connection. @@ -853,17 +850,19 @@ type ## @param enable Disable (0x00), Enable (0x01) ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_set_connection_cte_response_enable(const hci_con_handle_t conn_handle, -## const uint8_t enable); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_connection_cte_response_enable*(conn_handle: hci_con_handle_t; + enable: uint8): uint8 {.importc: "gap_set_connection_cte_response_enable", + header: "gap.h".} ## * ## @brief Read the switching rates, the sampling rates, the number of antennae, and the ## maximum length of a transmitted Constant Tone Extension supported by the ## Controller. ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_read_antenna_info(void); -## WARNING: ^^^ this API is not available in this release + +proc gap_read_antenna_info*(): uint8 {.importc: "gap_read_antenna_info", + header: "gap.h".} ## * ## @brief Enable or disable reports for the periodic advertising train identified by the ## Sync_Handle parameter. @@ -873,9 +872,9 @@ type ## ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_set_periodic_adv_rx_enable(const uint16_t sync_handle, -## const uint8_t enable); -## WARNING: ^^^ this API is not available in this release + +proc gap_set_periodic_adv_rx_enable*(sync_handle: uint16; enable: uint8): uint8 {. + importc: "gap_set_periodic_adv_rx_enable", header: "gap.h".} ## * ## @brief Instruct the Controller to send synchronization information about the periodic ## advertising train identified by the Sync_Handle parameter to a connected @@ -888,10 +887,10 @@ type ## ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_periodic_adv_sync_transfer(const hci_con_handle_t conn_handle, -## const uint16_t service_data, -## const uint16_t sync_handle); -## WARNING: ^^^ this API is not available in this release + +proc gap_periodic_adv_sync_transfer*(conn_handle: hci_con_handle_t; + service_data: uint16; sync_handle: uint16): uint8 {. + importc: "gap_periodic_adv_sync_transfer", header: "gap.h".} ## * ## @brief Instruct the Controller to send synchronization information about the periodic ## advertising in an advertising set to a connected device. @@ -903,11 +902,10 @@ type ## ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_periodic_adv_set_info_transfer(const hci_con_handle_t conn_handle, -## const uint16_t service_data, -## const uint8_t adv_handle); -## WARNING: ^^^ this API is not available in this release +proc gap_periodic_adv_set_info_transfer*(conn_handle: hci_con_handle_t; + service_data: uint16; adv_handle: uint8): uint8 {. + importc: "gap_periodic_adv_set_info_transfer", header: "gap.h".} type periodic_adv_sync_transfer_mode_t* {.size: sizeof(cint).} = enum PERIODIC_TRANS_MODE_NULL, PERIODIC_TRANS_MODE_SEND_EVT_DISABLE_REPORT, @@ -940,12 +938,11 @@ const ## Combination of SYNC_EXCL_XXX ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_periodic_adv_sync_transfer_param(const hci_con_handle_t conn_handle, -## const periodic_adv_sync_transfer_mode_t mode, -## const uint16_t skip, -## const uint16_t sync_timeout, -## const uint8_t cte_excl_types); -## WARNING: ^^^ this API is not available in this release + +proc gap_periodic_adv_sync_transfer_param*(conn_handle: hci_con_handle_t; + mode: periodic_adv_sync_transfer_mode_t; skip: uint16; sync_timeout: uint16; + cte_excl_types: uint8): uint8 {.importc: "gap_periodic_adv_sync_transfer_param", + header: "gap.h".} ## * ## @brief Specify the initial value for the mode, skip, timeout, and ## Constant Tone Extension type (set by the @@ -965,13 +962,11 @@ const ## Combination of SYNC_EXCL_XXX ## @return 0: Message is sent out; Other: Message is not sent out ## -## uint8_t gap_default_periodic_adv_sync_transfer_param( -## const periodic_adv_sync_transfer_mode_t mode, -## const uint16_t skip, -## const uint16_t sync_timeout, -## const uint8_t cte_excl_types); -## WARNING: ^^^ this API is not available in this release +proc gap_default_periodic_adv_sync_transfer_param*( + mode: periodic_adv_sync_transfer_mode_t; skip: uint16; sync_timeout: uint16; + cte_excl_types: uint8): uint8 {.importc: "gap_default_periodic_adv_sync_transfer_param", + header: "gap.h".} proc gap_set_host_channel_classification*(channel_low: uint32; channel_high: uint8): uint8 {. importc: "gap_set_host_channel_classification", header: "gap.h".} ## * diff --git a/bundles/typical/inc/os/FreeRTOS.nim b/bundles/typical/inc/os/FreeRTOS.nim index ac7cf8ef9..5e9f5c4bf 100644 --- a/bundles/typical/inc/os/FreeRTOS.nim +++ b/bundles/typical/inc/os/FreeRTOS.nim @@ -29,7 +29,7 @@ const errQUEUE_EMPTY* = (cast[BaseType_t](0)) errQUEUE_FULL* = (cast[BaseType_t](0)) - portMAX_DELAY = 0xffffffffu32 + portMAX_DELAY* = 0xffffffffu32 template pdMS_TO_TICKS*(xTimeInMs: int32): TickType_t = cast[TickType_t]((xTimeInMs* cast[int32](configTICK_RATE_HZ)) div 1000) @@ -75,7 +75,7 @@ type ## type - tmrTimerControl* {.importc: "tmrTimerControl", header: "FreeRTOSNim.h", bycopy.} = object + tmrTimerControl* {.importc: "struct tmrTimerControl", header: "FreeRTOSNim.h", bycopy.} = object ## The old naming convention is used to prevent breaking kernel aware debuggers. @@ -90,7 +90,7 @@ type ## type - QueueDefinition* {.importc: "QueueDefinition", header: "FreeRTOSNim.h", bycopy.} = object + QueueDefinition* {.importc: "struct QueueDefinition", header: "FreeRTOSNim.h", bycopy.} = object ## Using old naming convention so as not to break kernel aware debuggers. @@ -309,6 +309,57 @@ proc xTimerGenericCommand*(xTimer: TimerHandle_t; xCommandID: BaseType_t; proc pxPortInitialiseStack*(pxTopOfStack: ptr StackType_t; pxCode: TaskFunction_t; pvParameters: pointer): ptr StackType_t {. importc: "pxPortInitialiseStack", header: "FreeRTOSNim.h".} +const + tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR* = ((BaseType_t) -2) + tmrCOMMAND_EXECUTE_CALLBACK* = ((BaseType_t) -1) + tmrCOMMAND_START_DONT_TRACE* = (cast[BaseType_t](0)) + tmrCOMMAND_START* = (cast[BaseType_t](1)) + tmrCOMMAND_RESET* = (cast[BaseType_t](2)) + tmrCOMMAND_STOP* = (cast[BaseType_t](3)) + tmrCOMMAND_CHANGE_PERIOD* = (cast[BaseType_t](4)) + tmrCOMMAND_DELETE* = (cast[BaseType_t](5)) + tmrFIRST_FROM_ISR_COMMAND* = (cast[BaseType_t](6)) + tmrCOMMAND_START_FROM_ISR* = (cast[BaseType_t](6)) + tmrCOMMAND_RESET_FROM_ISR* = (cast[BaseType_t](7)) + tmrCOMMAND_STOP_FROM_ISR* = (cast[BaseType_t](8)) + tmrCOMMAND_CHANGE_PERIOD_FROM_ISR* = (cast[BaseType_t](9)) + +template xTimerStart*(xTimer, xTicksToWait: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_START, (xTaskGetTickCount()), nil, + (xTicksToWait)) + +template xTimerStop*(xTimer, xTicksToWait: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_STOP, 0, nil, (xTicksToWait)) + +template xTimerChangePeriod*(xTimer, xNewPeriod, xTicksToWait: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_CHANGE_PERIOD, (xNewPeriod), nil, + (xTicksToWait)) + +template xTimerDelete*(xTimer, xTicksToWait: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_DELETE, 0, nil, (xTicksToWait)) + +template xTimerReset*(xTimer, xTicksToWait: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_RESET, (xTaskGetTickCount()), nil, + (xTicksToWait)) + +template xTimerStartFromISR*(xTimer, pxHigherPriorityTaskWoken: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_START_FROM_ISR, + (xTaskGetTickCountFromISR()), (pxHigherPriorityTaskWoken), + 0) + +template xTimerStopFromISR*(xTimer, pxHigherPriorityTaskWoken: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_STOP_FROM_ISR, 0, + (pxHigherPriorityTaskWoken), 0) + +template xTimerChangePeriodFromISR*(xTimer, xNewPeriod, pxHigherPriorityTaskWoken: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, (xNewPeriod), + (pxHigherPriorityTaskWoken), 0) + +template xTimerResetFromISR*(xTimer, pxHigherPriorityTaskWoken: untyped): untyped = + xTimerGenericCommand((xTimer), tmrCOMMAND_RESET_FROM_ISR, + (xTaskGetTickCountFromISR()), (pxHigherPriorityTaskWoken), + 0) + proc pvPortMalloc*(xSize: csize): pointer {.importc: "pvPortMalloc", header: "FreeRTOSNim.h".} proc vPortFree*(pv: pointer) {.importc: "vPortFree", header: "FreeRTOSNim.h".} diff --git a/bundles/typical/inc/platform_api.h b/bundles/typical/inc/platform_api.h index 8026de943..1ff9f2b49 100644 --- a/bundles/typical/inc/platform_api.h +++ b/bundles/typical/inc/platform_api.h @@ -226,9 +226,16 @@ typedef enum { PLATFORM_CFG_LOG_HCI, // flag is ENABLE or DISABLE. default: DISABLE PLATFORM_CFG_POWER_SAVING, // flag is ENABLE or DISABLE. default: DISABLE - PLATFORM_CFG_TRACE_MASK // flag is bitmap of platform_trace_item_t. default: 0 + PLATFORM_CFG_TRACE_MASK, // flag is bitmap of platform_trace_item_t. default: 0 + PLATFORM_CFG_32K_CLK // 32k clock selection. flag is platform_32k_clk_src_t. default: PLATFORM_32K_RC } platform_cfg_item_t; +typedef enum +{ + PLATFORM_32K_OSC, // external 32k crystal oscillator + PLATFORM_32K_RC // internal RC 32k clock +} platform_32k_clk_src_t; + #define PLATFORM_CFG_ENABLE 1 #define PLATFORM_CFG_DISABLE 0 @@ -266,9 +273,7 @@ void platform_config(const platform_cfg_item_t item, const uint32_t flag); * @param[in] len byte number of random data **************************************************************************************** */ -// void platform_hrng(uint8_t *bytes, const uint32_t len); -// WARNING: ^^^ this API is not available in this release - +void platform_hrng(uint8_t *bytes, const uint32_t len); /** **************************************************************************************** @@ -344,6 +349,18 @@ void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); */ void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); +/** + **************************************************************************************** + * @brief Set default antenna ID + * + * Note: This ID restored to default value (i.e. 0) when LLE is resetted. + * + * @param[in] ant_id ID of default antenna (default: 0) + * + **************************************************************************************** + */ +void ll_set_def_antenna(uint8_t ant_id); + #ifdef __cplusplus } #endif diff --git a/bundles/typical/inc/platform_api.nim b/bundles/typical/inc/platform_api.nim index cbbdeed82..eb17ecb56 100644 --- a/bundles/typical/inc/platform_api.nim +++ b/bundles/typical/inc/platform_api.nim @@ -192,7 +192,12 @@ type platform_cfg_item_t* {.size: sizeof(cint).} = enum PLATFORM_CFG_LOG_HCI, ## flag is ENABLE or DISABLE. default: DISABLE PLATFORM_CFG_POWER_SAVING, ## flag is ENABLE or DISABLE. default: DISABLE - PLATFORM_CFG_TRACE_MASK ## flag is bitmap of platform_trace_item_t. default: 0 + PLATFORM_CFG_TRACE_MASK, ## flag is bitmap of platform_trace_item_t. default: 0 + PLATFORM_CFG_32K_CLK ## 32k clock selection. flag is platform_32k_clk_src_t. default: PLATFORM_32K_RC + platform_32k_clk_src_t* {.size: sizeof(cint).} = enum + PLATFORM_32K_OSC, ## external 32k crystal oscillator + PLATFORM_32K_RC ## internal RC 32k clock + const @@ -232,8 +237,9 @@ proc platform_config*(item: platform_cfg_item_t; flag: uint32) {. ## @param[in] len byte number of random data ## *************************************************************************************** ## -## void platform_hrng(uint8_t *bytes, const uint32_t len); -## WARNING: ^^^ this API is not available in this release + +proc platform_hrng*(bytes: ptr uint8; len: uint32) {.importc: "platform_hrng", + header: "platform_api.h".} ## * ## *************************************************************************************** ## @brief the printf function @@ -313,4 +319,17 @@ proc ll_set_initiating_coded_scheme*(scheme: coded_scheme_t) {. ## proc ll_hint_on_ce_len*(conn_handle: uint16; min_ce_len: uint16; max_ce_len: uint16) {. - importc: "ll_hint_on_ce_len", header: "platform_api.h".} \ No newline at end of file + importc: "ll_hint_on_ce_len", header: "platform_api.h".} +## * +## *************************************************************************************** +## @brief Set default antenna ID +## +## Note: This ID restored to default value (i.e. 0) when LLE is resetted. +## +## @param[in] ant_id ID of default antenna (default: 0) +## +## *************************************************************************************** +## + +proc ll_set_def_antenna*(ant_id: uint8) {.importc: "ll_set_def_antenna", + header: "platform_api.h".} \ No newline at end of file diff --git a/examples-gcc/peripheral_ibeacon/Makefile b/examples-gcc/peripheral_ibeacon/Makefile index b7ecf2080..67e3d3e74 100644 --- a/examples-gcc/peripheral_ibeacon/Makefile +++ b/examples-gcc/peripheral_ibeacon/Makefile @@ -4,7 +4,7 @@ ING_BUNDLE=../../bundles/typical/inc APPNAME=peripheral_ibeacon -PROJECT_FILES=src/main.c ../../examples/${APPNAME}/src/profile.c ${ING_REL}/src/FWlib/peripheral_uart.c +PROJECT_FILES=src/main.c ../../examples/${APPNAME}/src/profile.c ${ING_REL}/src/FWlib/peripheral_uart.c SYMDEFS=-Wl,--just-symbols=../../bundles/typical/symdefs.g diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw index d73d3ce9c..0d2dd19e6 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\/Program Files(2)\/gcc-arm-none-eabi-8-2018-q4-major-win32\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld index c4cd1e14b..3e1e34aeb 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910736, LENGTH = 25712 + RAM (rwx) : ORIGIN = 536910664, LENGTH = 25784 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index 906ceee95..2d0d2f978 100644 --- a/examples-iar/peripheral_ibeacon/generic_cortex.icf +++ b/examples-iar/peripheral_ibeacon/generic_cortex.icf @@ -2,9 +2,9 @@ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ /*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 155648; +define symbol __ICFEDIT_intvec_start__ = 155648; /*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 155648; +define symbol __ICFEDIT_region_IROM1_start__ = 155648; define symbol __ICFEDIT_region_IROM1_end__ = 0x00084000; define symbol __ICFEDIT_region_IROM2_start__ = 0x0; define symbol __ICFEDIT_region_IROM2_end__ = 0x0; @@ -14,7 +14,7 @@ define symbol __ICFEDIT_region_EROM2_start__ = 0x0; define symbol __ICFEDIT_region_EROM2_end__ = 0x0; define symbol __ICFEDIT_region_EROM3_start__ = 0x0; define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 536910736; +define symbol __ICFEDIT_region_IRAM1_start__ = 536910664; define symbol __ICFEDIT_region_IRAM1_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; diff --git a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw index 77fa39c2c..e1ae04aa5 100644 --- a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\/Program Files (x86)\/IAR Systems\/Embedded Workbench 8.2\/common\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/peripheral_battery/peripheral_battery.ingw b/examples-nim/peripheral_battery/peripheral_battery.ingw index 83cdf2d70..545f26fc9 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ingw +++ b/examples-nim/peripheral_battery/peripheral_battery.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\projects\\nim-1.0.0\\bin", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/peripheral_battery/peripheral_battery.ld b/examples-nim/peripheral_battery/peripheral_battery.ld index c4cd1e14b..3e1e34aeb 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ld +++ b/examples-nim/peripheral_battery/peripheral_battery.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910736, LENGTH = 25712 + RAM (rwx) : ORIGIN = 536910664, LENGTH = 25784 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-nim/smart_home_hub/smart_home_hub.ingw b/examples-nim/smart_home_hub/smart_home_hub.ingw index 9d9cca281..c6bddac56 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ingw +++ b/examples-nim/smart_home_hub/smart_home_hub.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\projects\\nim-1.0.0\\bin", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/smart_home_hub/smart_home_hub.ld b/examples-nim/smart_home_hub/smart_home_hub.ld index c4cd1e14b..3e1e34aeb 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ld +++ b/examples-nim/smart_home_hub/smart_home_hub.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910736, LENGTH = 25712 + RAM (rwx) : ORIGIN = 536910664, LENGTH = 25784 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-nim/smart_home_hub/src/profile.nim b/examples-nim/smart_home_hub/src/profile.nim index 967925d95..d73723509 100644 --- a/examples-nim/smart_home_hub/src/profile.nim +++ b/examples-nim/smart_home_hub/src/profile.nim @@ -547,7 +547,7 @@ proc setupProfile*(unused1: pointer; unused2: pointer): uint32 {.exportc noconv. # Note: security has not been enabled. initiatingTimer = xTimerCreate("a", pdMS_TO_TICKS(5000), - pdFALSE, + cast[UBaseType_t](pdFALSE), nil, initiatingTimerCallback); attServerInit(cast[attReadCallbackT](attReadCallback), cast[attWriteCallbackT](attWriteCallback)) diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp index 1616c6e7d..abca7fd50 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp @@ -2,7 +2,7 @@ - + diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw index 079a3a8a9..a163c4999 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\/Program Files(2)\/Crossworks\/bin", "ide_ver": "", @@ -50,8 +50,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "rowley": true, "uart_log": true, "ota_ver_patch": "0", diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject index 7657b0890..4c8a78e08 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject @@ -2,7 +2,7 @@ - + diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw index db5adbdf2..b1771a913 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\/Program Files (x86)\/SEGGER\/SEGGER Embedded Studio for ARM 4.50\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_mas/anti_lost_mas.ingw b/examples/anti_lost_mas/anti_lost_mas.ingw index a8f62d8fc..ef516db4d 100644 --- a/examples/anti_lost_mas/anti_lost_mas.ingw +++ b/examples/anti_lost_mas/anti_lost_mas.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_mas/anti_lost_mas.uvproj b/examples/anti_lost_mas/anti_lost_mas.uvproj index 738159d50..674bc2317 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvproj +++ b/examples/anti_lost_mas/anti_lost_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/anti_lost_mas/anti_lost_mas.uvprojx b/examples/anti_lost_mas/anti_lost_mas.uvprojx index ceb78c8c2..3e934c0ba 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvprojx +++ b/examples/anti_lost_mas/anti_lost_mas.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/anti_lost_mas/src/main.c b/examples/anti_lost_mas/src/main.c index 0faf3fb2e..808e1ee6f 100644 --- a/examples/anti_lost_mas/src/main.c +++ b/examples/anti_lost_mas/src/main.c @@ -63,6 +63,8 @@ void setup_peripherals(void) config_uart(OSC_CLK_FREQ, 115200); PINCTRL_DisableAllInputs(); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_PWM)); + PINCTRL_SetPadMux(LED_IO, IO_SOURCE_GENERAL); PINCTRL_SetPadMux(BUZZ_IO, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(LED_IO, 1); diff --git a/examples/anti_lost_sla/anti_lost_sla.ingw b/examples/anti_lost_sla/anti_lost_sla.ingw index 6915b32fa..693226f71 100644 --- a/examples/anti_lost_sla/anti_lost_sla.ingw +++ b/examples/anti_lost_sla/anti_lost_sla.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_sla/anti_lost_sla.uvproj b/examples/anti_lost_sla/anti_lost_sla.uvproj index fe21c9c09..38bee3215 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvproj +++ b/examples/anti_lost_sla/anti_lost_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/anti_lost_sla/anti_lost_sla.uvprojx b/examples/anti_lost_sla/anti_lost_sla.uvprojx index c36d7fc2a..3afdcfd5d 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvprojx +++ b/examples/anti_lost_sla/anti_lost_sla.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/anti_lost_sla/src/main.c b/examples/anti_lost_sla/src/main.c index 16ba25c06..1191982e0 100644 --- a/examples/anti_lost_sla/src/main.c +++ b/examples/anti_lost_sla/src/main.c @@ -62,6 +62,7 @@ void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); PINCTRL_DisableAllInputs(); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_PWM)); PINCTRL_SetPadMux(LED_IO, IO_SOURCE_GENERAL); PINCTRL_SetPadMux(BUZZ_IO, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(LED_IO, 1); diff --git a/examples/central_throughput/central_throughput.ingw b/examples/central_throughput/central_throughput.ingw index 1d87cbb2a..f0086d293 100644 --- a/examples/central_throughput/central_throughput.ingw +++ b/examples/central_throughput/central_throughput.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/central_throughput/central_throughput.uvproj b/examples/central_throughput/central_throughput.uvproj index 9a05c8c49..e88b40277 100644 --- a/examples/central_throughput/central_throughput.uvproj +++ b/examples/central_throughput/central_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/central_throughput/central_throughput.uvprojx b/examples/central_throughput/central_throughput.uvprojx index 193501a1e..4af4f00ff 100644 --- a/examples/central_throughput/central_throughput.uvprojx +++ b/examples/central_throughput/central_throughput.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/central_throughput/src/main.c b/examples/central_throughput/src/main.c index 3e8fa7698..adda67053 100644 --- a/examples/central_throughput/src/main.c +++ b/examples/central_throughput/src/main.c @@ -56,6 +56,7 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_TMR1)); TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ); TMR_SetOpMode(APB_TMR1, TMR_CTL_OP_MODE_WRAPPING); TMR_IntEnable(APB_TMR1); diff --git a/examples/hid_keyboard/flash_download.ini b/examples/hid_keyboard/flash_download.ini index ad83c62aa..17401e215 100644 --- a/examples/hid_keyboard/flash_download.ini +++ b/examples/hid_keyboard/flash_download.ini @@ -15,7 +15,7 @@ script= [bin-0] Name=Burn Bin #1 -Checked=0 +Checked=1 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -26,8 +26,8 @@ Address=155648 FileName=hid_keyboard.bin [uart] -Port=3 -Baud=115200 +Port=COM3 +Baud=921600 Parity= DataBits=8 StopBits=1 diff --git a/examples/hid_keyboard/hid_keyboard.ingw b/examples/hid_keyboard/hid_keyboard.ingw index fdb153165..814a4742f 100644 --- a/examples/hid_keyboard/hid_keyboard.ingw +++ b/examples/hid_keyboard/hid_keyboard.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -58,8 +58,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/hid_keyboard/hid_keyboard.uvoptx b/examples/hid_keyboard/hid_keyboard.uvoptx index 91d6845f6..dd8adfb73 100644 --- a/examples/hid_keyboard/hid_keyboard.uvoptx +++ b/examples/hid_keyboard/hid_keyboard.uvoptx @@ -145,7 +145,32 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) - + + + 0 + 0 + 74 + 1 +
159676
+ 0 + 0 + 0 + 0 + 0 + 1 + .\src\main.c + + \\hid_keyboard\src/main.c\74 +
+
+ + + 1 + 5 + 0x40000000 + 0 + + 0 @@ -241,7 +266,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -270,7 +295,7 @@ FWlib - 0 + 1 0 0 0 diff --git a/examples/hid_keyboard/hid_keyboard.uvproj b/examples/hid_keyboard/hid_keyboard.uvproj index 2305f7f6a..bd95ed3a4 100644 --- a/examples/hid_keyboard/hid_keyboard.uvproj +++ b/examples/hid_keyboard/hid_keyboard.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/hid_keyboard/hid_keyboard.uvprojx b/examples/hid_keyboard/hid_keyboard.uvprojx index 8b865e3b2..c7c1deb8a 100644 --- a/examples/hid_keyboard/hid_keyboard.uvprojx +++ b/examples/hid_keyboard/hid_keyboard.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
### uVision Project, (C) Keil Software
+ Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o hid_keyboard.bin ./output/hid_keyboard.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536910736 - 25712 + 0x20009b48 + 0x64b8 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -454,11 +457,12 @@ + - + @@ -466,4 +470,5 @@ +
diff --git a/examples/hid_keyboard/src/main.c b/examples/hid_keyboard/src/main.c index 25f86b3e5..d3a30c304 100644 --- a/examples/hid_keyboard/src/main.c +++ b/examples/hid_keyboard/src/main.c @@ -70,7 +70,10 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); - + + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_PinCtrl)); + // setup GPIOs for keys PINCTRL_DisableAllInputs(); PINCTRL_SetPadMux(KB_KEY_1, IO_SOURCE_GENERAL); @@ -94,7 +97,7 @@ uint32_t gpio_isr(void *user_data) { uint32_t current = ~GIO_ReadAll(); int8_t i = 0; - + // report which keys are pressed if (current & (1 << KB_KEY_1)) report.codes[i++] = KEY_1; diff --git a/examples/hid_mouse/hid_mouse.ingw b/examples/hid_mouse/hid_mouse.ingw index 2b7418cc9..eaab5ceb1 100644 --- a/examples/hid_mouse/hid_mouse.ingw +++ b/examples/hid_mouse/hid_mouse.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -58,8 +58,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/hid_mouse/hid_mouse.uvproj b/examples/hid_mouse/hid_mouse.uvproj index cc12d8896..b29dfbe04 100644 --- a/examples/hid_mouse/hid_mouse.uvproj +++ b/examples/hid_mouse/hid_mouse.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/hid_mouse/hid_mouse.uvprojx b/examples/hid_mouse/hid_mouse.uvprojx index fe9a87e4f..e07e367b7 100644 --- a/examples/hid_mouse/hid_mouse.uvprojx +++ b/examples/hid_mouse/hid_mouse.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/hid_mouse/src/main.c b/examples/hid_mouse/src/main.c index 4cac42f3d..a829e77a9 100644 --- a/examples/hid_mouse/src/main.c +++ b/examples/hid_mouse/src/main.c @@ -62,7 +62,8 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 921600); - + + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_TMR1)); // setup timer 1: 1Hz TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / 10); TMR_SetOpMode(APB_TMR1, TMR_CTL_OP_MODE_WRAPPING); diff --git a/examples/ibeacon_scanner/ibeacon_scanner.ingw b/examples/ibeacon_scanner/ibeacon_scanner.ingw index 14ad1d210..3aef0f5a6 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.ingw +++ b/examples/ibeacon_scanner/ibeacon_scanner.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -44,8 +44,8 @@ "role": "central", "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvproj b/examples/ibeacon_scanner/ibeacon_scanner.uvproj index b61e90533..b89e79562 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvproj +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx index c72d622bf..e59e2b03f 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/ibeacon_scanner/src/main.c b/examples/ibeacon_scanner/src/main.c index c4513ddf4..f9cdd6d47 100644 --- a/examples/ibeacon_scanner/src/main.c +++ b/examples/ibeacon_scanner/src/main.c @@ -71,6 +71,8 @@ void blink(const uint8_t led_id) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_PWM)); PINCTRL_SetPadMux(PIN_RED, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(PIN_RED, 1); diff --git a/examples/io_over_ble_mas/io_over_ble_mas.ingw b/examples/io_over_ble_mas/io_over_ble_mas.ingw index 44297eac3..bff8a5cd8 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.ingw +++ b/examples/io_over_ble_mas/io_over_ble_mas.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvproj b/examples/io_over_ble_mas/io_over_ble_mas.uvproj index 7a5d8383d..490b3bba2 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvproj +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx index 824f100b5..50617a680 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/io_over_ble_mas/src/main.c b/examples/io_over_ble_mas/src/main.c index 22363591e..c8a0d1f16 100644 --- a/examples/io_over_ble_mas/src/main.c +++ b/examples/io_over_ble_mas/src/main.c @@ -87,6 +87,8 @@ void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 912600); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_PWM)); + PINCTRL_SetPadMux(LED_PIN, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(LED_PIN, 1); diff --git a/examples/io_over_ble_sla/io_over_ble_sla.ingw b/examples/io_over_ble_sla/io_over_ble_sla.ingw index 4a25552cf..cc4d9b8b8 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.ingw +++ b/examples/io_over_ble_sla/io_over_ble_sla.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvproj b/examples/io_over_ble_sla/io_over_ble_sla.uvproj index dfe94b585..c08765471 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvproj +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx index 202ee5c39..3009c04ce 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o io_over_ble_sla.bin ./output/io_over_ble_sla.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER,IO_TYPE=IO_TYPE_UART - + ../io_over_ble_mas\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -465,12 +462,11 @@ - - + @@ -478,5 +474,4 @@ -
diff --git a/examples/io_over_ble_sla/src/main.c b/examples/io_over_ble_sla/src/main.c index 132021f2b..0016d3e0e 100644 --- a/examples/io_over_ble_sla/src/main.c +++ b/examples/io_over_ble_sla/src/main.c @@ -81,6 +81,7 @@ void show_state(const io_state_t state) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 921600); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_PWM)); PINCTRL_SetPadMux(LED_PIN, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(LED_PIN, 1); diff --git a/examples/mesh-light/mesh-light.uvopt b/examples/mesh-light/mesh-light.uvopt index e909ebd1d..7cd5e6d57 100644 --- a/examples/mesh-light/mesh-light.uvopt +++ b/examples/mesh-light/mesh-light.uvopt @@ -195,10 +195,10 @@ 1 0 0 - 6 + 5 0 - 84 - 108 + 1 + 1 0 .\src\main.c main.c @@ -213,7 +213,7 @@ 0 31 0 - 85 + 77 78 0 .\src\profile.c @@ -256,7 +256,7 @@ 0 0 0 - ..\..\bundles\mesh\symdefs.m + ..\..\bundles\mesh\ING9188xx\symdefs.m symdefs.m 0 0 @@ -341,6 +341,22 @@ 0 0
+ + 4 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_gpio.c + peripheral_gpio.c + 0 + 0 + @@ -359,14 +375,14 @@ 0 6 - 9 + 10 1 0 0 0 0 - 1 - 9 + 0 + 0 0 ..\..\src\Mesh\model_srv.c model_srv.c @@ -375,14 +391,14 @@ 6 - 10 + 11 1 0 0 56 0 - 1 - 10 + 0 + 0 0 ..\..\src\Mesh\model_cli.c model_cli.c @@ -391,4 +407,4 @@ - \ No newline at end of file + diff --git a/examples/mesh-light/mesh-light.uvoptx b/examples/mesh-light/mesh-light.uvoptx index 8b1f47562..44495e85a 100644 --- a/examples/mesh-light/mesh-light.uvoptx +++ b/examples/mesh-light/mesh-light.uvoptx @@ -310,6 +310,18 @@ 0 0
+ + 4 + 9 + 1 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_gpio.c + peripheral_gpio.c + 0 + 0 + @@ -328,7 +340,7 @@ 0 6 - 9 + 10 1 0 0 @@ -340,7 +352,7 @@ 6 - 10 + 11 1 0 0 diff --git a/examples/mesh-light/mesh-light.uvproj b/examples/mesh-light/mesh-light.uvproj index 30e118795..dead55117 100644 --- a/examples/mesh-light/mesh-light.uvproj +++ b/examples/mesh-light/mesh-light.uvproj @@ -442,6 +442,11 @@ 1 ..\..\src\FWlib\peripheral_sysctrl.c + + peripheral_gpio.c + 1 + ..\..\src\FWlib\peripheral_gpio.c + diff --git a/examples/mesh-light/mesh-light.uvprojx b/examples/mesh-light/mesh-light.uvprojx index 95776010e..e2a3b8a42 100644 --- a/examples/mesh-light/mesh-light.uvprojx +++ b/examples/mesh-light/mesh-light.uvprojx @@ -429,6 +429,11 @@ 1 ..\..\src\FWlib\peripheral_sysctrl.c + + peripheral_gpio.c + 1 + ..\..\src\FWlib\peripheral_gpio.c + diff --git a/examples/mesh-light/src/main.c b/examples/mesh-light/src/main.c index da4120655..d7f2666ac 100644 --- a/examples/mesh-light/src/main.c +++ b/examples/mesh-light/src/main.c @@ -46,54 +46,13 @@ void config_uart(uint32_t freq, uint32_t baud) apUART_Initialize(PRINT_UART, &UART_0, 0); } -#define CHANNEL_RED 4 -#define CHANNEL_GREEN 0 -#define CHANNEL_BLUE 6 - -#define PERA_THRESHOLD (OSC_CLK_FREQ / 1000) - -void set_led_color(uint8_t r, uint8_t g, uint8_t b) -{ -#ifndef SIMULATION -#define TO_PERCENT(v) (((uint32_t)(v) * 100) >> 8) - - PWM_SetHighThreshold(CHANNEL_RED >> 1, 0, PERA_THRESHOLD / 100 * TO_PERCENT(r)); - PWM_SetHighThreshold(CHANNEL_GREEN >> 1, 0, PERA_THRESHOLD / 100 * TO_PERCENT(g >> 1)); // GREEN & BLUE led seems too bright - PWM_SetHighThreshold(CHANNEL_BLUE >> 1, 0, PERA_THRESHOLD / 100 * TO_PERCENT(b >> 1)); -#endif -} - -static void setup_channel(uint8_t channel_index) -{ - PWM_HaltCtrlEnable(channel_index, 1); - PWM_Enable(channel_index, 0); - PWM_SetPeraThreshold(channel_index, PERA_THRESHOLD); - PWM_SetMultiDutyCycleCtrl(channel_index, 0); // do not use multi duty cycles - PWM_SetHighThreshold(channel_index, 0, PERA_THRESHOLD / 2); - PWM_SetMode(channel_index, PWM_WORK_MODE_UP_WITHOUT_DIED_ZONE); - PWM_SetMask(channel_index, 0, 0); - PWM_Enable(channel_index, 1); - PWM_HaltCtrlEnable(channel_index, 0); -} +#include "../../peripheral_led/src/impl_led.c" void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); -#ifndef SIMULATION - PINCTRL_SetPadMux(CHANNEL_RED, IO_SOURCE_GENERAL); - PINCTRL_SetPadPwmSel(CHANNEL_RED, 1); - PINCTRL_SetPadMux(CHANNEL_GREEN, IO_SOURCE_GENERAL); - PINCTRL_SetPadPwmSel(CHANNEL_GREEN, 1); - PINCTRL_SetPadMux(CHANNEL_BLUE, IO_SOURCE_GENERAL); - PINCTRL_SetPadPwmSel(CHANNEL_BLUE, 1); - - setup_channel(CHANNEL_RED >> 1); - setup_channel(CHANNEL_GREEN >> 1); - setup_channel(CHANNEL_BLUE >> 1); - - set_led_color(50, 50, 50); -#endif + setup_led(); } int app_main() diff --git a/examples/periodic_advertiser/README.md b/examples/periodic_advertiser/README.md index 46eadc90d..cb783f02d 100644 --- a/examples/periodic_advertiser/README.md +++ b/examples/periodic_advertiser/README.md @@ -2,6 +2,6 @@ This example demonstrates how to: -* Send periodic advertising PDUs; +* Send periodic advertising PDUs with CTE; * Update advertising data periodically. diff --git a/examples/periodic_advertiser/flash_download.ini b/examples/periodic_advertiser/flash_download.ini index e2689ebcf..5954ef04b 100644 --- a/examples/periodic_advertiser/flash_download.ini +++ b/examples/periodic_advertiser/flash_download.ini @@ -6,7 +6,7 @@ entry=0x4000 set-entry=1 launch=1 batch=1 -batch.current=11 +batch.current=16 batch.limit=-1 protection.enabled=0 protection.unlock=0 @@ -15,7 +15,7 @@ script= [bin-0] Name=Burn Bin #1 -Checked=0 +Checked=1 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -27,7 +27,7 @@ FileName=periodic_advertiser.bin [uart] Port=COM4 -Baud=115200 +Baud=921600 Parity= DataBits=8 StopBits=1 diff --git a/examples/periodic_advertiser/periodic_advertiser.ingw b/examples/periodic_advertiser/periodic_advertiser.ingw index 394c90b2c..a653c438f 100644 --- a/examples/periodic_advertiser/periodic_advertiser.ingw +++ b/examples/periodic_advertiser/periodic_advertiser.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/periodic_advertiser/periodic_advertiser.uvproj b/examples/periodic_advertiser/periodic_advertiser.uvproj index d63c7b489..6ec2a54c1 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvproj +++ b/examples/periodic_advertiser/periodic_advertiser.uvproj @@ -1,10 +1,7 @@ - + - 1.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -15,27 +12,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -57,8 +54,8 @@ 0 0 - - + + 0 0 0 @@ -67,8 +64,8 @@ 0 0 - - + + 0 0 @@ -76,12 +73,12 @@ 1 0 fromelf.exe --bin -o periodic_advertiser.bin ./output/periodic_advertiser.axf - + 0 0 0 - + 0 @@ -95,16 +92,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -141,17 +138,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -168,7 +165,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -200,7 +197,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -297,8 +294,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -322,8 +319,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -331,7 +328,7 @@ 0x0 - + 1 @@ -349,8 +346,8 @@ 0 --gnu - USE_STDPERIPH_DRIVER - + USE_STDPERIPH_DRIVER,CTE + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -364,10 +361,10 @@ 0 0 - - - - + + + + @@ -379,12 +376,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -448,5 +445,4 @@ -
diff --git a/examples/periodic_advertiser/periodic_advertiser.uvprojx b/examples/periodic_advertiser/periodic_advertiser.uvprojx index 7ea200bbc..0c995a769 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvprojx +++ b/examples/periodic_advertiser/periodic_advertiser.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o periodic_advertiser.bin ./output/periodic_advertiser.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -333,8 +330,8 @@ 0 --gnu - USE_STDPERIPH_DRIVER - + USE_STDPERIPH_DRIVER,CTE + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -438,12 +435,11 @@ - - + @@ -451,5 +447,4 @@ -
diff --git a/examples/periodic_advertiser/src/main.c b/examples/periodic_advertiser/src/main.c index daca8c84e..1a2c1354b 100644 --- a/examples/periodic_advertiser/src/main.c +++ b/examples/periodic_advertiser/src/main.c @@ -77,7 +77,7 @@ int app_main() { // If there are *three* crystals on board, *uncomment* below line. // Otherwise, below line should be kept commented out. - // platform_set_rf_clk_source(0); + // platform_set_rf_clk_source(1); // Watchdog will timeout after 40sec TMR_WatchDogEnable(TMR_CLK_FREQ * 20); @@ -89,6 +89,7 @@ int app_main() platform_set_evt_callback(PLATFORM_CB_EVT_ON_DEEP_SLEEP_WAKEUP, on_deep_sleep_wakeup, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, query_deep_sleep_allowed, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); + // platform_config(PLATFORM_CFG_LOG_HCI, PLATFORM_CFG_ENABLE); setup_peripherals(); return 0; diff --git a/examples/periodic_advertiser/src/profile.c b/examples/periodic_advertiser/src/profile.c index 99b3ffa89..005f906e3 100644 --- a/examples/periodic_advertiser/src/profile.c +++ b/examples/periodic_advertiser/src/profile.c @@ -79,16 +79,15 @@ static void setup_adv(void) PHY_1M, // Secondary_Advertising_PHY 0x00, // Advertising_SID 0x00); // Scan_Request_Notification_Enable - gap_set_periodic_adv_para(0, 1000, 1000, PERIODIC_ADV_BIT_INC_TX); + gap_set_periodic_adv_para(0, 500, 500, PERIODIC_ADV_BIT_INC_TX); gap_set_periodic_adv_data(0, sizeof(adv_data), (uint8_t*)adv_data); gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); gap_set_periodic_adv_enable(1, 0); #ifdef CTE - gap_set_connectionless_cte_tx_param(0, 2, + gap_set_connectionless_cte_tx_param(0, 5, CTE_AOA, 1, - 2, - 0, NULL); + 2, NULL); gap_set_connectionless_cte_tx_enable(0, 1); #endif } diff --git a/examples/periodic_scanner/README.md b/examples/periodic_scanner/README.md index 3c7b7b9ae..ca152449c 100644 --- a/examples/periodic_scanner/README.md +++ b/examples/periodic_scanner/README.md @@ -5,3 +5,7 @@ This example demonstrates how to: * Receive (synchronize to) periodic advertising PDUs; * Parse advertising PDUs. +Note: + 1. CTE samples are reported to UART (Base64 encoded); + 2. Need an antenna array. + diff --git a/examples/periodic_scanner/flash_download.ini b/examples/periodic_scanner/flash_download.ini index 78cd6d8a5..24f2aee1d 100644 --- a/examples/periodic_scanner/flash_download.ini +++ b/examples/periodic_scanner/flash_download.ini @@ -6,7 +6,7 @@ entry=0x4000 set-entry=1 launch=1 batch=1 -batch.current=17 +batch.current=21 batch.limit=-1 protection.enabled=0 protection.unlock=0 @@ -15,7 +15,7 @@ script= [bin-0] Name=Burn Bin #1 -Checked=0 +Checked=1 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -26,8 +26,8 @@ Address=155648 FileName=periodic_scanner.bin [uart] -Port=COM3 -Baud=115200 +Port=COM16 +Baud=921600 Parity= DataBits=8 StopBits=1 diff --git a/examples/periodic_scanner/periodic_scanner.ingw b/examples/periodic_scanner/periodic_scanner.ingw index cde8bfe11..c2b06342e 100644 --- a/examples/periodic_scanner/periodic_scanner.ingw +++ b/examples/periodic_scanner/periodic_scanner.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/periodic_scanner/periodic_scanner.uvopt b/examples/periodic_scanner/periodic_scanner.uvopt index 8b1bbde13..774ca715b 100644 --- a/examples/periodic_scanner/periodic_scanner.uvopt +++ b/examples/periodic_scanner/periodic_scanner.uvopt @@ -195,7 +195,7 @@ 0 18 0 - 1 + 6 7 0 .\src\main.c @@ -209,10 +209,10 @@ 1 0 0 - 62 + 38 0 - 153 - 165 + 158 + 169 0 .\src\profile.c profile.c @@ -286,7 +286,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -303,7 +303,7 @@ FWlib - 0 + 1 0 0 0 @@ -339,6 +339,22 @@ 0 0 + + 4 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + @@ -349,7 +365,7 @@ 0 5 - 9 + 10 1 0 0 @@ -365,4 +381,4 @@ - \ No newline at end of file + diff --git a/examples/periodic_scanner/periodic_scanner.uvoptx b/examples/periodic_scanner/periodic_scanner.uvoptx index d10c660ce..08753bbe1 100644 --- a/examples/periodic_scanner/periodic_scanner.uvoptx +++ b/examples/periodic_scanner/periodic_scanner.uvoptx @@ -146,6 +146,21 @@ + + + 0 + 1 + iq_str_buffer + + + + + 1 + 2 + 0x40090200 + 0 + + 0 @@ -265,7 +280,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -282,7 +297,7 @@ FWlib - 0 + 1 0 0 0 @@ -310,6 +325,18 @@ 0 0 + + 4 + 9 + 1 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + @@ -320,7 +347,7 @@ 0 5 - 9 + 10 1 0 0 diff --git a/examples/periodic_scanner/periodic_scanner.uvproj b/examples/periodic_scanner/periodic_scanner.uvproj index 946622c17..575208338 100644 --- a/examples/periodic_scanner/periodic_scanner.uvproj +++ b/examples/periodic_scanner/periodic_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 @@ -346,7 +346,7 @@ 0 --gnu - USE_STDPERIPH_DRIVER + USE_STDPERIPH_DRIVER,CTE ..\ibeacon_scanner\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -442,6 +442,11 @@ 1 ../..\src\FWlib\peripheral_sysctrl.c + + peripheral_pinctrl.c + 1 + ..\..\src\FWlib\peripheral_pinctrl.c + diff --git a/examples/periodic_scanner/periodic_scanner.uvprojx b/examples/periodic_scanner/periodic_scanner.uvprojx index fc9aca81b..d8800aa9d 100644 --- a/examples/periodic_scanner/periodic_scanner.uvprojx +++ b/examples/periodic_scanner/periodic_scanner.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 @@ -330,7 +330,7 @@ 0 --gnu - USE_STDPERIPH_DRIVER,SIMULATION + USE_STDPERIPH_DRIVER,CTE ..\ibeacon_scanner\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -429,6 +429,11 @@ 1 ../..\src\FWlib\peripheral_sysctrl.c + + peripheral_pinctrl.c + 1 + ..\..\src\FWlib\peripheral_pinctrl.c + diff --git a/examples/periodic_scanner/src/main.c b/examples/periodic_scanner/src/main.c index f6628b589..0c9b2a15c 100644 --- a/examples/periodic_scanner/src/main.c +++ b/examples/periodic_scanner/src/main.c @@ -55,6 +55,14 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 921600); + + PINCTRL_SetPadMux(7, IO_SOURCE_GENERAL); + PINCTRL_SetPadMux(8, IO_SOURCE_GENERAL); + PINCTRL_SetPadMux(10, IO_SOURCE_GENERAL); + + PINCTRL_SetGeneralPadMode(7, IO_MODE_ANT_SEL, 0, 0); + PINCTRL_SetGeneralPadMode(8, IO_MODE_ANT_SEL, 0, 0); + PINCTRL_SetGeneralPadMode(10, IO_MODE_ANT_SEL, 0, 0); } uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) @@ -65,6 +73,14 @@ uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) return 0; } +uint32_t cb_lle_init(char *c, void *dummy) +{ + volatile uint32_t *reg = (volatile uint32_t *)0x40090200; + ll_set_def_antenna(1); + *reg = (*reg & ~(0x1f << 15)) | (0 << 15); + return 0; +} + uint32_t query_deep_sleep_allowed(void *dummy, void *user_data) { (void)(dummy); @@ -77,9 +93,9 @@ int app_main() { // If there are *three* crystals on board, *uncomment* below line. // Otherwise, below line should be kept commented out. - // platform_set_rf_clk_source(0); + // platform_set_rf_clk_source(1); - //platform_config(PLATFORM_CFG_LOG_HCI, PLATFORM_CFG_ENABLE); + // platform_config(PLATFORM_CFG_LOG_HCI, PLATFORM_CFG_ENABLE); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); @@ -88,8 +104,10 @@ int app_main() platform_set_evt_callback(PLATFORM_CB_EVT_ON_DEEP_SLEEP_WAKEUP, on_deep_sleep_wakeup, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, query_deep_sleep_allowed, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); + platform_set_evt_callback(PLATFORM_CB_EVT_LLE_INIT, (f_platform_evt_cb)cb_lle_init, NULL); setup_peripherals(); + return 0; } diff --git a/examples/periodic_scanner/src/profile.c b/examples/periodic_scanner/src/profile.c index f8c266ecf..fe4cc3e00 100644 --- a/examples/periodic_scanner/src/profile.c +++ b/examples/periodic_scanner/src/profile.c @@ -176,7 +176,7 @@ void recv_iq_report(const le_meta_connless_iq_report_t *report) platform_printf("\n"); } -#ifdef SIMULATION +#ifndef CTE #pragma pack (push, 1) typedef struct sim_iq_report @@ -275,10 +275,10 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin prd_adv_data_offset = 0; #ifdef CTE { - static const uint8_t ant_ids[] = {0, 1}; - gap_set_connectionless_iq_sampling_enable(established->sync_handle, + static const uint8_t ant_ids[] = {1, 2}; + gap_set_connectionless_iq_sampling_enable(established->handle, 1, - (1 << CTE_SLOT_DURATION_1US) | (1 << CTE_SLOT_DURATION_2US), + 2, 16, sizeof(ant_ids), ant_ids); } @@ -302,7 +302,7 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin switch (report->data_status) { case HCI_PRD_ADV_DATA_STATUS_CML: -#ifdef SIMULATION +#ifndef CTE simulate_cte_report(); #endif show_adv(report->rssi); diff --git a/examples/peripheral_all_in_one/flash_download.ini b/examples/peripheral_all_in_one/flash_download.ini index 57f955d85..1d0b44eae 100644 --- a/examples/peripheral_all_in_one/flash_download.ini +++ b/examples/peripheral_all_in_one/flash_download.ini @@ -15,7 +15,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 -Checked=1 +Checked=0 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw index 57b7be376..4a949dc01 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x16, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x41, 0x6C, 0x6C, 0x20, \r\n0x49, 0x6E, 0x20, 0x4F, 0x6E, 0x65, \r\n\r\n\/\/ Service Battery Service: 180F\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0F, 0x18, \r\n\/\/ Characteristic Battery Level: 2A19\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0x19, 0x2A, \r\n0x09, 0x00, 0x02, 0x00, 0x06, 0x00, 0x19, 0x2A,\r\n0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28,\r\n0x10, 0x09, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x09, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x0A, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x03, 0x28,\r\n0x02, 0x0C, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x03, 0x28,\r\n0x06, 0x0F, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x0F, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x28,\r\n0x04, 0x11, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x04, 0x03, 0x11, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x13, 0x00, 0x03, 0x28,\r\n0x06, 0x14, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x03, 0x14, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 353\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_BATTERY_LEVEL=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=9\r\n\/\/ HANDLE_RSC_FEATURE=12\r\n\/\/ HANDLE_ETAG_CONTROL=15\r\n\/\/ HANDLE_ETAG_DATA=17\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=20\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_BATTERY_LEVEL_OFFSET=76\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=108\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=149\r\n\/\/ HANDLE_ETAG_CONTROL_OFFSET=224\r\n\/\/ HANDLE_ETAG_DATA_OFFSET=274\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=348\r\n", diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj index ffa77254f..8ea720380 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx index eca846176..02480bba6 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_all_in_one/src/main.c b/examples/peripheral_all_in_one/src/main.c index 6f27302a0..65a2df511 100644 --- a/examples/peripheral_all_in_one/src/main.c +++ b/examples/peripheral_all_in_one/src/main.c @@ -84,6 +84,12 @@ struct bme280_t bme280_data; void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_PinCtrl) + | (1 << SYSCTRL_ClkGate_APB_PWM) + | (1 << SYSCTRL_ClkGate_AHB_SPI0) + | (1 << SYSCTRL_ClkGate_APB_I2C0) + | (1 << SYSCTRL_ClkGate_APB_TMR1)); // for RGB setup_led(); diff --git a/examples/peripheral_ancs/flash_download.ini b/examples/peripheral_ancs/flash_download.ini index 91ffd704b..de9a4afb9 100644 --- a/examples/peripheral_ancs/flash_download.ini +++ b/examples/peripheral_ancs/flash_download.ini @@ -6,7 +6,7 @@ entry=0x4000 set-entry=1 launch=1 batch=1 -batch.current=40 +batch.current=46 batch.limit=-1 protection.enabled=0 protection.unlock=0 diff --git a/examples/peripheral_ancs/peripheral_ancs.ingw b/examples/peripheral_ancs/peripheral_ancs.ingw index fa77aac6a..caa1beb1d 100644 --- a/examples/peripheral_ancs/peripheral_ancs.ingw +++ b/examples/peripheral_ancs/peripheral_ancs.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_ancs/peripheral_ancs.uvproj b/examples/peripheral_ancs/peripheral_ancs.uvproj index 867675b0c..277074fe8 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvproj +++ b/examples/peripheral_ancs/peripheral_ancs.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_ancs/peripheral_ancs.uvprojx b/examples/peripheral_ancs/peripheral_ancs.uvprojx index b11b33d44..a7d6b86c9 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvprojx +++ b/examples/peripheral_ancs/peripheral_ancs.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o peripheral_ancs.bin ./output/peripheral_ancs.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -462,12 +459,11 @@ - - + @@ -475,5 +471,4 @@ -
diff --git a/examples/peripheral_ancs/src/main.c b/examples/peripheral_ancs/src/main.c index fb2a192e0..37279455d 100644 --- a/examples/peripheral_ancs/src/main.c +++ b/examples/peripheral_ancs/src/main.c @@ -77,6 +77,8 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_PinCtrl)); // setup GPIOs for keys PINCTRL_DisableAllInputs(); @@ -166,7 +168,7 @@ int app_main() { // If there are *three* crystals on board, *uncomment* below line. // Otherwise, below line should be kept commented out. - // platform_set_rf_clk_source(0); + // platform_set_rf_clk_source(1); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); @@ -185,6 +187,8 @@ int app_main() "Key 1: Accept call\n" "Key 2: Reject call\n" "Key 3: Clear bonding\n"); + + platform_config(PLATFORM_CFG_32K_CLK, PLATFORM_32K_OSC); SEGGER_RTT_Init(); platform_set_evt_callback(PLATFORM_CB_EVT_TRACE, (f_platform_evt_cb)cb_trace_rtt, NULL); diff --git a/examples/peripheral_band/peripheral_band.ingw b/examples/peripheral_band/peripheral_band.ingw index db7cc48dc..ad34ccd54 100644 --- a/examples/peripheral_band/peripheral_band.ingw +++ b/examples/peripheral_band/peripheral_band.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x42, 0x61, 0x6E, 0x64, \r\n\r\n\/\/ Service Heart Rate: 180D\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0D, 0x18, \r\n\/\/ Characteristic Heart Rate Measurement: 2A37\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x10, 0x06, 0x00, 0x37, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x06, 0x00, 0x37, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x07, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x10, 0x0A, 0x00, 0x53, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x53, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x0B, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x03, 0x28,\r\n0x02, 0x0D, 0x00, 0x54, 0x2A, \r\n0x08, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x54, 0x2A,\r\n\r\n0x00,0x00\r\n\/\/ total size = 144\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=10\r\n\/\/ HANDLE_RSC_FEATURE=13\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT_OFFSET=70\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=111\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=142\r\n", diff --git a/examples/peripheral_band/peripheral_band.uvproj b/examples/peripheral_band/peripheral_band.uvproj index 1c6e91e24..d09cea58a 100644 --- a/examples/peripheral_band/peripheral_band.uvproj +++ b/examples/peripheral_band/peripheral_band.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_band/peripheral_band.uvprojx b/examples/peripheral_band/peripheral_band.uvprojx index 986bd1aa6..2bef7fd7e 100644 --- a/examples/peripheral_band/peripheral_band.uvprojx +++ b/examples/peripheral_band/peripheral_band.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_band/src/main.c b/examples/peripheral_band/src/main.c index b94e9727c..47567e4f3 100644 --- a/examples/peripheral_band/src/main.c +++ b/examples/peripheral_band/src/main.c @@ -57,6 +57,12 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_PinCtrl) + | (1 << SYSCTRL_ClkGate_APB_PWM) + | (1 << SYSCTRL_ClkGate_APB_I2C0) + | (1 << SYSCTRL_ClkGate_APB_TMR1) + | (1 << SYSCTRL_ClkGate_APB_TMR2)); // setup timer 1: 50Hz TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / ACC_SAMPLING_RATE); diff --git a/examples/peripheral_battery/peripheral_battery.ingw b/examples/peripheral_battery/peripheral_battery.ingw index a40d25aff..9931f9272 100644 --- a/examples/peripheral_battery/peripheral_battery.ingw +++ b/examples/peripheral_battery/peripheral_battery.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -49,8 +49,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n" diff --git a/examples/peripheral_battery/peripheral_battery.uvoptx b/examples/peripheral_battery/peripheral_battery.uvoptx index a23b742d5..a0a266320 100644 --- a/examples/peripheral_battery/peripheral_battery.uvoptx +++ b/examples/peripheral_battery/peripheral_battery.uvoptx @@ -241,7 +241,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_battery/peripheral_battery.uvproj b/examples/peripheral_battery/peripheral_battery.uvproj index cea584deb..dd0237f05 100644 --- a/examples/peripheral_battery/peripheral_battery.uvproj +++ b/examples/peripheral_battery/peripheral_battery.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_battery/peripheral_battery.uvprojx b/examples/peripheral_battery/peripheral_battery.uvprojx index c8b990db8..4a2b2b4ab 100644 --- a/examples/peripheral_battery/peripheral_battery.uvprojx +++ b/examples/peripheral_battery/peripheral_battery.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_battery/src/main.c b/examples/peripheral_battery/src/main.c index 42b876514..9d2e8b139 100644 --- a/examples/peripheral_battery/src/main.c +++ b/examples/peripheral_battery/src/main.c @@ -43,6 +43,7 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_TMR1)); // setup timer 1: 1sec timer TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / 2); diff --git a/examples/peripheral_console/peripheral_console.ingw b/examples/peripheral_console/peripheral_console.ingw index 994996a0a..d6e838ef3 100644 --- a/examples/peripheral_console/peripheral_console.ingw +++ b/examples/peripheral_console/peripheral_console.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x43, 0x6D, 0x64, \r\n\r\n\/\/ Service INGChips Generic I\/O Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 172\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=160\r\n", diff --git a/examples/peripheral_console/peripheral_console.uvproj b/examples/peripheral_console/peripheral_console.uvproj index 724f7d46d..fa34527a9 100644 --- a/examples/peripheral_console/peripheral_console.uvproj +++ b/examples/peripheral_console/peripheral_console.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_console/peripheral_console.uvprojx b/examples/peripheral_console/peripheral_console.uvprojx index c070c1c05..fdf8f7e45 100644 --- a/examples/peripheral_console/peripheral_console.uvprojx +++ b/examples/peripheral_console/peripheral_console.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_etag/peripheral_etag.ingw b/examples/peripheral_etag/peripheral_etag.ingw index 03d0541b8..021b85f1d 100644 --- a/examples/peripheral_etag/peripheral_etag.ingw +++ b/examples/peripheral_etag/peripheral_etag.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_ETAG_DATA", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x65, 0x54, 0x61, 0x67, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x04, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x16, 0x00, 0x04, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n\r\n0x00,0x00\r\n\/\/ total size = 164\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_ETAG_CONTROL=6\r\n\/\/ HANDLE_ETAG_DATA=8\r\n", diff --git a/examples/peripheral_etag/peripheral_etag.uvproj b/examples/peripheral_etag/peripheral_etag.uvproj index f85102275..e6e6d3848 100644 --- a/examples/peripheral_etag/peripheral_etag.uvproj +++ b/examples/peripheral_etag/peripheral_etag.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_etag/peripheral_etag.uvprojx b/examples/peripheral_etag/peripheral_etag.uvprojx index dbec1b926..989fb158f 100644 --- a/examples/peripheral_etag/peripheral_etag.uvprojx +++ b/examples/peripheral_etag/peripheral_etag.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_etag/src/main.c b/examples/peripheral_etag/src/main.c index a6d22711b..5e12383c1 100644 --- a/examples/peripheral_etag/src/main.c +++ b/examples/peripheral_etag/src/main.c @@ -50,6 +50,7 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_AHB_SPI0)); // for eTAG PINCTRL_SetPadMux(SPI_EPD_SDI, IO_SOURCE_SPI0_DO); diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw index 4648ed977..8ec780269 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -51,8 +51,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvoptx b/examples/peripheral_ibeacon/peripheral_ibeacon.uvoptx index df801f3f5..3f78a514f 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvoptx +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvoptx @@ -241,7 +241,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj index 8c6923d8b..85227e41c 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx index 2c4225b2f..4803a8353 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_ibeacon/src/main.c b/examples/peripheral_ibeacon/src/main.c index 565a6e55e..590f552f4 100644 --- a/examples/peripheral_ibeacon/src/main.c +++ b/examples/peripheral_ibeacon/src/main.c @@ -48,7 +48,7 @@ int app_main() { // If there are *three* crystals on board, *uncomment* below line. // Otherwise, below line should be kept commented out. - // platform_set_rf_clk_source(0); + platform_set_rf_clk_source(1); setup_peripherals(); diff --git a/examples/peripheral_irc/peripheral_irc.ingw b/examples/peripheral_irc/peripheral_irc.ingw index ff6fbef73..700cf9030 100644 --- a/examples/peripheral_irc/peripheral_irc.ingw +++ b/examples/peripheral_irc/peripheral_irc.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_irc/peripheral_irc.uvproj b/examples/peripheral_irc/peripheral_irc.uvproj index 3fca32fcf..659d0513d 100644 --- a/examples/peripheral_irc/peripheral_irc.uvproj +++ b/examples/peripheral_irc/peripheral_irc.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_irc/peripheral_irc.uvprojx b/examples/peripheral_irc/peripheral_irc.uvprojx index d519edbf3..880118cbc 100644 --- a/examples/peripheral_irc/peripheral_irc.uvprojx +++ b/examples/peripheral_irc/peripheral_irc.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_led/flash_download.ini b/examples/peripheral_led/flash_download.ini index 5ea69bdb3..76d7a1a33 100644 --- a/examples/peripheral_led/flash_download.ini +++ b/examples/peripheral_led/flash_download.ini @@ -6,7 +6,7 @@ entry=0x4000 set-entry=1 launch=1 batch=1 -batch.current=8 +batch.current=18 batch.limit=-1 UseScript=0 script= @@ -15,7 +15,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 -Checked=0 +Checked=1 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -36,7 +36,7 @@ Port=COM3 [main] timeout=10000 MIN_ADDR=16384 -MAX_ADDR=540672 +MAX_ADDR=540671 [bin-2] Name=Burn Bin #3 diff --git a/examples/peripheral_led/peripheral_led.ingw b/examples/peripheral_led/peripheral_led.ingw index 5c964b396..16521f188 100644 --- a/examples/peripheral_led/peripheral_led.ingw +++ b/examples/peripheral_led/peripheral_led.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x4C, 0x45, 0x44, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x02, 0x06, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 116\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=111\r\n", diff --git a/examples/peripheral_led/peripheral_led.uvoptx b/examples/peripheral_led/peripheral_led.uvoptx index b557bf78e..ce8964e17 100644 --- a/examples/peripheral_led/peripheral_led.uvoptx +++ b/examples/peripheral_led/peripheral_led.uvoptx @@ -145,7 +145,24 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) - + + + 0 + 0 + 64 + 1 +
156122
+ 0 + 0 + 0 + 0 + 0 + 1 + .\src\main.c + + \\peripheral_led\src/main.c\64 +
+
0 @@ -241,7 +258,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_led/peripheral_led.uvproj b/examples/peripheral_led/peripheral_led.uvproj index b8ed0d75b..9623edba4 100644 --- a/examples/peripheral_led/peripheral_led.uvproj +++ b/examples/peripheral_led/peripheral_led.uvproj @@ -1,10 +1,7 @@ - + - 1.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -15,27 +12,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -57,8 +54,8 @@ 0 0 - - + + 0 0 0 @@ -67,8 +64,8 @@ 0 0 - - + + 0 0 @@ -76,12 +73,12 @@ 1 0 fromelf.exe --bin -o peripheral_led.bin ./output/peripheral_led.axf - + 0 0 0 - + 0 @@ -95,16 +92,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -141,17 +138,17 @@ 0 1 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini BIN\UL2CM3.DLL @@ -168,7 +165,7 @@ 0 BIN\UL2CM3.DLL "" () - + @@ -200,7 +197,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -297,8 +294,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -322,8 +319,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -331,7 +328,7 @@ 0x0 - + 1 @@ -350,7 +347,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -364,10 +361,10 @@ 0 0 - - - - + + + + @@ -379,12 +376,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -458,5 +455,4 @@ -
diff --git a/examples/peripheral_led/peripheral_led.uvprojx b/examples/peripheral_led/peripheral_led.uvprojx index d0cee1345..e1b51f9d6 100644 --- a/examples/peripheral_led/peripheral_led.uvprojx +++ b/examples/peripheral_led/peripheral_led.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_led/src/impl_led.c b/examples/peripheral_led/src/impl_led.c index b7d531638..f0ddccf52 100644 --- a/examples/peripheral_led/src/impl_led.c +++ b/examples/peripheral_led/src/impl_led.c @@ -50,6 +50,8 @@ void set_led_color(uint8_t r, uint8_t g, uint8_t b) void setup_led() { + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_PWM)); PINCTRL_SetPadMux(PIN_SDI, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(PIN_SDI, 0); GIO_SetDirection(PIN_SDI, GIO_DIR_OUTPUT); @@ -90,6 +92,8 @@ static void setup_channel(uint8_t channel_index) void setup_led() { + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_PWM)); PINCTRL_SetPadMux(PIN_RED, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(PIN_RED, 1); PINCTRL_SetPadMux(PIN_GREEN, IO_SOURCE_GENERAL); diff --git a/examples/peripheral_led/src/main.c b/examples/peripheral_led/src/main.c index 40cd415f2..172e4b151 100644 --- a/examples/peripheral_led/src/main.c +++ b/examples/peripheral_led/src/main.c @@ -59,7 +59,7 @@ int app_main() sysSetPublicDeviceAddr((uint8_t *)0x2a100); // setup putc handle - // platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); + platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); return 0; diff --git a/examples/peripheral_led/src/profile.c b/examples/peripheral_led/src/profile.c index c3934c27b..75f9ea82c 100644 --- a/examples/peripheral_led/src/profile.c +++ b/examples/peripheral_led/src/profile.c @@ -127,7 +127,8 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin } uint32_t setup_profile(void *data, void *user_data) -{ +{ + platform_printf("setup profile\n"); att_server_init(att_read_callback, att_write_callback); hci_event_callback_registration.callback = &user_packet_handler; hci_add_event_handler(&hci_event_callback_registration); diff --git a/examples/peripheral_pedometer/peripheral_pedometer.ingw b/examples/peripheral_pedometer/peripheral_pedometer.ingw index ff2bf673b..d91618447 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.ingw +++ b/examples/peripheral_pedometer/peripheral_pedometer.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -51,8 +51,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x15, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x65, 0x64, 0x6F, \r\n0x6D, 0x65, 0x74, 0x65, 0x72, \r\n\/\/ Characteristic Appearance: 2A01\r\n0x0D, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x28,\r\n0x02, 0x05, 0x00, 0x01, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x2A,\r\n0x40, 0x04, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x08, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x03, 0x28,\r\n0x02, 0x0B, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 143\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_APPEARANCE=5\r\n\/\/ HANDLE_RSC_MEASUREMENT=8\r\n\/\/ HANDLE_RSC_FEATURE=11\r\n" diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvproj b/examples/peripheral_pedometer/peripheral_pedometer.uvproj index fa8ff2eb4..1fca14955 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvproj +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvproj @@ -1,10 +1,7 @@ - + - 1.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -15,27 +12,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -57,8 +54,8 @@ 0 0 - - + + 0 0 0 @@ -67,8 +64,8 @@ 0 0 - - + + 0 0 @@ -76,12 +73,12 @@ 1 0 fromelf.exe --bin -o peripheral_pedometer.bin ./output/peripheral_pedometer.axf - + 0 0 0 - + 0 @@ -95,16 +92,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -141,17 +138,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -168,7 +165,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -200,7 +197,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -297,8 +294,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -322,8 +319,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -331,7 +328,7 @@ 0x0 - + 1 @@ -350,7 +347,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -364,10 +361,10 @@ 0 0 - - - - + + + + @@ -379,12 +376,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -480,5 +477,4 @@ -
diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx index 714a788c3..f0c3cabfe 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o peripheral_pedometer.bin ./output/peripheral_pedometer.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -470,12 +467,11 @@ - - + @@ -483,5 +479,4 @@ -
diff --git a/examples/peripheral_pedometer/src/main.c b/examples/peripheral_pedometer/src/main.c index 8ebf3e7a5..de80c960f 100644 --- a/examples/peripheral_pedometer/src/main.c +++ b/examples/peripheral_pedometer/src/main.c @@ -50,6 +50,8 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_I2C0) + | (1 << SYSCTRL_ClkGate_APB_TMR1)); #ifndef SIMULATION PINCTRL_SetPadMux(6, IO_SOURCE_GENERAL); diff --git a/examples/peripheral_piano/peripheral_piano.ingw b/examples/peripheral_piano/peripheral_piano.ingw index bb0e351c0..0aa30be6e 100644 --- a/examples/peripheral_piano/peripheral_piano.ingw +++ b/examples/peripheral_piano/peripheral_piano.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_KEY_INPUT", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x11, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x69, 0x61, 0x6E, \r\n0x6F, \r\n\r\n\/\/ Service INGChips Piano Service: {00000002-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x02, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Key Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 115\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_KEY_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_KEY_INPUT_OFFSET=113\r\n", diff --git a/examples/peripheral_piano/peripheral_piano.uvproj b/examples/peripheral_piano/peripheral_piano.uvproj index a49369007..279fb40ee 100644 --- a/examples/peripheral_piano/peripheral_piano.uvproj +++ b/examples/peripheral_piano/peripheral_piano.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_piano/peripheral_piano.uvprojx b/examples/peripheral_piano/peripheral_piano.uvprojx index 560e9392c..39ed290f6 100644 --- a/examples/peripheral_piano/peripheral_piano.uvprojx +++ b/examples/peripheral_piano/peripheral_piano.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_piano/src/main.c b/examples/peripheral_piano/src/main.c index f2199e95a..a91ace0ca 100644 --- a/examples/peripheral_piano/src/main.c +++ b/examples/peripheral_piano/src/main.c @@ -66,6 +66,7 @@ void set_freq(uint16_t freq) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_PWM)); PINCTRL_SetPadMux(PIN_BUZZER, IO_SOURCE_GENERAL); PINCTRL_SetPadPwmSel(PIN_BUZZER, 1); diff --git a/examples/peripheral_throughput/peripheral_throughput.ingw b/examples/peripheral_throughput/peripheral_throughput.ingw index 9d7679fe0..dca58e080 100644 --- a/examples/peripheral_throughput/peripheral_throughput.ingw +++ b/examples/peripheral_throughput/peripheral_throughput.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x70, 0x74, \r\n\r\n\/\/ Service INGChips Throughput Service: {2445314a-a1d4-4874-b4d1-fdfb6f501485}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x85, 0x14, 0x50, 0x6F, 0xFB, 0xFD, 0xD1, 0xB4, \r\n0x74, 0x48, 0xD4, 0xA1, 0x4A, 0x31, 0x45, 0x24, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 113\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n", diff --git a/examples/peripheral_throughput/peripheral_throughput.uvproj b/examples/peripheral_throughput/peripheral_throughput.uvproj index 739d0f610..5d9cf4c50 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvproj +++ b/examples/peripheral_throughput/peripheral_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_throughput/peripheral_throughput.uvprojx b/examples/peripheral_throughput/peripheral_throughput.uvprojx index a0224a855..543feda4d 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvprojx +++ b/examples/peripheral_throughput/peripheral_throughput.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/peripheral_throughput/src/main.c b/examples/peripheral_throughput/src/main.c index f42d4e176..744a849bc 100644 --- a/examples/peripheral_throughput/src/main.c +++ b/examples/peripheral_throughput/src/main.c @@ -46,6 +46,8 @@ extern uint8_t loopback_mode; void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_PinCtrl)); PINCTRL_SetPadMux(KB_KEY_1, IO_SOURCE_GENERAL); GIO_SetDirection(KB_KEY_1, GIO_DIR_INPUT); loopback_mode = GIO_ReadValue(KB_KEY_1) ? 0 : 1; diff --git a/examples/secondary_fota/flash_download.ini b/examples/secondary_fota/flash_download.ini index cf192e98d..c574103f1 100644 --- a/examples/secondary_fota/flash_download.ini +++ b/examples/secondary_fota/flash_download.ini @@ -22,7 +22,7 @@ Checked=0 [bin-1] Name=Burn Bin #2 Checked=1 -Address=524288 +Address=532480 FileName=secondary_fota.bin [uart] diff --git a/examples/secondary_fota/secondary_fota.ingw b/examples/secondary_fota/secondary_fota.ingw index e29fbc039..f3761713f 100644 --- a/examples/secondary_fota/secondary_fota.ingw +++ b/examples/secondary_fota/secondary_fota.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131868, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -64,8 +64,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "1", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x1A, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x65, 0x63, 0x6F, \r\n0x6E, 0x64, 0x61, 0x72, 0x79, 0x20, 0x46, 0x4F, \r\n0x54, 0x41, \r\n\r\n\/\/ Service INGChips FOTA Service: {3345c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Version: {3345c2f1-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF1, \r\n0xC2, 0x45, 0x33, \r\n0x1E, 0x00, 0x02, 0x02, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF1, 0xC2, 0x45, 0x33, \r\n0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x28, 0x01, \r\n\/\/ Characteristic FOTA Control: {3345c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x06, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x06, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Data: {3345c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x04, 0x0A, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x04, 0x03, 0x0A, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x33, \r\n\r\n0x00,0x00\r\n\/\/ total size = 230\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_FOTA_VERSION=6\r\n\/\/ HANDLE_FOTA_CONTROL=8\r\n\/\/ HANDLE_FOTA_DATA=10\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_FOTA_VERSION_OFFSET=122\r\n\/\/ HANDLE_FOTA_CONTROL_OFFSET=179\r\n\/\/ HANDLE_FOTA_DATA_OFFSET=228\r\n", diff --git a/examples/secondary_fota/secondary_fota.uvproj b/examples/secondary_fota/secondary_fota.uvproj index ad87fd393..b236588a4 100644 --- a/examples/secondary_fota/secondary_fota.uvproj +++ b/examples/secondary_fota/secondary_fota.uvproj @@ -1,10 +1,7 @@ - + - 1.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -15,27 +12,27 @@ ING91800 INGCHIPS CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -57,8 +54,8 @@ 0 0 - - + + 0 0 0 @@ -67,8 +64,8 @@ 0 0 - - + + 0 0 @@ -76,12 +73,12 @@ 1 0 fromelf.exe --bin -o secondary_fota.bin ./output/secondary_fota.axf - + 0 0 0 - + 0 @@ -95,16 +92,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -141,17 +138,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -168,7 +165,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -200,7 +197,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -322,8 +319,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -331,7 +328,7 @@ 0x0 - + 1 @@ -350,7 +347,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -364,10 +361,10 @@ 0 0 - - - - + + + + @@ -379,12 +376,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -448,5 +445,4 @@ -
diff --git a/examples/secondary_fota/secondary_fota.uvprojx b/examples/secondary_fota/secondary_fota.uvprojx index 6b3ecb970..f606ed0a2 100644 --- a/examples/secondary_fota/secondary_fota.uvprojx +++ b/examples/secondary_fota/secondary_fota.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o secondary_fota.bin ./output/secondary_fota.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -297,8 +294,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -438,12 +435,11 @@ - - + @@ -451,5 +447,4 @@ -
diff --git a/examples/smart_meter/smart_meter.ingw b/examples/smart_meter/smart_meter.ingw index 71cff3c0b..a0462772a 100644 --- a/examples/smart_meter/smart_meter.ingw +++ b/examples/smart_meter/smart_meter.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -55,8 +55,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x17, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x6D, 0x61, 0x72, \r\n0x74, 0x20, 0x4D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n\/\/ Service INGChips Console Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 180\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=119\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=168\r\n", diff --git a/examples/smart_meter/smart_meter.uvproj b/examples/smart_meter/smart_meter.uvproj index bc8bb8cf3..583325ba6 100644 --- a/examples/smart_meter/smart_meter.uvproj +++ b/examples/smart_meter/smart_meter.uvproj @@ -1,10 +1,7 @@ - + - 1.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -15,27 +12,27 @@ ING91800 INGCHIPS CLOCK(48000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - - + + + + + + + + + + + 0 - - - - - + + + + + 0 0 @@ -57,8 +54,8 @@ 0 0 - - + + 0 0 0 @@ -67,8 +64,8 @@ 0 0 - - + + 0 0 @@ -76,12 +73,12 @@ 1 0 fromelf.exe --bin -o smart_meter.bin ./output/smart_meter.axf - + 0 0 0 - + 0 @@ -95,16 +92,16 @@ 0 0 3 - - + + SARMCM3.DLL - + DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -141,17 +138,17 @@ 0 7 - - - - + + + + ..\map.ini - - - - + + + + .\init.ini Segger\JL2CM3.dll @@ -168,7 +165,7 @@ 1 BIN\UL2CM3.DLL "" () - + @@ -200,7 +197,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -297,8 +294,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -322,8 +319,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -331,7 +328,7 @@ 0x0 - + 1 @@ -350,7 +347,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -364,10 +361,10 @@ 0 0 - - - - + + + + @@ -379,12 +376,12 @@ 0 0x00000000 0x00000000 - - - - - - + + + + + + @@ -470,5 +467,4 @@ -
diff --git a/examples/smart_meter/smart_meter.uvprojx b/examples/smart_meter/smart_meter.uvprojx index a89f940eb..0e6be869b 100644 --- a/examples/smart_meter/smart_meter.uvprojx +++ b/examples/smart_meter/smart_meter.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/smart_meter/src/main.c b/examples/smart_meter/src/main.c index 3b885dcd9..a2d780b62 100644 --- a/examples/smart_meter/src/main.c +++ b/examples/smart_meter/src/main.c @@ -91,6 +91,7 @@ uint32_t uart_isr(void *user_data) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 921600); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_TMR1)); // timer 0 can be used as watchdog, so we use timer 1. // setup timer 1 to sampling rate TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / 50); diff --git a/examples/thermo_ota/src/main.c b/examples/thermo_ota/src/main.c index 2c03384f1..b6d43fe71 100644 --- a/examples/thermo_ota/src/main.c +++ b/examples/thermo_ota/src/main.c @@ -63,6 +63,7 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_I2C0)); #ifndef SIMULATION PINCTRL_SetPadMux(6, IO_SOURCE_GENERAL); diff --git a/examples/thermo_ota/thermo_ota.ingw b/examples/thermo_ota/thermo_ota.ingw index 657b108c2..36f14dd4f 100644 --- a/examples/thermo_ota/thermo_ota.ingw +++ b/examples/thermo_ota/thermo_ota.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -32,6 +32,6 @@ "app_rom_addr": "155648", "arm_inc": "C:\/keil\/ARM\/ARMCC\/include", "cmsis": "", - "app_ram_size": 25712, - "app_ram_addr": 536910736 + "app_ram_size": 25784, + "app_ram_addr": 536910664 } \ No newline at end of file diff --git a/examples/thermo_ota/thermo_ota.uvproj b/examples/thermo_ota/thermo_ota.uvproj index e9b6df8aa..dea41b297 100644 --- a/examples/thermo_ota/thermo_ota.uvproj +++ b/examples/thermo_ota/thermo_ota.uvproj @@ -332,8 +332,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/thermo_ota/thermo_ota.uvprojx b/examples/thermo_ota/thermo_ota.uvprojx index 8f7987bb1..3de6b82f1 100644 --- a/examples/thermo_ota/thermo_ota.uvprojx +++ b/examples/thermo_ota/thermo_ota.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o thermo_ota.bin ./output/thermo_ota.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -467,12 +464,11 @@ - - + @@ -480,5 +476,4 @@ -
diff --git a/examples/uart_console/uart_console.ingw b/examples/uart_console/uart_console.ingw index 5f4b3248f..a1bf3d32e 100644 --- a/examples/uart_console/uart_console.ingw +++ b/examples/uart_console/uart_console.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_DEVICE_NAME", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x14, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x55, 0x41, 0x52, 0x54, 0x20, 0x43, 0x6F, 0x6E, \r\n0x73, 0x6F, 0x6C, 0x65, \r\n\r\n0x00,0x00\r\n\/\/ total size = 45\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n", diff --git a/examples/uart_console/uart_console.uvproj b/examples/uart_console/uart_console.uvproj index 8d91fc66f..0d826e23f 100644 --- a/examples/uart_console/uart_console.uvproj +++ b/examples/uart_console/uart_console.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/uart_console/uart_console.uvprojx b/examples/uart_console/uart_console.uvprojx index 2b9bf9263..d6144d41e 100644 --- a/examples/uart_console/uart_console.uvprojx +++ b/examples/uart_console/uart_console.uvprojx @@ -294,8 +294,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/voice_remote_ctrl/src/main.c b/examples/voice_remote_ctrl/src/main.c index 067ca0001..16b223c74 100644 --- a/examples/voice_remote_ctrl/src/main.c +++ b/examples/voice_remote_ctrl/src/main.c @@ -54,6 +54,8 @@ void setup_peripherals(void) config_uart(OSC_CLK_FREQ, 115200); PINCTRL_DisableAllInputs(); + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) + | (1 << SYSCTRL_ClkGate_APB_TMR1)); // timer 0 can be used as watchdog, so we use timer 1. // setup timer 1 to sampling rate diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw index d795d25f8..798252444 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 131796, + "size": 132756, "base": 16384 }, "ram": { - "size": 30528, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_config","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,15,0] + 1,0,0] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_VOICE_CONTROL", - "app_ram_size": 25712, - "app_ram_addr": 536910736, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x20, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x56, 0x6F, 0x69, 0x63, \r\n0x65, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, \r\n0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, \r\n\r\n\/\/ Service INGChips Voice Output Service: {00000001-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x01, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Voice Control: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Voice Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 189\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_VOICE_CONTROL=6\r\n\/\/ HANDLE_VOICE_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_VOICE_CONTROL_OFFSET=128\r\n\/\/ HANDLE_VOICE_OUTPUT_OFFSET=177\r\n", diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj index a78b805e3..9b270a571 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj @@ -319,8 +319,8 @@ 0 - 536910736 - 25712 + 536910664 + 25784 0 diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx index 63856da5f..45ae33315 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o voice_remote_ctrl.bin ./output/voice_remote_ctrl.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009b90 - 0x6470 + 536910664 + 25784 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER,DEV_BOARD - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -490,12 +487,11 @@ - - + @@ -503,5 +499,4 @@ -
diff --git a/src/FWlib/peripheral_adc.c b/src/FWlib/peripheral_adc.c index d46d11995..e1492d657 100644 --- a/src/FWlib/peripheral_adc.c +++ b/src/FWlib/peripheral_adc.c @@ -13,13 +13,8 @@ uint8_t adc_get_power_state(void) void ADC_PowerCtrl(const uint8_t flag) { -#ifdef TARGET_V2 #define ADC_PON 0x3 #define ADC_PON_STATE ADC_PON -#else -#define ADC_PON 0x1 -#define ADC_PON_STATE 0x2 -#endif #define ADC_POFF ((~ADC_PON) & ADC_POW_MASK) #define ADC_POFF_STATE ((~ADC_PON_STATE) & ADC_POW_MASK) diff --git a/src/FWlib/peripheral_gpio.c b/src/FWlib/peripheral_gpio.c index 1306ac09c..ab7e681c5 100644 --- a/src/FWlib/peripheral_gpio.c +++ b/src/FWlib/peripheral_gpio.c @@ -1,5 +1,6 @@ #include "peripheral_gpio.h" +#define GPIO_PIN_IE0 ((__IO uint32_t *)(APB_PINC_BASE + 0x00)) #define GPIO_PIN_PE0 ((__IO uint32_t *)(APB_PINC_BASE + 0x10)) #define GPIO_PIN_PS0 ((__IO uint32_t *)(APB_PINC_BASE + 0x18)) #define GPIO_PIN_DS00 ((__IO uint32_t *)(APB_PINC_BASE + 0x28)) @@ -14,6 +15,8 @@ static void GIO_MaskedWrite(__IO uint32_t *reg, const uint8_t index, const uint8 void GIO_SetDirection(const GIO_Index_t io_index, const GIO_Direction_t dir) { GIO_MaskedWrite(GPIO_OEB, io_index, dir); + if (GIO_DIR_INPUT == dir) + GIO_MaskedWrite(GPIO_PIN_IE0, io_index, 0); } GIO_Direction_t GIO_GetDirection(const GIO_Index_t io_index) diff --git a/src/FWlib/peripheral_pinctrl.c b/src/FWlib/peripheral_pinctrl.c index 10b68d0f8..3bfba511f 100644 --- a/src/FWlib/peripheral_pinctrl.c +++ b/src/FWlib/peripheral_pinctrl.c @@ -49,8 +49,6 @@ static int PINCTRL_AntSelIndex(const uint8_t io_pin_index) return -1; } -#define ANT_BITS ((1 << 8) | (1 << 8) | (1 << 8) | (1 << 8) | (1 << 8) | (1 << 8) | (1 << 8) | - void PINCTRL_SetGeneralPadMode(const uint8_t io_pin_index, const gio_mode_t mode, const uint8_t pwm_channel, const uint8_t pwm_neg) { diff --git a/src/FWlib/peripheral_sysctrl.c b/src/FWlib/peripheral_sysctrl.c index 48bf3cb97..86ae237c2 100644 --- a/src/FWlib/peripheral_sysctrl.c +++ b/src/FWlib/peripheral_sysctrl.c @@ -10,6 +10,16 @@ void SYSCTRL_ClearClkGate(SYSCTRL_ClkGateItem item) AHB_SYSCTRL->SYSCTRL_ClkGate |= (1 << item); } +void SYSCTRL_SetClkGateMulti(uint32_t items) +{ + AHB_SYSCTRL->SYSCTRL_ClkGate &= ~items; +} + +void SYSCTRL_ClearClkGateMulti(uint32_t items) +{ + AHB_SYSCTRL->SYSCTRL_ClkGate |= items; +} + void SYSCTRL_WriteClkGate(uint32_t data) { AHB_SYSCTRL->SYSCTRL_ClkGate = data; diff --git a/src/FWlib/peripheral_sysctrl.h b/src/FWlib/peripheral_sysctrl.h index ccd569557..a87204e1d 100644 --- a/src/FWlib/peripheral_sysctrl.h +++ b/src/FWlib/peripheral_sysctrl.h @@ -9,28 +9,18 @@ extern "C" { /* allow C++ to use these headers */ typedef enum { - SYSCTRL_ClkGate_AHB_DMA = 0, - SYSCTRL_ClkGate_AHB_LLE = 1, - SYSCTRL_ClkGate_AHB_IOC = 2, - SYSCTRL_ClkGate_AHB_WDT = 3, SYSCTRL_ClkGate_APB_I2C0 = 4, SYSCTRL_ClkGate_APB_SPI1 = 5, SYSCTRL_ClkGate_APB_TMR0 = 6, SYSCTRL_ClkGate_APB_TMR1 = 7, SYSCTRL_ClkGate_APB_TMR2 = 8, - SYSCTRL_ClkGate_APB_SCI0 = 9, - SYSCTRL_ClkGate_APB_SCI1 = 10, - SYSCTRL_ClkGate_APB_ISOL = 11, - SYSCTRL_ClkGate_RtcClkDect = 12, - SYSCTRL_ClkGate_APB_GPIOA = 13, - SYSCTRL_ClkGate_APB_GPIOB = 14, - SYSCTRL_ClkGate_APB_GPIOC = 15, + SYSCTRL_ClkGate_APB_UART0 = 9, + SYSCTRL_ClkGate_APB_UART1 = 10, + SYSCTRL_ClkGate_APB_GPIO = 13, SYSCTRL_ClkGate_APB_PWM = 16, SYSCTRL_ClkGate_AHB_SPI0 = 17, SYSCTRL_ClkGate_APB_PinCtrl = 18, - SYSCTRL_ClkGate_APB_I2C1 = 19, - SYSCTRL_ClkGate_APB_TRNG = 20, - SYSCTRL_ClkGate_SysClkOut = 21 + SYSCTRL_ClkGate_APB_I2C1 = 19 } SYSCTRL_ClkGateItem; /** @@ -45,6 +35,18 @@ void SYSCTRL_SetClkGate(SYSCTRL_ClkGateItem item); */ void SYSCTRL_ClearClkGate(SYSCTRL_ClkGateItem item); +/** + * \brief Set clock gating state of several components + * \param items the bitmap of components to enable clock gating + */ +void SYSCTRL_SetClkGateMulti(uint32_t items); + +/** + * \brief Clear clock gating state of several components + * \param items the bitmap of components to clear clock gating + */ +void SYSCTRL_ClearClkGateMulti(uint32_t items); + /** * \brief Set clock gating state of all components * \param data clock gating state of each component diff --git a/src/FWlib/peripheral_sysctrl.nim b/src/FWlib/peripheral_sysctrl.nim index cd10d9921..8c264f112 100644 --- a/src/FWlib/peripheral_sysctrl.nim +++ b/src/FWlib/peripheral_sysctrl.nim @@ -3,17 +3,12 @@ import type SYSCTRL_ClkGateItem* {.size: sizeof(cint).} = enum - SYSCTRL_ClkGate_AHB_DMA = 0, SYSCTRL_ClkGate_AHB_LLE = 1, - SYSCTRL_ClkGate_AHB_IOC = 2, SYSCTRL_ClkGate_AHB_WDT = 3, SYSCTRL_ClkGate_APB_I2C0 = 4, SYSCTRL_ClkGate_APB_SPI1 = 5, SYSCTRL_ClkGate_APB_TMR0 = 6, SYSCTRL_ClkGate_APB_TMR1 = 7, - SYSCTRL_ClkGate_APB_TMR2 = 8, SYSCTRL_ClkGate_APB_SCI0 = 9, - SYSCTRL_ClkGate_APB_SCI1 = 10, SYSCTRL_ClkGate_APB_ISOL = 11, - SYSCTRL_ClkGate_RtcClkDect = 12, SYSCTRL_ClkGate_APB_GPIOA = 13, - SYSCTRL_ClkGate_APB_GPIOB = 14, SYSCTRL_ClkGate_APB_GPIOC = 15, + SYSCTRL_ClkGate_APB_TMR2 = 8, SYSCTRL_ClkGate_APB_UART0 = 9, + SYSCTRL_ClkGate_APB_UART1 = 10, SYSCTRL_ClkGate_APB_GPIO = 13, SYSCTRL_ClkGate_APB_PWM = 16, SYSCTRL_ClkGate_AHB_SPI0 = 17, - SYSCTRL_ClkGate_APB_PinCtrl = 18, SYSCTRL_ClkGate_APB_I2C1 = 19, - SYSCTRL_ClkGate_APB_TRNG = 20, SYSCTRL_ClkGate_SysClkOut = 21 + SYSCTRL_ClkGate_APB_PinCtrl = 18, SYSCTRL_ClkGate_APB_I2C1 = 19 ## * @@ -31,6 +26,20 @@ proc SYSCTRL_SetClkGate*(item: SYSCTRL_ClkGateItem) {. proc SYSCTRL_ClearClkGate*(item: SYSCTRL_ClkGateItem) {. importc: "SYSCTRL_ClearClkGate", header: "peripheral_sysctrl.h".} ## * +## \brief Set clock gating state of several components +## \param items the bitmap of components to enable clock gating +## + +proc SYSCTRL_SetClkGateMulti*(items: uint32) {.importc: "SYSCTRL_SetClkGateMulti", + header: "peripheral_sysctrl.h".} +## * +## \brief Clear clock gating state of several components +## \param items the bitmap of components to clear clock gating +## + +proc SYSCTRL_ClearClkGateMulti*(items: uint32) {. + importc: "SYSCTRL_ClearClkGateMulti", header: "peripheral_sysctrl.h".} +## * ## \brief Set clock gating state of all components ## \param data clock gating state of each component ## From 449117a521a7d1da187eb0fbe274a9d46cbaf9e6 Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Wed, 15 Jul 2020 14:42:29 +0800 Subject: [PATCH 09/10] 3.0.0 rc2 --- bundles/mesh/ING9188xx/meta.json | 214 ++---- bundles/mesh/ING9188xx/platform.bin | Bin 258236 -> 134688 bytes bundles/mesh/ING9188xx/symdefs.g | 593 +++++++-------- bundles/mesh/ING9188xx/symdefs.i | 593 +++++++-------- bundles/mesh/ING9188xx/symdefs.m | 593 +++++++-------- bundles/mesh/ING9188xx/symdefs.s | 593 +++++++-------- bundles/mesh/inc/gatt_client.h | 245 +++--- bundles/mesh/inc/kv_storage.h | 39 +- .../mesh/inc/os/portable/IAR/ARM_CM3/port.c | 619 --------------- .../mesh/inc/os/portable/RVDS/ARM_CM3/port.c | 698 ----------------- bundles/typical/ING9188xx/meta.json | 11 +- bundles/typical/ING9188xx/platform.bin | Bin 132292 -> 133824 bytes bundles/typical/ING9188xx/symdefs.g | 529 ++++++------- bundles/typical/ING9188xx/symdefs.i | 529 ++++++------- bundles/typical/ING9188xx/symdefs.m | 529 ++++++------- bundles/typical/ING9188xx/symdefs.s | 529 ++++++------- bundles/typical/inc/kv_storage.h | 8 +- .../inc/os/portable/GCC/ARM_CM3/port.c | 717 ------------------ .../inc/os/portable/IAR/ARM_CM3/port.c | 619 --------------- .../inc/os/portable/IAR/ARM_CM3/portasm.s | 103 --- .../inc/os/portable/RVDS/ARM_CM3/port.c | 698 ----------------- bundles/typical/inc/os/task.h | 8 +- bundles/typical/inc/platform_api.h | 8 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_ibeacon/peripheral_ibeacon.ld | 2 +- .../peripheral_ibeacon/generic_cortex.icf | 6 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_battery.ingw | 12 +- .../peripheral_battery/peripheral_battery.ld | 2 +- .../smart_home_hub/smart_home_hub.ingw | 12 +- examples-nim/smart_home_hub/smart_home_hub.ld | 2 +- .../peripheral_ibeacon/peripheral_ibeacon.hzp | 2 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_ibeacon.emProject | 2 +- .../peripheral_ibeacon.ingw | 12 +- examples/anti_lost_mas/anti_lost_mas.ingw | 12 +- examples/anti_lost_mas/anti_lost_mas.uvproj | 4 +- examples/anti_lost_mas/anti_lost_mas.uvprojx | 4 +- examples/anti_lost_sla/anti_lost_sla.ingw | 12 +- examples/anti_lost_sla/anti_lost_sla.uvproj | 4 +- examples/anti_lost_sla/anti_lost_sla.uvprojx | 4 +- .../central_throughput.ingw | 12 +- .../central_throughput.uvproj | 4 +- .../central_throughput.uvprojx | 4 +- .../central_throughput/flash_download.ini | 4 +- examples/hid_keyboard/hid_keyboard.ingw | 12 +- examples/hid_keyboard/hid_keyboard.uvproj | 4 +- examples/hid_keyboard/hid_keyboard.uvprojx | 105 ++- examples/hid_mouse/hid_mouse.ingw | 12 +- examples/hid_mouse/hid_mouse.uvproj | 4 +- examples/hid_mouse/hid_mouse.uvprojx | 4 +- examples/ibeacon_scanner/ibeacon_scanner.ingw | 12 +- .../ibeacon_scanner/ibeacon_scanner.uvproj | 4 +- .../ibeacon_scanner/ibeacon_scanner.uvprojx | 4 +- examples/io_over_ble_mas/io_over_ble_mas.ingw | 12 +- .../io_over_ble_mas/io_over_ble_mas.uvproj | 4 +- .../io_over_ble_mas/io_over_ble_mas.uvprojx | 4 +- examples/io_over_ble_sla/io_over_ble_sla.ingw | 12 +- .../io_over_ble_sla/io_over_ble_sla.uvproj | 4 +- .../io_over_ble_sla/io_over_ble_sla.uvprojx | 4 +- examples/mesh-light/flash_download.ini | 2 +- examples/mesh-light/mesh-light.ingw | 20 +- examples/mesh-light/mesh-light.uvoptx | 14 +- examples/mesh-light/mesh-light.uvproj | 8 +- examples/mesh-light/mesh-light.uvprojx | 15 +- .../periodic_advertiser.ingw | 12 +- .../periodic_advertiser.uvproj | 4 +- .../periodic_advertiser.uvprojx | 4 +- .../periodic_scanner/periodic_scanner.ingw | 12 +- .../periodic_scanner/periodic_scanner.uvproj | 4 +- .../periodic_scanner/periodic_scanner.uvprojx | 4 +- .../peripheral_all_in_one.ingw | 12 +- .../peripheral_all_in_one.uvproj | 4 +- .../peripheral_all_in_one.uvprojx | 4 +- examples/peripheral_ancs/flash_download.ini | 2 +- examples/peripheral_ancs/peripheral_ancs.ingw | 12 +- .../peripheral_ancs/peripheral_ancs.uvproj | 4 +- .../peripheral_ancs/peripheral_ancs.uvprojx | 4 +- examples/peripheral_band/peripheral_band.ingw | 12 +- .../peripheral_band/peripheral_band.uvproj | 4 +- .../peripheral_band/peripheral_band.uvprojx | 4 +- .../peripheral_battery.ingw | 12 +- .../peripheral_battery.uvproj | 4 +- .../peripheral_battery.uvprojx | 4 +- .../peripheral_console/flash_download.ini | 2 +- .../peripheral_console.ingw | 12 +- .../peripheral_console.uvoptx | 14 +- .../peripheral_console.uvproj | 4 +- .../peripheral_console.uvprojx | 4 +- examples/peripheral_console/src/main.c | 24 +- examples/peripheral_console/src/profile.c | 3 +- examples/peripheral_etag/peripheral_etag.ingw | 12 +- .../peripheral_etag/peripheral_etag.uvproj | 4 +- .../peripheral_etag/peripheral_etag.uvprojx | 4 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_ibeacon.uvproj | 4 +- .../peripheral_ibeacon.uvprojx | 4 +- examples/peripheral_irc/flash_download.ini | 2 +- examples/peripheral_irc/peripheral_irc.ingw | 12 +- examples/peripheral_irc/peripheral_irc.uvproj | 4 +- .../peripheral_irc/peripheral_irc.uvprojx | 4 +- examples/peripheral_led/peripheral_led.ingw | 12 +- examples/peripheral_led/peripheral_led.uvproj | 4 +- .../peripheral_led/peripheral_led.uvprojx | 4 +- .../peripheral_pedometer.ingw | 12 +- .../peripheral_pedometer.uvproj | 4 +- .../peripheral_pedometer.uvprojx | 4 +- .../peripheral_piano/peripheral_piano.ingw | 12 +- .../peripheral_piano/peripheral_piano.uvproj | 4 +- .../peripheral_piano/peripheral_piano.uvprojx | 4 +- .../peripheral_throughput/flash_download.ini | 6 +- .../peripheral_throughput.ingw | 12 +- .../peripheral_throughput.uvoptx | 19 +- .../peripheral_throughput.uvproj | 4 +- .../peripheral_throughput.uvprojx | 4 +- examples/secondary_fota/secondary_fota.ingw | 12 +- examples/secondary_fota/secondary_fota.uvopt | 24 +- examples/secondary_fota/secondary_fota.uvproj | 6 +- .../secondary_fota/secondary_fota.uvprojx | 6 +- examples/smart_meter/smart_meter.ingw | 12 +- examples/smart_meter/smart_meter.uvproj | 4 +- examples/smart_meter/smart_meter.uvprojx | 4 +- examples/thermo_ota/flash_download.ini | 10 +- examples/thermo_ota/src/profilestask.c | 17 +- examples/thermo_ota/thermo_ota.ingw | 12 +- examples/thermo_ota/thermo_ota.uvoptx | 90 ++- examples/thermo_ota/thermo_ota.uvproj | 4 +- examples/thermo_ota/thermo_ota.uvprojx | 4 +- examples/uart_console/uart_console.ingw | 12 +- examples/uart_console/uart_console.uvproj | 4 +- examples/uart_console/uart_console.uvprojx | 4 +- .../voice_remote_ctrl/voice_remote_ctrl.ingw | 12 +- .../voice_remote_ctrl.uvproj | 4 +- .../voice_remote_ctrl.uvprojx | 4 +- src/Tools/ota_service.c | 65 +- src/Tools/ota_service.h | 3 +- src/Tools/trace.c | 10 +- 137 files changed, 2967 insertions(+), 6595 deletions(-) delete mode 100644 bundles/mesh/inc/os/portable/IAR/ARM_CM3/port.c delete mode 100644 bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c delete mode 100644 bundles/typical/inc/os/portable/GCC/ARM_CM3/port.c delete mode 100644 bundles/typical/inc/os/portable/IAR/ARM_CM3/port.c delete mode 100644 bundles/typical/inc/os/portable/IAR/ARM_CM3/portasm.s delete mode 100644 bundles/typical/inc/os/portable/RVDS/ARM_CM3/port.c diff --git a/bundles/mesh/ING9188xx/meta.json b/bundles/mesh/ING9188xx/meta.json index 814f14407..0193cce16 100644 --- a/bundles/mesh/ING9188xx/meta.json +++ b/bundles/mesh/ING9188xx/meta.json @@ -20,18 +20,14 @@ "gatt_client_discover_primary_services", "gatt_client_discover_primary_services_by_uuid16", "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_discover_characteristics_for_service", "gatt_client_find_included_services_for_service", + "gatt_client_discover_characteristics_for_service", "gatt_client_discover_characteristics_for_handle_range_by_uuid16", "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristics_for_service_by_uuid16", - "gatt_client_discover_characteristics_for_service_by_uuid128", "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic", "gatt_client_read_value_of_characteristic_using_value_handle", "gatt_client_read_value_of_characteristics_by_uuid16", "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic", "gatt_client_read_long_value_of_characteristic_using_value_handle", "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", "gatt_client_read_multiple_characteristic_values", @@ -41,25 +37,16 @@ "gatt_client_write_long_value_of_characteristic", "gatt_client_write_long_value_of_characteristic_with_offset", "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor", "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor", "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor", "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor", "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", "gatt_client_write_client_characteristic_configuration", "gatt_client_prepare_write", "gatt_client_execute_write", "gatt_client_cancel_write", - "gatt_client_deserialize_service", - "gatt_client_deserialize_characteristic", - "gatt_client_deserialize_characteristic_descriptor", - "ble_gatts_find_svc", - "ble_gatts_find_chr", "gatt_client_get_mtu", "gatt_client_is_ready", "gatt_client_listen_for_characteristic_value_updates", @@ -67,8 +54,14 @@ "gatt_client_pts_suppress_mtu_exchange", "gap_set_random_device_address", "gap_disconnect", + "gap_disconnect_all", "gap_add_whitelist", "gap_remove_whitelist", + "gap_clear_white_lists", + "gap_read_rssi", + "gap_read_remote_used_features", + "gap_read_remote_info", + "gap_le_read_channel_map", "gap_read_phy", "gap_set_def_phy", "gap_set_phy", @@ -93,6 +86,19 @@ "gap_read_periodic_adv_list_size", "gap_ext_create_connection", "gap_create_connection_cancel", + "gap_set_connectionless_cte_tx_param", + "gap_set_connectionless_cte_tx_enable", + "gap_set_connectionless_iq_sampling_enable", + "gap_set_connection_cte_rx_param", + "gap_set_connection_cte_tx_param", + "gap_set_connection_cte_request_enable", + "gap_set_connection_cte_response_enable", + "gap_read_antenna_info", + "gap_set_periodic_adv_rx_enable", + "gap_periodic_adv_sync_transfer", + "gap_periodic_adv_set_info_transfer", + "gap_periodic_adv_sync_transfer_param", + "gap_default_periodic_adv_sync_transfer_param", "gap_set_host_channel_classification", "gap_update_connection_parameters", "gap_get_connection_parameter_range", @@ -106,13 +112,24 @@ "platform_set_irq_callback", "platform_get_version", "platform_raise_assertion", - "sysSetPublicDeviceAddr", + "platform_get_heap_status", + "platform_reset", + "platform_switch_app", + "platform_write_persistent_reg", + "platform_read_persistent_reg", "platform_config", "platform_shutdown", + "platform_hrng", "platform_printf", + "sysSetPublicDeviceAddr", "platform_set_rf_clk_source", "platform_set_rf_init_data", "platform_set_rf_power_mapping", + "platform_patch_rf_init_data", + "ll_set_adv_coded_scheme", + "ll_set_initiating_coded_scheme", + "ll_hint_on_ce_len", + "ll_set_def_antenna", "big_endian_read_16", "big_endian_read_32", "big_endian_store_16", @@ -140,9 +157,25 @@ "l2cap_request_can_send_fix_channel_now_event", "l2cap_send_connectionless", "l2cap_send_connectionless3", + "l2cap_le_send_flow_control_credit", + "l2cap_send_echo_request", + "l2cap_require_security_level_2_for_outgoing_sdp", "l2cap_init", + "l2cap_register_packet_handler", + "l2cap_max_mtu", "l2cap_max_le_mtu", + "l2cap_create_channel", + "l2cap_disconnect", + "l2cap_get_remote_mtu_for_local_cid", + "l2cap_send", + "l2cap_register_service", + "l2cap_unregister_service", + "l2cap_can_send_packet_now", + "l2cap_request_can_send_now_event", + "l2cap_request_connection_parameter_update", "l2cap_send_signaling_le", + "l2cap_next_sig_id", + "l2cap_next_local_cid", "sm_config", "sm_add_event_handler", "sm_private_random_address_generation_set_mode", @@ -173,135 +206,34 @@ "kv_value_modified", "kv_commit", "kv_visit", - "kv_value_append", - "kv_value_trunc", - "mesh_setup", - "mesh_set_dev_name", - "mesh_platform_config", - "_os_mbuf_leadingspace", - "_os_mbuf_trailingspace", - "os_mqueue_init", - "os_mqueue_get", - "os_mqueue_put", - "os_msys_register", - "os_msys_get", - "os_msys_reset", - "os_msys_get_pkthdr", - "os_msys_count", - "os_msys_num_free", - "os_mbuf_pool_init", - "os_mbuf_get", - "os_mbuf_get_pkthdr", - "os_mbuf_dup", - "os_mbuf_off", - "os_mbuf_copydata", - "os_mbuf_append", - "os_mbuf_appendfrom", - "os_mbuf_free", - "os_mbuf_free_chain", - "os_mbuf_adj", - "os_mbuf_cmpf", - "os_mbuf_cmpm", - "os_mbuf_prepend", - "os_mbuf_prepend_pullup", - "os_mbuf_copyinto", - "os_mbuf_concat", - "os_mbuf_extend", - "os_mbuf_pullup", - "os_mbuf_trim_front", - "NET_BUF_SIMPLE", - "net_buf_simple_init", - "net_buf_put", - "net_buf_ref", - "net_buf_unref", - "net_buf_simple_pull_le16", - "net_buf_simple_pull_be16", - "net_buf_simple_pull_be32", - "net_buf_simple_pull_le32", - "net_buf_simple_pull_u8", - "net_buf_simple_add_le16", - "net_buf_simple_add_be16", - "net_buf_simple_add_u8", - "net_buf_simple_add_be32", - "net_buf_simple_add_le32", - "net_buf_add_zeros", - "net_buf_simple_push_le16", - "net_buf_simple_push_be16", - "net_buf_simple_push_u8", - "net_buf_simple_pull", - "net_buf_simple_add", - "k_fifo_is_empty", - "net_buf_get", - "net_buf_simple_push", - "net_buf_reserve", - "bt_dh_key_gen", - "bt_pub_key_gen", - "bt_pub_key_get", - "bt_rand", - "bt_hex", - "bt_encrypt_be", - "bt_le_adv_start", - "bt_le_adv_stop", - "k_work_init", - "k_delayed_work_init", - "k_delayed_work_cancel", - "k_delayed_work_submit", - "k_uptime_get", - "k_uptime_get_32", - "k_sleep", - "k_work_submit", - "k_work_add_arg", - "k_delayed_work_add_arg", - "k_delayed_work_remaining_get", - "net_buf_simple_save", - "net_buf_simple_restore", - "sys_memcpy_swap", - "MYNEWT_VAL_BLE_MESH_GATT_PROXY", - "k_sem_take", - "net_buf_slist_init", - "net_buf_slist_is_empty", - "net_buf_slist_peek_head", - "net_buf_slist_peek_next", - "net_buf_slist_get", - "net_buf_slist_put", - "net_buf_slist_remove", - "net_buf_slist_merge_slist", - "settings_bytes_from_str", - "settings_str_from_bytes", - "PB_ADV_config", - "le_adv_status_reset", - "bt_mesh_model_msg_init", - "bt_mesh_model_send", - "bt_mesh_model_publish", - "bt_mesh_model_elem", - "bt_mesh_input_string", - "bt_mesh_input_number", - "bt_mesh_prov_enable", - "bt_mesh_prov_disable", - "bt_mesh_init", - "bt_mesh_reset", - "bt_mesh_provision", - "bt_mesh_is_provisioned", - "ble_npl_callout_init", - "npl_freertos_eventq_get", - "npl_freertos_eventq_put", - "npl_freertos_sem_init", - "npl_freertos_sem_pend", - "npl_freertos_sem_release", - "npl_freertos_callout_init", - "npl_freertos_callout_reset", - "npl_freertos_callout_remaining_ticks", - "npl_freertos_time_ms_to_ticks", + "kv_commit", "xQueueGenericSend", + "xQueuePeek", + "xQueuePeekFromISR", "xQueueReceive", + "uxQueueMessagesWaiting", + "uxQueueSpacesAvailable", + "vQueueDelete", "xQueueGenericSendFromISR", "xQueueGiveFromISR", "xQueueReceiveFromISR", "xQueueIsQueueEmptyFromISR", + "xQueueIsQueueFullFromISR", + "uxQueueMessagesWaitingFromISR", + "xQueueCreateMutex", + "xQueueCreateMutexStatic", "xQueueCreateCountingSemaphore", + "xQueueCreateCountingSemaphoreStatic", "xQueueSemaphoreTake", + "xQueueTakeMutexRecursive", + "xQueueGiveMutexRecursive", "xQueueGenericCreate", "xQueueGenericCreateStatic", + "xQueueCreateSet", + "xQueueAddToSet", + "xQueueRemoveFromSet", + "xQueueSelectFromSet", + "xQueueSelectFromSetFromISR", "vQueueWaitForMessageRestricted", "xQueueGenericReset", "xTaskCreate", @@ -311,12 +243,12 @@ "vTaskSuspendAll", "xTaskResumeAll", "xTaskGetTickCount", - "xTaskGetTickCountFromISR", "xTaskIncrementTick", "vTaskPlaceOnEventList", "vTaskPlaceOnEventListRestricted", "xTaskRemoveFromEventList", "vTaskSwitchContext", + "xTaskGetCurrentTaskHandle", "xTaskCheckForTimeOut", "vTaskMissedYield", "xTaskGetSchedulerState", @@ -328,8 +260,8 @@ "pvTaskIncrementMutexHeldCount", "vTaskInternalSetTimeOutState", "xTimerCreate", + "xTimerCreateStatic", "pvTimerGetTimerID", - "xTimerGetExpiryTime", "xTimerCreateTimerTask", "xTimerGenericCommand", "pxPortInitialiseStack", @@ -338,19 +270,19 @@ "xPortStartScheduler" ], "app": { - "base": 278528 + "base": 155648 }, "ram": { - "base": 536880208, - "size": 54040 + "base": 536880176, + "size": 30488 }, "rom": { "base": 16384, - "size": 258236 + "size": 135180 }, "version": [ + 1, 0, - 14, 1 ] } \ No newline at end of file diff --git a/bundles/mesh/ING9188xx/platform.bin b/bundles/mesh/ING9188xx/platform.bin index 5486c1035d8d686129a544e3ce5faa4fd77cfcb9..e21387dd3605e193af5f17818bb0869040273965 100644 GIT binary patch delta 97545 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�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
### uVision Project, (C) Keil Software
- Target 1 @@ -18,28 +15,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -61,8 +58,8 @@ 0 0 - - + + 0 0 0 @@ -71,8 +68,8 @@ 0 0 - - + + 0 0 0 @@ -82,14 +79,14 @@ 1 0 fromelf.exe --bin -o hid_keyboard.bin ./output/hid_keyboard.axf - + 0 0 0 0 0 - + 0 @@ -103,8 +100,8 @@ 0 0 3 - - + + 1 @@ -138,10 +135,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -174,7 +171,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -272,8 +269,8 @@ 1 - 0x26000 - 0x5e000 + 155648 + 385024 1 @@ -297,8 +294,8 @@ 0 - 0x20009b48 - 0x64b8 + 536901400 + 35048 0 @@ -306,7 +303,7 @@ 0x0 - + 1 @@ -334,7 +331,7 @@ --gnu USE_STDPERIPH_DRIVER - + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -350,10 +347,10 @@ 0 0 - - - - + + + + @@ -365,13 +362,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -457,12 +454,11 @@ - - + @@ -470,5 +466,4 @@ - diff --git a/examples/hid_mouse/hid_mouse.ingw b/examples/hid_mouse/hid_mouse.ingw index eaab5ceb1..bd6d11136 100644 --- a/examples/hid_mouse/hid_mouse.ingw +++ b/examples/hid_mouse/hid_mouse.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -58,8 +58,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/hid_mouse/hid_mouse.uvproj b/examples/hid_mouse/hid_mouse.uvproj index b29dfbe04..aef102ae9 100644 --- a/examples/hid_mouse/hid_mouse.uvproj +++ b/examples/hid_mouse/hid_mouse.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/hid_mouse/hid_mouse.uvprojx b/examples/hid_mouse/hid_mouse.uvprojx index e07e367b7..5b6e4a339 100644 --- a/examples/hid_mouse/hid_mouse.uvprojx +++ b/examples/hid_mouse/hid_mouse.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/ibeacon_scanner/ibeacon_scanner.ingw b/examples/ibeacon_scanner/ibeacon_scanner.ingw index 3aef0f5a6..b6fb92444 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.ingw +++ b/examples/ibeacon_scanner/ibeacon_scanner.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -44,8 +44,8 @@ "role": "central", "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvproj b/examples/ibeacon_scanner/ibeacon_scanner.uvproj index b89e79562..b7ec95ef4 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvproj +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx index e59e2b03f..6f9d39789 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/io_over_ble_mas/io_over_ble_mas.ingw b/examples/io_over_ble_mas/io_over_ble_mas.ingw index bff8a5cd8..9d9893b78 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.ingw +++ b/examples/io_over_ble_mas/io_over_ble_mas.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvproj b/examples/io_over_ble_mas/io_over_ble_mas.uvproj index 490b3bba2..9f66b6609 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvproj +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx index 50617a680..c690ef432 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/io_over_ble_sla/io_over_ble_sla.ingw b/examples/io_over_ble_sla/io_over_ble_sla.ingw index cc4d9b8b8..7cdd38cb9 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.ingw +++ b/examples/io_over_ble_sla/io_over_ble_sla.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvproj b/examples/io_over_ble_sla/io_over_ble_sla.uvproj index c08765471..13e0d9bc1 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvproj +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx index 3009c04ce..d33bc7a89 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/mesh-light/flash_download.ini b/examples/mesh-light/flash_download.ini index 27b28f00c..da50cc796 100644 --- a/examples/mesh-light/flash_download.ini +++ b/examples/mesh-light/flash_download.ini @@ -5,7 +5,7 @@ Name=Burn Bin #1 Checked=1 [bin-1] -Address=278528 +Address=155648 Name=Burn Bin #2 Checked=1 FileName=mesh-light.bin diff --git a/examples/mesh-light/mesh-light.ingw b/examples/mesh-light/mesh-light.ingw index 8071d7a06..838975513 100644 --- a/examples/mesh-light/mesh-light.ingw +++ b/examples/mesh-light/mesh-light.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 258236, + "size": 135180, "base": 16384 }, "ram": { - "size": 54040, - "base": 536880208 + "size": 30488, + "base": 536880176 }, "app": { - "base": 278528 + "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_discover_characteristics_for_service","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristics_for_service_by_uuid16","gatt_client_discover_characteristics_for_service_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_deserialize_service","gatt_client_deserialize_characteristic","gatt_client_deserialize_characteristic_descriptor","ble_gatts_find_svc","ble_gatts_find_chr","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_add_whitelist","gap_remove_whitelist","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","sysSetPublicDeviceAddr","platform_config","platform_shutdown","platform_printf","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_init","l2cap_max_le_mtu","l2cap_send_signaling_le","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","kv_value_append","kv_value_trunc","mesh_setup","mesh_set_dev_name","mesh_platform_config","_os_mbuf_leadingspace","_os_mbuf_trailingspace","os_mqueue_init","os_mqueue_get","os_mqueue_put","os_msys_register","os_msys_get","os_msys_reset","os_msys_get_pkthdr","os_msys_count","os_msys_num_free","os_mbuf_pool_init","os_mbuf_get","os_mbuf_get_pkthdr","os_mbuf_dup","os_mbuf_off","os_mbuf_copydata","os_mbuf_append","os_mbuf_appendfrom","os_mbuf_free","os_mbuf_free_chain","os_mbuf_adj","os_mbuf_cmpf","os_mbuf_cmpm","os_mbuf_prepend","os_mbuf_prepend_pullup","os_mbuf_copyinto","os_mbuf_concat","os_mbuf_extend","os_mbuf_pullup","os_mbuf_trim_front","NET_BUF_SIMPLE","net_buf_simple_init","net_buf_put","net_buf_ref","net_buf_unref","net_buf_simple_pull_le16","net_buf_simple_pull_be16","net_buf_simple_pull_be32","net_buf_simple_pull_le32","net_buf_simple_pull_u8","net_buf_simple_add_le16","net_buf_simple_add_be16","net_buf_simple_add_u8","net_buf_simple_add_be32","net_buf_simple_add_le32","net_buf_add_zeros","net_buf_simple_push_le16","net_buf_simple_push_be16","net_buf_simple_push_u8","net_buf_simple_pull","net_buf_simple_add","k_fifo_is_empty","net_buf_get","net_buf_simple_push","net_buf_reserve","bt_dh_key_gen","bt_pub_key_gen","bt_pub_key_get","bt_rand","bt_hex","bt_encrypt_be","bt_le_adv_start","bt_le_adv_stop","k_work_init","k_delayed_work_init","k_delayed_work_cancel","k_delayed_work_submit","k_uptime_get","k_uptime_get_32","k_sleep","k_work_submit","k_work_add_arg","k_delayed_work_add_arg","k_delayed_work_remaining_get","net_buf_simple_save","net_buf_simple_restore","sys_memcpy_swap","MYNEWT_VAL_BLE_MESH_GATT_PROXY","k_sem_take","net_buf_slist_init","net_buf_slist_is_empty","net_buf_slist_peek_head","net_buf_slist_peek_next","net_buf_slist_get","net_buf_slist_put","net_buf_slist_remove","net_buf_slist_merge_slist","settings_bytes_from_str","settings_str_from_bytes","PB_ADV_config","le_adv_status_reset","bt_mesh_model_msg_init","bt_mesh_model_send","bt_mesh_model_publish","bt_mesh_model_elem","bt_mesh_input_string","bt_mesh_input_number","bt_mesh_prov_enable","bt_mesh_prov_disable","bt_mesh_init","bt_mesh_reset","bt_mesh_provision","bt_mesh_is_provisioned","ble_npl_callout_init","npl_freertos_eventq_get","npl_freertos_eventq_put","npl_freertos_sem_init","npl_freertos_sem_pend","npl_freertos_sem_release","npl_freertos_callout_init","npl_freertos_callout_reset","npl_freertos_callout_remaining_ticks","npl_freertos_time_ms_to_ticks","xQueueGenericSend","xQueueReceive","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueCreateCountingSemaphore","xQueueSemaphoreTake","xQueueGenericCreate","xQueueGenericCreateStatic","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","kv_commit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 0,14,1] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -39,13 +39,13 @@ "deep_sleep": true, "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\mesh-light", "bundle": "mesh", - "app_rom_size": "262144", - "app_rom_addr": "278528", + "app_rom_size": "385024", + "app_rom_addr": "155648", "role": "light", "keil": true, "cmsis": "", - "app_ram_size": 2200, - "app_ram_addr": 536934248, + "app_ram_size": 25784, + "app_ram_addr": 536910664, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/mesh-light/mesh-light.uvoptx b/examples/mesh-light/mesh-light.uvoptx index 44495e85a..b4ab54a83 100644 --- a/examples/mesh-light/mesh-light.uvoptx +++ b/examples/mesh-light/mesh-light.uvoptx @@ -334,7 +334,7 @@ Mesh - 0 + 1 0 0 0 @@ -362,6 +362,18 @@ 0 0 + + 6 + 12 + 4 + 0 + 0 + 0 + ..\..\bundles\mesh\Mesh.lib + Mesh.lib + 0 + 0 + diff --git a/examples/mesh-light/mesh-light.uvproj b/examples/mesh-light/mesh-light.uvproj index dead55117..28c64eba0 100644 --- a/examples/mesh-light/mesh-light.uvproj +++ b/examples/mesh-light/mesh-light.uvproj @@ -294,8 +294,8 @@ 1 - 278528 - 262144 + 155648 + 385024 1 @@ -319,8 +319,8 @@ 0 - 536934248 - 2200 + 536910664 + 25784 0 diff --git a/examples/mesh-light/mesh-light.uvprojx b/examples/mesh-light/mesh-light.uvprojx index e2a3b8a42..2e794053f 100644 --- a/examples/mesh-light/mesh-light.uvprojx +++ b/examples/mesh-light/mesh-light.uvprojx @@ -269,8 +269,8 @@ 1 - 278528 - 262144 + 155648 + 385024 1 @@ -294,8 +294,8 @@ 0 - 536934248 - 2200 + 536910664 + 25784 0 @@ -316,7 +316,7 @@ 0 0 0 - 2 + 1 0 0 0 @@ -452,6 +452,11 @@ 1 ..\..\src\Mesh\model_cli.c + + Mesh.lib + 4 + ..\..\bundles\mesh\Mesh.lib + diff --git a/examples/periodic_advertiser/periodic_advertiser.ingw b/examples/periodic_advertiser/periodic_advertiser.ingw index a653c438f..bf1df86af 100644 --- a/examples/periodic_advertiser/periodic_advertiser.ingw +++ b/examples/periodic_advertiser/periodic_advertiser.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/periodic_advertiser/periodic_advertiser.uvproj b/examples/periodic_advertiser/periodic_advertiser.uvproj index 6ec2a54c1..8b4db1a71 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvproj +++ b/examples/periodic_advertiser/periodic_advertiser.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/periodic_advertiser/periodic_advertiser.uvprojx b/examples/periodic_advertiser/periodic_advertiser.uvprojx index 0c995a769..91c0e62d6 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvprojx +++ b/examples/periodic_advertiser/periodic_advertiser.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/periodic_scanner/periodic_scanner.ingw b/examples/periodic_scanner/periodic_scanner.ingw index c2b06342e..c429ad622 100644 --- a/examples/periodic_scanner/periodic_scanner.ingw +++ b/examples/periodic_scanner/periodic_scanner.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/periodic_scanner/periodic_scanner.uvproj b/examples/periodic_scanner/periodic_scanner.uvproj index 575208338..c9319ee44 100644 --- a/examples/periodic_scanner/periodic_scanner.uvproj +++ b/examples/periodic_scanner/periodic_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/periodic_scanner/periodic_scanner.uvprojx b/examples/periodic_scanner/periodic_scanner.uvprojx index d8800aa9d..707f776e0 100644 --- a/examples/periodic_scanner/periodic_scanner.uvprojx +++ b/examples/periodic_scanner/periodic_scanner.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw index 4a949dc01..d52de7d1f 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x16, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x41, 0x6C, 0x6C, 0x20, \r\n0x49, 0x6E, 0x20, 0x4F, 0x6E, 0x65, \r\n\r\n\/\/ Service Battery Service: 180F\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0F, 0x18, \r\n\/\/ Characteristic Battery Level: 2A19\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0x19, 0x2A, \r\n0x09, 0x00, 0x02, 0x00, 0x06, 0x00, 0x19, 0x2A,\r\n0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28,\r\n0x10, 0x09, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x09, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x0A, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x03, 0x28,\r\n0x02, 0x0C, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x03, 0x28,\r\n0x06, 0x0F, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x0F, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x28,\r\n0x04, 0x11, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x04, 0x03, 0x11, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x13, 0x00, 0x03, 0x28,\r\n0x06, 0x14, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x03, 0x14, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 353\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_BATTERY_LEVEL=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=9\r\n\/\/ HANDLE_RSC_FEATURE=12\r\n\/\/ HANDLE_ETAG_CONTROL=15\r\n\/\/ HANDLE_ETAG_DATA=17\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=20\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_BATTERY_LEVEL_OFFSET=76\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=108\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=149\r\n\/\/ HANDLE_ETAG_CONTROL_OFFSET=224\r\n\/\/ HANDLE_ETAG_DATA_OFFSET=274\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=348\r\n", diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj index 8ea720380..24d3608b6 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx index 02480bba6..300182aaf 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_ancs/flash_download.ini b/examples/peripheral_ancs/flash_download.ini index de9a4afb9..70a746844 100644 --- a/examples/peripheral_ancs/flash_download.ini +++ b/examples/peripheral_ancs/flash_download.ini @@ -15,7 +15,7 @@ script= [bin-0] Name=Burn Bin #1 -Checked=1 +Checked=0 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 diff --git a/examples/peripheral_ancs/peripheral_ancs.ingw b/examples/peripheral_ancs/peripheral_ancs.ingw index caa1beb1d..2eeb34bf2 100644 --- a/examples/peripheral_ancs/peripheral_ancs.ingw +++ b/examples/peripheral_ancs/peripheral_ancs.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_ancs/peripheral_ancs.uvproj b/examples/peripheral_ancs/peripheral_ancs.uvproj index 277074fe8..7738145d7 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvproj +++ b/examples/peripheral_ancs/peripheral_ancs.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_ancs/peripheral_ancs.uvprojx b/examples/peripheral_ancs/peripheral_ancs.uvprojx index a7d6b86c9..fbe553d18 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvprojx +++ b/examples/peripheral_ancs/peripheral_ancs.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_band/peripheral_band.ingw b/examples/peripheral_band/peripheral_band.ingw index ad34ccd54..65b9327a8 100644 --- a/examples/peripheral_band/peripheral_band.ingw +++ b/examples/peripheral_band/peripheral_band.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x42, 0x61, 0x6E, 0x64, \r\n\r\n\/\/ Service Heart Rate: 180D\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0D, 0x18, \r\n\/\/ Characteristic Heart Rate Measurement: 2A37\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x10, 0x06, 0x00, 0x37, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x06, 0x00, 0x37, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x07, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x10, 0x0A, 0x00, 0x53, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x53, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x0B, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x03, 0x28,\r\n0x02, 0x0D, 0x00, 0x54, 0x2A, \r\n0x08, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x54, 0x2A,\r\n\r\n0x00,0x00\r\n\/\/ total size = 144\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=10\r\n\/\/ HANDLE_RSC_FEATURE=13\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT_OFFSET=70\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=111\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=142\r\n", diff --git a/examples/peripheral_band/peripheral_band.uvproj b/examples/peripheral_band/peripheral_band.uvproj index d09cea58a..676475575 100644 --- a/examples/peripheral_band/peripheral_band.uvproj +++ b/examples/peripheral_band/peripheral_band.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_band/peripheral_band.uvprojx b/examples/peripheral_band/peripheral_band.uvprojx index 2bef7fd7e..c04f15701 100644 --- a/examples/peripheral_band/peripheral_band.uvprojx +++ b/examples/peripheral_band/peripheral_band.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_battery/peripheral_battery.ingw b/examples/peripheral_battery/peripheral_battery.ingw index 9931f9272..898973063 100644 --- a/examples/peripheral_battery/peripheral_battery.ingw +++ b/examples/peripheral_battery/peripheral_battery.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -49,8 +49,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n" diff --git a/examples/peripheral_battery/peripheral_battery.uvproj b/examples/peripheral_battery/peripheral_battery.uvproj index dd0237f05..b8d651c03 100644 --- a/examples/peripheral_battery/peripheral_battery.uvproj +++ b/examples/peripheral_battery/peripheral_battery.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_battery/peripheral_battery.uvprojx b/examples/peripheral_battery/peripheral_battery.uvprojx index 4a2b2b4ab..d2b36b0ef 100644 --- a/examples/peripheral_battery/peripheral_battery.uvprojx +++ b/examples/peripheral_battery/peripheral_battery.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_console/flash_download.ini b/examples/peripheral_console/flash_download.ini index a3eb19ef4..d8e6ef1ee 100644 --- a/examples/peripheral_console/flash_download.ini +++ b/examples/peripheral_console/flash_download.ini @@ -27,7 +27,7 @@ FileName=peripheral_console.bin [uart] PortNumber=12 -Baud=115200 +Baud=921600 Parity= DataBits=8 StopBits=1 diff --git a/examples/peripheral_console/peripheral_console.ingw b/examples/peripheral_console/peripheral_console.ingw index d6e838ef3..d987377fc 100644 --- a/examples/peripheral_console/peripheral_console.ingw +++ b/examples/peripheral_console/peripheral_console.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x43, 0x6D, 0x64, \r\n\r\n\/\/ Service INGChips Generic I\/O Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 172\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=160\r\n", diff --git a/examples/peripheral_console/peripheral_console.uvoptx b/examples/peripheral_console/peripheral_console.uvoptx index 7fcdda542..28a1091c3 100644 --- a/examples/peripheral_console/peripheral_console.uvoptx +++ b/examples/peripheral_console/peripheral_console.uvoptx @@ -117,7 +117,7 @@ 0 DLGUARM - d + / 0 @@ -146,13 +146,21 @@ + + + 1 + 2 + 0x40040164 + 0 + + 0 0 0 - 1 + 0 0 0 0 @@ -253,7 +261,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/peripheral_console/peripheral_console.uvproj b/examples/peripheral_console/peripheral_console.uvproj index fa34527a9..6a898ae99 100644 --- a/examples/peripheral_console/peripheral_console.uvproj +++ b/examples/peripheral_console/peripheral_console.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_console/peripheral_console.uvprojx b/examples/peripheral_console/peripheral_console.uvprojx index fdf8f7e45..f61c1ccaf 100644 --- a/examples/peripheral_console/peripheral_console.uvprojx +++ b/examples/peripheral_console/peripheral_console.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_console/src/main.c b/examples/peripheral_console/src/main.c index d069c33e7..99ca1d59f 100644 --- a/examples/peripheral_console/src/main.c +++ b/examples/peripheral_console/src/main.c @@ -54,8 +54,8 @@ void setup_peripherals(void) uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) { (void)(dummy); - (void)(user_data); - + (void)(user_data); +/* w32(0x40004000,0x0);//ie0 w32(0x40004004,0x0);//ie1 w32(0x40004008,0x0);//is0 @@ -78,8 +78,7 @@ uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) w32(0x40070050,0x0);//gpio output enable w32(0x40040094,r32(0x40040094) | 0x1); //gpio output enable - w32(0x40040090,r32(0x40040090) | (0x1 << 16));// adc sleep - +*/ setup_peripherals(); return 0; @@ -88,8 +87,8 @@ uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) uint32_t query_deep_sleep_allowed(void *dummy, void *user_data) { (void)(dummy); - (void)(user_data); - return 1; + (void)(user_data); + return 0; } // To calibration Tx power preciously, we can use a "fake" power mapping table, @@ -110,9 +109,9 @@ int app_main() setup_peripherals(); sysSetPublicDeviceAddr((const unsigned char *)(0x2a010)); - + platform_set_rf_power_mapping(power_mapping); - + //platform_config(PLATFORM_CFG_POWER_SAVING, 0); //platform_config(PLATFORM_CFG_LOG_HCI, 1); @@ -121,9 +120,12 @@ int app_main() platform_set_evt_callback(PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, query_deep_sleep_allowed, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); - + // setup putc handle - platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); - + platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); + + platform_config(PLATFORM_CFG_32K_CLK, PLATFORM_32K_OSC); + platform_config(PLATFORM_CFG_POWER_SAVING, PLATFORM_CFG_ENABLE); + return 0; } diff --git a/examples/peripheral_console/src/profile.c b/examples/peripheral_console/src/profile.c index 4d4dd68dc..70de20204 100644 --- a/examples/peripheral_console/src/profile.c +++ b/examples/peripheral_console/src/profile.c @@ -159,7 +159,8 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin } uint32_t setup_profile(void *data, void *user_data) -{ +{ + platform_printf("setup profile\n"); att_server_init(att_read_callback, att_write_callback); hci_event_callback_registration.callback = &user_packet_handler; hci_add_event_handler(&hci_event_callback_registration); diff --git a/examples/peripheral_etag/peripheral_etag.ingw b/examples/peripheral_etag/peripheral_etag.ingw index 021b85f1d..5e3730dcf 100644 --- a/examples/peripheral_etag/peripheral_etag.ingw +++ b/examples/peripheral_etag/peripheral_etag.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_ETAG_DATA", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x65, 0x54, 0x61, 0x67, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x04, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x16, 0x00, 0x04, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n\r\n0x00,0x00\r\n\/\/ total size = 164\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_ETAG_CONTROL=6\r\n\/\/ HANDLE_ETAG_DATA=8\r\n", diff --git a/examples/peripheral_etag/peripheral_etag.uvproj b/examples/peripheral_etag/peripheral_etag.uvproj index e6e6d3848..3aa25878f 100644 --- a/examples/peripheral_etag/peripheral_etag.uvproj +++ b/examples/peripheral_etag/peripheral_etag.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_etag/peripheral_etag.uvprojx b/examples/peripheral_etag/peripheral_etag.uvprojx index 989fb158f..7874da13d 100644 --- a/examples/peripheral_etag/peripheral_etag.uvprojx +++ b/examples/peripheral_etag/peripheral_etag.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw index 8ec780269..1fa03c203 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -51,8 +51,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj index 85227e41c..f8af2ecb3 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx index 4803a8353..d74b651cf 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_irc/flash_download.ini b/examples/peripheral_irc/flash_download.ini index 8957a76db..f9a71fec4 100644 --- a/examples/peripheral_irc/flash_download.ini +++ b/examples/peripheral_irc/flash_download.ini @@ -26,7 +26,7 @@ Address=155648 FileName=peripheral_irc.bin [uart] -Port=3 +Port=COM3 Baud=115200 Parity= DataBits=8 diff --git a/examples/peripheral_irc/peripheral_irc.ingw b/examples/peripheral_irc/peripheral_irc.ingw index 700cf9030..50d6027a0 100644 --- a/examples/peripheral_irc/peripheral_irc.ingw +++ b/examples/peripheral_irc/peripheral_irc.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_irc/peripheral_irc.uvproj b/examples/peripheral_irc/peripheral_irc.uvproj index 659d0513d..9760936ca 100644 --- a/examples/peripheral_irc/peripheral_irc.uvproj +++ b/examples/peripheral_irc/peripheral_irc.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_irc/peripheral_irc.uvprojx b/examples/peripheral_irc/peripheral_irc.uvprojx index 880118cbc..d54029b58 100644 --- a/examples/peripheral_irc/peripheral_irc.uvprojx +++ b/examples/peripheral_irc/peripheral_irc.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_led/peripheral_led.ingw b/examples/peripheral_led/peripheral_led.ingw index 16521f188..48a36fdac 100644 --- a/examples/peripheral_led/peripheral_led.ingw +++ b/examples/peripheral_led/peripheral_led.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x4C, 0x45, 0x44, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x02, 0x06, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 116\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=111\r\n", diff --git a/examples/peripheral_led/peripheral_led.uvproj b/examples/peripheral_led/peripheral_led.uvproj index 9623edba4..3ba51efcb 100644 --- a/examples/peripheral_led/peripheral_led.uvproj +++ b/examples/peripheral_led/peripheral_led.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_led/peripheral_led.uvprojx b/examples/peripheral_led/peripheral_led.uvprojx index e1b51f9d6..9f0912c57 100644 --- a/examples/peripheral_led/peripheral_led.uvprojx +++ b/examples/peripheral_led/peripheral_led.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_pedometer/peripheral_pedometer.ingw b/examples/peripheral_pedometer/peripheral_pedometer.ingw index d91618447..239281089 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.ingw +++ b/examples/peripheral_pedometer/peripheral_pedometer.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -51,8 +51,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x15, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x65, 0x64, 0x6F, \r\n0x6D, 0x65, 0x74, 0x65, 0x72, \r\n\/\/ Characteristic Appearance: 2A01\r\n0x0D, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x28,\r\n0x02, 0x05, 0x00, 0x01, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x2A,\r\n0x40, 0x04, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x08, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x03, 0x28,\r\n0x02, 0x0B, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 143\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_APPEARANCE=5\r\n\/\/ HANDLE_RSC_MEASUREMENT=8\r\n\/\/ HANDLE_RSC_FEATURE=11\r\n" diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvproj b/examples/peripheral_pedometer/peripheral_pedometer.uvproj index 1fca14955..b8bcc19a9 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvproj +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx index f0c3cabfe..b935a02f4 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_piano/peripheral_piano.ingw b/examples/peripheral_piano/peripheral_piano.ingw index 0aa30be6e..48b9aed35 100644 --- a/examples/peripheral_piano/peripheral_piano.ingw +++ b/examples/peripheral_piano/peripheral_piano.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_KEY_INPUT", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x11, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x69, 0x61, 0x6E, \r\n0x6F, \r\n\r\n\/\/ Service INGChips Piano Service: {00000002-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x02, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Key Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 115\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_KEY_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_KEY_INPUT_OFFSET=113\r\n", diff --git a/examples/peripheral_piano/peripheral_piano.uvproj b/examples/peripheral_piano/peripheral_piano.uvproj index 279fb40ee..8f6e75e76 100644 --- a/examples/peripheral_piano/peripheral_piano.uvproj +++ b/examples/peripheral_piano/peripheral_piano.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_piano/peripheral_piano.uvprojx b/examples/peripheral_piano/peripheral_piano.uvprojx index 39ed290f6..30e06763f 100644 --- a/examples/peripheral_piano/peripheral_piano.uvprojx +++ b/examples/peripheral_piano/peripheral_piano.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_throughput/flash_download.ini b/examples/peripheral_throughput/flash_download.ini index 64882bb83..0c37786a8 100644 --- a/examples/peripheral_throughput/flash_download.ini +++ b/examples/peripheral_throughput/flash_download.ini @@ -5,7 +5,7 @@ redownload=1 entry=0x4000 set-entry=1 launch=1 -batch=0 +batch=1 batch.current=43 batch.limit=-1 UseScript=0 @@ -15,7 +15,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 -Checked=0 +Checked=1 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -27,7 +27,7 @@ FileName=peripheral_throughput.bin [uart] PortNumber=3 -Baud=115200 +Baud=921600 Parity= DataBits=8 StopBits=1 diff --git a/examples/peripheral_throughput/peripheral_throughput.ingw b/examples/peripheral_throughput/peripheral_throughput.ingw index dca58e080..7f54846b1 100644 --- a/examples/peripheral_throughput/peripheral_throughput.ingw +++ b/examples/peripheral_throughput/peripheral_throughput.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x70, 0x74, \r\n\r\n\/\/ Service INGChips Throughput Service: {2445314a-a1d4-4874-b4d1-fdfb6f501485}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x85, 0x14, 0x50, 0x6F, 0xFB, 0xFD, 0xD1, 0xB4, \r\n0x74, 0x48, 0xD4, 0xA1, 0x4A, 0x31, 0x45, 0x24, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 113\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n", diff --git a/examples/peripheral_throughput/peripheral_throughput.uvoptx b/examples/peripheral_throughput/peripheral_throughput.uvoptx index bda2e620e..6d5ce4849 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvoptx +++ b/examples/peripheral_throughput/peripheral_throughput.uvoptx @@ -145,7 +145,24 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) - + + + 0 + 0 + 146 + 1 +
156990
+ 0 + 0 + 0 + 0 + 0 + 1 + .\src\profile.c + + \\peripheral_throughput\src/profile.c\146 +
+
0 diff --git a/examples/peripheral_throughput/peripheral_throughput.uvproj b/examples/peripheral_throughput/peripheral_throughput.uvproj index 5d9cf4c50..b140ccef9 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvproj +++ b/examples/peripheral_throughput/peripheral_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/peripheral_throughput/peripheral_throughput.uvprojx b/examples/peripheral_throughput/peripheral_throughput.uvprojx index 543feda4d..8a45cc162 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvprojx +++ b/examples/peripheral_throughput/peripheral_throughput.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/secondary_fota/secondary_fota.ingw b/examples/secondary_fota/secondary_fota.ingw index f3761713f..999a11995 100644 --- a/examples/secondary_fota/secondary_fota.ingw +++ b/examples/secondary_fota/secondary_fota.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -64,8 +64,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "1", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x1A, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x65, 0x63, 0x6F, \r\n0x6E, 0x64, 0x61, 0x72, 0x79, 0x20, 0x46, 0x4F, \r\n0x54, 0x41, \r\n\r\n\/\/ Service INGChips FOTA Service: {3345c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Version: {3345c2f1-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF1, \r\n0xC2, 0x45, 0x33, \r\n0x1E, 0x00, 0x02, 0x02, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF1, 0xC2, 0x45, 0x33, \r\n0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x28, 0x01, \r\n\/\/ Characteristic FOTA Control: {3345c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x06, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x06, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Data: {3345c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x04, 0x0A, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x04, 0x03, 0x0A, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x33, \r\n\r\n0x00,0x00\r\n\/\/ total size = 230\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_FOTA_VERSION=6\r\n\/\/ HANDLE_FOTA_CONTROL=8\r\n\/\/ HANDLE_FOTA_DATA=10\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_FOTA_VERSION_OFFSET=122\r\n\/\/ HANDLE_FOTA_CONTROL_OFFSET=179\r\n\/\/ HANDLE_FOTA_DATA_OFFSET=228\r\n", diff --git a/examples/secondary_fota/secondary_fota.uvopt b/examples/secondary_fota/secondary_fota.uvopt index f2c271a3a..f682098b6 100644 --- a/examples/secondary_fota/secondary_fota.uvopt +++ b/examples/secondary_fota/secondary_fota.uvopt @@ -225,11 +225,11 @@ 1 1 0 - 1 + 0 52301636 0 0 - 5 + 0 0 .\src\main.c main.c @@ -241,11 +241,11 @@ 2 1 0 - 1 + 0 52301636 0 0 - 5 + 0 0 .\src\profile.c profile.c @@ -257,11 +257,11 @@ 3 1 0 - 1 + 0 52301636 0 0 - 5 + 0 0 .\src\ota_service.c ota_service.c @@ -281,11 +281,11 @@ 4 2 0 - 1 + 0 52301636 0 0 - 5 + 0 0 .\src\startup_ing91800.s startup_ing91800.s @@ -329,11 +329,11 @@ 6 1 0 - 1 + 0 52301636 0 0 - 5 + 0 0 ../..\src\FWlib\peripheral_uart.c peripheral_uart.c @@ -345,11 +345,11 @@ 7 1 0 - 1 + 0 52301636 0 0 - 5 + 0 0 ../..\src\FWlib\peripheral_sysctrl.c peripheral_sysctrl.c diff --git a/examples/secondary_fota/secondary_fota.uvproj b/examples/secondary_fota/secondary_fota.uvproj index b236588a4..bc9764f28 100644 --- a/examples/secondary_fota/secondary_fota.uvproj +++ b/examples/secondary_fota/secondary_fota.uvproj @@ -294,7 +294,7 @@ 1 - 0x80000 + 0x44000 0x2000 @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/secondary_fota/secondary_fota.uvprojx b/examples/secondary_fota/secondary_fota.uvprojx index f606ed0a2..48c2a5ed7 100644 --- a/examples/secondary_fota/secondary_fota.uvprojx +++ b/examples/secondary_fota/secondary_fota.uvprojx @@ -269,7 +269,7 @@ 1 - 0x80000 + 0x44000 0x2000 @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/smart_meter/smart_meter.ingw b/examples/smart_meter/smart_meter.ingw index a0462772a..0f7be4668 100644 --- a/examples/smart_meter/smart_meter.ingw +++ b/examples/smart_meter/smart_meter.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -55,8 +55,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x17, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x6D, 0x61, 0x72, \r\n0x74, 0x20, 0x4D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n\/\/ Service INGChips Console Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 180\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=119\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=168\r\n", diff --git a/examples/smart_meter/smart_meter.uvproj b/examples/smart_meter/smart_meter.uvproj index 583325ba6..e26ce9e25 100644 --- a/examples/smart_meter/smart_meter.uvproj +++ b/examples/smart_meter/smart_meter.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/smart_meter/smart_meter.uvprojx b/examples/smart_meter/smart_meter.uvprojx index 0e6be869b..61928e2af 100644 --- a/examples/smart_meter/smart_meter.uvprojx +++ b/examples/smart_meter/smart_meter.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/thermo_ota/flash_download.ini b/examples/thermo_ota/flash_download.ini index bdd43ae91..5848eef16 100644 --- a/examples/thermo_ota/flash_download.ini +++ b/examples/thermo_ota/flash_download.ini @@ -1,6 +1,6 @@ [bin-0] Name=Burn Bin #1 -Checked=0 +Checked=1 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -12,11 +12,11 @@ Address=155648 [uart] PortNumber=3 -Baud=115200 +Baud=921600 Parity= DataBits=8 StopBits=1 -Port=3 +Port=COM3 AsyncIO=1 [main] @@ -37,13 +37,13 @@ batch.limit=-1 UseScript=0 script= protection.enabled=0 -protection.unlock=0 +protection.unlock=1 [bin-2] Name=Burn Bin #3 Checked=1 FileName=..\secondary_fota\secondary_fota.bin -Address=524288 +Address=278528 [bin-3] Name=Burn Bin #4 diff --git a/examples/thermo_ota/src/profilestask.c b/examples/thermo_ota/src/profilestask.c index 05ca42a8f..3021cde49 100644 --- a/examples/thermo_ota/src/profilestask.c +++ b/examples/thermo_ota/src/profilestask.c @@ -161,6 +161,7 @@ uint8_t *init_service(void); static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) { const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; + const static bd_addr_t rand_addr = {0xCD, 0xA3, 0x28, 0x11, 0x89, 0x3e}; // TODO: random address generation uint8_t event = hci_event_packet_get_type(packet); const btstack_user_msg_t *p_user_msg; if (packet_type != HCI_EVENT_PACKET) return; @@ -171,7 +172,7 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) break; - gap_set_adv_set_random_addr(0, (uint8_t *)(0x44000)); + gap_set_adv_set_random_addr(0, (uint8_t *)rand_addr); gap_set_ext_adv_para(0, CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max @@ -236,6 +237,18 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin static uint8_t att_db_storage[800]; +//#define V2 + +ota_ver_t this_version = +{ + .app = +#ifdef V2 + { .major = 1, .minor = 2, .patch = 0 } +#else + { .major = 1, .minor = 1, .patch = 0 } +#endif +}; + uint8_t *init_service() { static char dev_name[] = "Thermometer"; @@ -270,7 +283,7 @@ uint8_t *init_service() printf("att_temp_value_handle = %d\n" "att_client_desc_value_handle = %d\n", att_temp_value_handle, att_client_desc_value_handle); - ota_init_service(); + ota_init_service(&this_version); return att_db_util_get_address(); } diff --git a/examples/thermo_ota/thermo_ota.ingw b/examples/thermo_ota/thermo_ota.ingw index 36f14dd4f..599243c57 100644 --- a/examples/thermo_ota/thermo_ota.ingw +++ b/examples/thermo_ota/thermo_ota.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -32,6 +32,6 @@ "app_rom_addr": "155648", "arm_inc": "C:\/keil\/ARM\/ARMCC\/include", "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664 + "app_ram_size": 35048, + "app_ram_addr": 536901400 } \ No newline at end of file diff --git a/examples/thermo_ota/thermo_ota.uvoptx b/examples/thermo_ota/thermo_ota.uvoptx index 9b57151f7..4e2e9b18c 100644 --- a/examples/thermo_ota/thermo_ota.uvoptx +++ b/examples/thermo_ota/thermo_ota.uvoptx @@ -149,71 +149,87 @@ 0 0 - 97 + 167 1 -
157804
+
160614
0 0 0 0 0 1 - .\src\main.c + ..\..\src\Tools\ota_service.c - \\thermo_ota\src/main.c\97 + \\thermo_ota\../../src/Tools/ota_service.c\167
1 0 - 89 + 145 1 -
157766
+
160532
0 0 0 0 0 1 - .\src\main.c + ..\..\src\Tools\ota_service.c - \\thermo_ota\src/main.c\89 + \\thermo_ota\../../src/Tools/ota_service.c\145
2 0 - 91 + 89 1 -
157772
+
0
0 0 0 0 0 - 1 + 0 .\src\main.c - \\thermo_ota\src/main.c\91 +
3 0 - 93 + 91 1 -
157776
+
0
0 0 0 0 0 - 1 + 0 .\src\main.c - \\thermo_ota\src/main.c\93 +
4 0 - 99 + 93 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + .\src\main.c + + +
+ + 5 + 0 + 97 1
0
0 @@ -226,7 +242,47 @@
+ + 6 + 0 + 149 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\Tools\ota_service.c + + +
+ + 7 + 0 + 170 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\Tools\ota_service.c + + +
+ + + 1 + 2 + 0x40040164 + 0 + + 0 diff --git a/examples/thermo_ota/thermo_ota.uvproj b/examples/thermo_ota/thermo_ota.uvproj index dea41b297..2e9fc072a 100644 --- a/examples/thermo_ota/thermo_ota.uvproj +++ b/examples/thermo_ota/thermo_ota.uvproj @@ -332,8 +332,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/thermo_ota/thermo_ota.uvprojx b/examples/thermo_ota/thermo_ota.uvprojx index 3de6b82f1..aa72c37c0 100644 --- a/examples/thermo_ota/thermo_ota.uvprojx +++ b/examples/thermo_ota/thermo_ota.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/uart_console/uart_console.ingw b/examples/uart_console/uart_console.ingw index a1bf3d32e..6b55402bd 100644 --- a/examples/uart_console/uart_console.ingw +++ b/examples/uart_console/uart_console.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_DEVICE_NAME", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x14, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x55, 0x41, 0x52, 0x54, 0x20, 0x43, 0x6F, 0x6E, \r\n0x73, 0x6F, 0x6C, 0x65, \r\n\r\n0x00,0x00\r\n\/\/ total size = 45\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n", diff --git a/examples/uart_console/uart_console.uvproj b/examples/uart_console/uart_console.uvproj index 0d826e23f..226b06879 100644 --- a/examples/uart_console/uart_console.uvproj +++ b/examples/uart_console/uart_console.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/uart_console/uart_console.uvprojx b/examples/uart_console/uart_console.uvprojx index d6144d41e..85b13c8d6 100644 --- a/examples/uart_console/uart_console.uvprojx +++ b/examples/uart_console/uart_console.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw index 798252444..f8ec9232c 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_VOICE_CONTROL", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x20, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x56, 0x6F, 0x69, 0x63, \r\n0x65, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, \r\n0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, \r\n\r\n\/\/ Service INGChips Voice Output Service: {00000001-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x01, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Voice Control: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Voice Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 189\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_VOICE_CONTROL=6\r\n\/\/ HANDLE_VOICE_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_VOICE_CONTROL_OFFSET=128\r\n\/\/ HANDLE_VOICE_OUTPUT_OFFSET=177\r\n", diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj index 9b270a571..8112a01ac 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx index 45ae33315..ef4d76ab4 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/src/Tools/ota_service.c b/src/Tools/ota_service.c index eb84e537e..b40cb069a 100644 --- a/src/Tools/ota_service.c +++ b/src/Tools/ota_service.c @@ -15,12 +15,18 @@ #include "platform_api.h" #include "rom_tools.h" +#ifndef SEC_FOTA_APP_ADDR +#define SEC_FOTA_APP_ADDR 0x44000 +#endif + #define RTC_CHIP_STAT_ADDR (0x40050004) #define CLK_FREQ_STAT_POS 3 #define EFLASH_BASE ((uint32_t)0x00004000UL) #define EFLASH_SIZE ((uint32_t)0x00080000UL) //512k byte +#define EFLASH_END (EFLASH_BASE + EFLASH_SIZE) + #include "eflash.inc" uint32_t ClkFreq; //0:16M 1:24M @@ -32,9 +38,7 @@ void start_eflash_prog(void) ClkFreq = (*(uint32_t *)RTC_CHIP_STAT_ADDR>>CLK_FREQ_STAT_POS)&0x1; EflashCacheBypass(); EflashBaseTime(); -#ifdef FOR_ASIC EflashRepair(); -#endif } #define DEF_UUID(var, ID) static uint8_t var[] = ID; @@ -53,29 +57,17 @@ uint8_t ota_downloading = 0; uint32_t ota_addr = 0; uint32_t ota_start_addr = 0; -//#define V2 - -ota_ver_t this_version = -{ - .app = -#ifdef V2 - { .major = 1, .minor = 2, .patch = 0 } -#else - { .major = 1, .minor = 1, .patch = 0 } -#endif -}; - -void ota_init_service(void) +void ota_init_service(ota_ver_t *this_version) { uint8_t ota_data_buff[20]; const platform_ver_t *ver = platform_get_version(); - this_version.platform.major = ver->major; - this_version.platform.minor = ver->minor; - this_version.platform.patch = ver->patch; + this_version->platform.major = ver->major; + this_version->platform.minor = ver->minor; + this_version->platform.patch = ver->patch; att_db_util_add_service_uuid128(uuid_ota_service); att_ota_ver_handle = att_db_util_add_characteristic_uuid128(uuid_ota_ver, - ATT_PROPERTY_READ, (uint8_t *)&this_version, sizeof(this_version)); + ATT_PROPERTY_READ, (uint8_t *)this_version, sizeof(*this_version)); att_ota_data_handle = att_db_util_add_characteristic_uuid128(uuid_ota_data, ATT_PROPERTY_WRITE_WITHOUT_RESPONSE | ATT_PROPERTY_DYNAMIC, ota_data_buff, sizeof(ota_data_buff)); att_ota_ctrl_handle = att_db_util_add_characteristic_uuid128(uuid_ota_ctrl, @@ -132,7 +124,16 @@ int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t else ota_ctrl[0] = OTA_STATUS_OK; EflashProgramEnable(); - EraseEFlashPage(((ota_addr - EFLASH_BASE) >> 13) & 0x3f); + if (ota_addr >= EFLASH_END) + { + *(volatile uint32_t *)(0xc40a0) = 0x4; + EraseEFlashPage(ota_addr >= EFLASH_END + PAGE_SIZE ? 1 : 0); + *(volatile uint32_t *)(0xc40a0) = 0x0; + } + else + { + EraseEFlashPage(((ota_addr - EFLASH_BASE) >> 13) & 0x3f); + } ota_downloading = 1; ota_start_addr = ota_addr; break; @@ -140,8 +141,20 @@ int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t EflashProgramDisable(); ota_downloading = 0; ota_addr = 0; - if (crc((uint8_t *)ota_start_addr, *(uint16_t *)(buffer + 1)) != *(uint16_t *)(buffer + 3)) - ota_ctrl[0] = OTA_STATUS_ERROR; + { + uint16_t len = *(uint16_t *)(buffer + 1); + uint16_t crc_value = *(uint16_t *)(buffer + 3); + if (ota_addr - ota_start_addr < len) + { + ota_ctrl[0] = OTA_STATUS_WAIT_DATA; + break; + } + + if (crc((uint8_t *)ota_start_addr, len) != crc_value) + ota_ctrl[0] = OTA_STATUS_ERROR; + else + ota_ctrl[0] = OTA_STATUS_OK; + } break; case OTA_CTRL_READ_PAGE: if (ota_downloading) @@ -154,7 +167,7 @@ int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t break; case OTA_CTRL_SWITCH_APP: - platform_switch_app(0x80000); + platform_switch_app(SEC_FOTA_APP_ADDR); break; case OTA_CTRL_REBOOT: if (OTA_STATUS_OK == ota_ctrl[0]) @@ -165,8 +178,7 @@ int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t { EflashCacheEna(); EflashCacheFlush(); - NVIC_SystemReset(); - while(1); + platform_reset(); } } break; @@ -204,7 +216,7 @@ int ota_read_callback(uint16_t att_handle, uint16_t offset, uint8_t * buffer, ui if (buffer == NULL) { if (att_handle == att_ota_ver_handle) - return sizeof(this_version); + return sizeof(ota_ver_t); else if (att_handle == att_ota_ctrl_handle) return 1; else @@ -217,4 +229,3 @@ int ota_read_callback(uint16_t att_handle, uint16_t offset, uint8_t * buffer, ui } return buffer_size; } - diff --git a/src/Tools/ota_service.h b/src/Tools/ota_service.h index 14a6efe96..12dfddc83 100644 --- a/src/Tools/ota_service.h +++ b/src/Tools/ota_service.h @@ -55,12 +55,13 @@ typedef struct ota_ver #define OTA_STATUS_DISABLED 0 #define OTA_STATUS_OK 1 #define OTA_STATUS_ERROR 2 +#define OTA_STATUS_WAIT_DATA 3 #ifndef C2NIM /** *@brief initialize FOTA related GATT service by code */ -void ota_init_service(void); +void ota_init_service(ota_ver_t *this_version); #endif /** diff --git a/src/Tools/trace.c b/src/Tools/trace.c index 858d9bb37..49da97ab5 100644 --- a/src/Tools/trace.c +++ b/src/Tools/trace.c @@ -68,10 +68,10 @@ uint32_t cb_trace(const platform_evt_trace_t *trace, trace_info_t *ctx) uint16_t next; int16_t free_size; uint8_t use_mutex = !IS_IN_INTERRUPT(); - + if (use_mutex) xSemaphoreTake(ctx->mutex, portMAX_DELAY); - + next = ctx->write_next; free_size = ctx->read_next - ctx->write_next; if (free_size <= 0) free_size += TRACE_BUFF_SIZE; @@ -84,12 +84,12 @@ uint32_t cb_trace(const platform_evt_trace_t *trace, trace_info_t *ctx) trace_trigger_output(ctx); return 0; } - + next = trace_add_buffer(ctx, (const uint8_t *)trace->data1, trace->len1, next) & TRACE_BUFF_SIZE_MASK; next = trace_add_buffer(ctx, (const uint8_t *)trace->data2, trace->len2, next) & TRACE_BUFF_SIZE_MASK; - + ctx->write_next = next; - + if (use_mutex) xSemaphoreGive(ctx->mutex); trace_trigger_output(ctx); From 859b70c3d104e524e6be38e588fc137974629abf Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Tue, 8 Sep 2020 18:20:44 +0800 Subject: [PATCH 10/10] prepare 3.1.0 release --- bundles/mesh/ING9188xx/meta.json | 288 - bundles/mesh/ING9188xx/platform.bin | Bin 134688 -> 0 bytes bundles/mesh/ING9188xx/symdefs.g | 267 - bundles/mesh/ING9188xx/symdefs.i | 267 - bundles/mesh/ING9188xx/symdefs.m | 268 - bundles/mesh/ING9188xx/symdefs.s | 267 - bundles/mesh/inc/aes.h | 0 bundles/mesh/inc/att_db.h | 142 - bundles/mesh/inc/att_dispatch.h | 72 - bundles/mesh/inc/att_server.h | 54 - bundles/mesh/inc/ble.h | 282 - bundles/mesh/inc/ble_uuid.h | 182 - bundles/mesh/inc/bluetooth.h | 763 -- bundles/mesh/inc/bt_types.h | 82 - bundles/mesh/inc/btstack_defines.h | 1062 --- bundles/mesh/inc/btstack_event.h | 991 -- bundles/mesh/inc/btstack_linked_list.h | 36 - bundles/mesh/inc/btstack_util.h | 160 - bundles/mesh/inc/cfg_cli.h | 198 - bundles/mesh/inc/cfg_srv.h | 70 - bundles/mesh/inc/cmac_mode.h | 0 bundles/mesh/inc/compiler.h | 26 - bundles/mesh/inc/constants.h | 0 bundles/mesh/inc/ecc_dh.h | 0 bundles/mesh/inc/gap.h | 668 -- bundles/mesh/inc/gap_external.h | 951 -- bundles/mesh/inc/gatt_client.h | 421 - bundles/mesh/inc/gatt_external.h | 403 - bundles/mesh/inc/glue.h | 1028 -- bundles/mesh/inc/health_cli.h | 72 - bundles/mesh/inc/health_srv.h | 91 - bundles/mesh/inc/kv_storage.h | 173 - bundles/mesh/inc/l2cap.h | 181 - bundles/mesh/inc/l2cap_signaling.h | 58 - bundles/mesh/inc/log.h | 43 - bundles/mesh/inc/main.h | 375 - bundles/mesh/inc/mesh_api.h | 51 - bundles/mesh/inc/modlog.h | 54 - bundles/mesh/inc/os/FreeRTOS.h | 1189 --- bundles/mesh/inc/os/FreeRTOSConfig.h | 178 - bundles/mesh/inc/os/deprecated_definitions.h | 279 - bundles/mesh/inc/os/event_groups.h | 777 -- bundles/mesh/inc/os/list.h | 412 - bundles/mesh/inc/os/mpu_wrappers.h | 182 - bundles/mesh/inc/os/os_mbuf.h | 716 -- bundles/mesh/inc/os/portable.h | 175 - .../mesh/inc/os/portable/GCC/ARM_CM3/port.c | 717 -- .../inc/os/portable/GCC/ARM_CM3/portmacro.h | 242 - .../inc/os/portable/IAR/ARM_CM3/portasm.s | 103 - .../inc/os/portable/IAR/ARM_CM3/portmacro.h | 180 - .../inc/os/portable/RVDS/ARM_CM3/portmacro.h | 252 - bundles/mesh/inc/os/projdefs.h | 124 - bundles/mesh/inc/os/queue.h | 1707 ---- bundles/mesh/inc/os/semphr.h | 1140 --- bundles/mesh/inc/os/task.h | 2409 ----- bundles/mesh/inc/os/timers.h | 1294 --- bundles/mesh/inc/platform_api.h | 283 - bundles/mesh/inc/proxy.h | 0 bundles/mesh/inc/sm.h | 217 - bundles/mesh/inc/syscfg.h | 379 - bundles/mesh/inc/utils.h | 0 bundles/typical/ING9188xx/meta.json | 24 +- bundles/typical/ING9188xx/platform.bin | Bin 133824 -> 134860 bytes bundles/typical/ING9188xx/platform.hex | 8433 ++++++++++++++++ bundles/typical/ING9188xx/platform_entry.hex | 8436 +++++++++++++++++ .../typical/ING9188xx/platform_entry_lock.hex | 8436 +++++++++++++++++ bundles/typical/ING9188xx/symdefs.g | 548 +- bundles/typical/ING9188xx/symdefs.i | 548 +- bundles/typical/ING9188xx/symdefs.m | 548 +- bundles/typical/ING9188xx/symdefs.s | 548 +- bundles/typical/inc/kv_storage.h | 6 +- bundles/typical/inc/os/task.h | 4 +- bundles/typical/inc/os/timers.h | 4 +- bundles/typical/inc/platform_api.h | 84 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_ibeacon/peripheral_ibeacon.ld | 2 +- .../peripheral_ibeacon/generic_cortex.icf | 6 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_battery.ingw | 12 +- .../peripheral_battery/peripheral_battery.ld | 2 +- .../smart_home_hub/smart_home_hub.ingw | 12 +- examples-nim/smart_home_hub/smart_home_hub.ld | 2 +- examples-rowley/ING918xx.elf | Bin 15188 -> 15364 bytes .../peripheral_ibeacon/peripheral_ibeacon.hzp | 2 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_ibeacon.emProject | 2 +- .../peripheral_ibeacon.ingw | 12 +- examples/anti_lost_mas/anti_lost_mas.ingw | 12 +- examples/anti_lost_mas/anti_lost_mas.uvproj | 4 +- examples/anti_lost_mas/anti_lost_mas.uvprojx | 4 +- examples/anti_lost_sla/anti_lost_sla.ingw | 12 +- examples/anti_lost_sla/anti_lost_sla.uvproj | 4 +- examples/anti_lost_sla/anti_lost_sla.uvprojx | 4 +- examples/central_throughput/README.md | 2 +- .../central_throughput.ingw | 12 +- .../central_throughput.uvopt | 48 +- .../central_throughput.uvoptx | 63 +- .../central_throughput.uvproj | 14 +- .../central_throughput.uvprojx | 14 +- examples/central_throughput/src/main.c | 30 +- examples/hid_keyboard/README.md | 2 +- examples/hid_keyboard/data/advertising.adv | 9 +- examples/hid_keyboard/hid_keyboard.ingw | 12 +- examples/hid_keyboard/hid_keyboard.uvproj | 4 +- examples/hid_keyboard/hid_keyboard.uvprojx | 4 +- examples/hid_keyboard/src/main.c | 3 +- examples/hid_keyboard/src/profile.c | 20 +- examples/hid_mouse/README.md | 2 +- examples/hid_mouse/data/advertising.adv | 7 +- examples/hid_mouse/flash_download.ini | 6 +- examples/hid_mouse/hid_mouse.ingw | 12 +- examples/hid_mouse/hid_mouse.uvoptx | 68 +- examples/hid_mouse/hid_mouse.uvproj | 4 +- examples/hid_mouse/hid_mouse.uvprojx | 4 +- examples/hid_mouse/src/main.c | 2 +- examples/hid_mouse/src/profile.c | 8 +- examples/ibeacon_scanner/ibeacon_scanner.ingw | 12 +- .../ibeacon_scanner/ibeacon_scanner.uvoptx | 2 +- .../ibeacon_scanner/ibeacon_scanner.uvproj | 4 +- .../ibeacon_scanner/ibeacon_scanner.uvprojx | 4 +- examples/io_over_ble_mas/io_over_ble_mas.ingw | 12 +- .../io_over_ble_mas/io_over_ble_mas.uvproj | 4 +- .../io_over_ble_mas/io_over_ble_mas.uvprojx | 4 +- examples/io_over_ble_sla/io_over_ble_sla.ingw | 12 +- .../io_over_ble_sla/io_over_ble_sla.uvproj | 4 +- .../io_over_ble_sla/io_over_ble_sla.uvprojx | 4 +- examples/mesh-light/flash_download.ini | 2 +- examples/mesh-light/mesh-light.ingw | 16 +- examples/mesh-light/mesh-light.uvoptx | 4 +- examples/mesh-light/mesh-light.uvproj | 6 +- examples/mesh-light/mesh-light.uvprojx | 10 +- examples/mesh-light/src/profile.c | 4 +- .../periodic_advertiser/flash_download.ini | 2 +- .../periodic_advertiser.ingw | 12 +- .../periodic_advertiser.uvproj | 4 +- .../periodic_advertiser.uvprojx | 4 +- examples/periodic_scanner/flash_download.ini | 2 +- .../periodic_scanner/periodic_scanner.ingw | 12 +- .../periodic_scanner/periodic_scanner.uvproj | 4 +- .../periodic_scanner/periodic_scanner.uvprojx | 105 +- examples/periodic_scanner/src/main.c | 2 +- examples/periodic_scanner/src/profile.c | 2 +- .../peripheral_all_in_one.ingw | 12 +- .../peripheral_all_in_one.uvproj | 4 +- .../peripheral_all_in_one.uvprojx | 4 +- examples/peripheral_ancs/peripheral_ancs.ingw | 12 +- .../peripheral_ancs/peripheral_ancs.uvopt | 22 +- .../peripheral_ancs/peripheral_ancs.uvoptx | 12 - .../peripheral_ancs/peripheral_ancs.uvproj | 11 +- .../peripheral_ancs/peripheral_ancs.uvprojx | 11 +- examples/peripheral_ancs/src/main.c | 16 - examples/peripheral_band/peripheral_band.ingw | 12 +- .../peripheral_band/peripheral_band.uvproj | 4 +- .../peripheral_band/peripheral_band.uvprojx | 4 +- .../peripheral_battery.ingw | 12 +- .../peripheral_battery.uvproj | 4 +- .../peripheral_battery.uvprojx | 4 +- .../peripheral_console/flash_download.ini | 2 +- .../peripheral_console.ingw | 12 +- .../peripheral_console.uvopt | 75 +- .../peripheral_console.uvoptx | 26 +- .../peripheral_console.uvproj | 14 +- .../peripheral_console.uvprojx | 14 +- examples/peripheral_console/src/main.c | 57 +- examples/peripheral_console/src/profile.c | 1 - examples/peripheral_etag/peripheral_etag.ingw | 12 +- .../peripheral_etag/peripheral_etag.uvproj | 4 +- .../peripheral_etag/peripheral_etag.uvprojx | 4 +- .../peripheral_ibeacon.ingw | 12 +- .../peripheral_ibeacon.uvproj | 4 +- .../peripheral_ibeacon.uvprojx | 4 +- examples/peripheral_irc/peripheral_irc.ingw | 12 +- examples/peripheral_irc/peripheral_irc.uvproj | 4 +- .../peripheral_irc/peripheral_irc.uvprojx | 4 +- examples/peripheral_led/flash_download.ini | 2 +- examples/peripheral_led/peripheral_led.ingw | 12 +- examples/peripheral_led/peripheral_led.uvoptx | 12 +- examples/peripheral_led/peripheral_led.uvproj | 4 +- .../peripheral_led/peripheral_led.uvprojx | 4 +- .../peripheral_pedometer.ingw | 12 +- .../peripheral_pedometer.uvproj | 4 +- .../peripheral_pedometer.uvprojx | 4 +- .../peripheral_piano/peripheral_piano.ingw | 12 +- .../peripheral_piano/peripheral_piano.uvproj | 4 +- .../peripheral_piano/peripheral_piano.uvprojx | 4 +- .../peripheral_throughput/flash_download.ini | 2 +- .../peripheral_throughput.ingw | 12 +- .../peripheral_throughput.uvproj | 4 +- .../peripheral_throughput.uvprojx | 4 +- examples/secondary_fota/secondary_fota.ingw | 12 +- examples/secondary_fota/secondary_fota.uvoptx | 2 +- examples/secondary_fota/secondary_fota.uvproj | 4 +- .../secondary_fota/secondary_fota.uvprojx | 4 +- examples/secondary_fota/src/ota_service.c | 31 +- examples/secondary_fota/src/ota_service.h | 39 - examples/smart_meter/smart_meter.ingw | 12 +- examples/smart_meter/smart_meter.uvopt | 4 +- examples/smart_meter/smart_meter.uvoptx | 4 +- examples/smart_meter/smart_meter.uvproj | 8 +- examples/smart_meter/smart_meter.uvprojx | 8 +- examples/smart_meter/src/main.c | 31 +- examples/thermo_ota/thermo_ota.ingw | 12 +- examples/thermo_ota/thermo_ota.uvoptx | 2 +- examples/thermo_ota/thermo_ota.uvproj | 4 +- examples/thermo_ota/thermo_ota.uvprojx | 4 +- examples/uart_console/README.md | 3 +- examples/uart_console/data/advertising.adv | 4 + examples/uart_console/flash_download.ini | 4 +- examples/uart_console/src/profile.c | 120 +- examples/uart_console/src/uart_console.c | 62 +- examples/uart_console/uart_console.ingw | 12 +- examples/uart_console/uart_console.uvoptx | 55 +- examples/uart_console/uart_console.uvproj | 4 +- examples/uart_console/uart_console.uvprojx | 4 +- .../data/advertising_atv.adv | 14 + .../data/advertising_atv2.adv | 1 + .../voice_remote_ctrl/data/itu_female_16k.m | 1 - examples/voice_remote_ctrl/flash_download.ini | 4 +- examples/voice_remote_ctrl/src/app_cfg.h | 32 + .../voice_remote_ctrl/src/audio_service.c | 137 +- .../voice_remote_ctrl/src/audio_service.h | 15 +- examples/voice_remote_ctrl/src/kb_service.c | 78 + examples/voice_remote_ctrl/src/kb_service.h | 26 + examples/voice_remote_ctrl/src/main.c | 129 +- examples/voice_remote_ctrl/src/profile.c | 437 +- examples/voice_remote_ctrl/src/profile.h | 11 + .../voice_remote_ctrl/src/profile_android.c | 335 + .../voice_remote_ctrl/src/profile_customer.c | 340 + examples/voice_remote_ctrl/src/profile_ing.c | 241 + .../voice_remote_ctrl/src/profile_miboxs.c | 278 + .../voice_remote_ctrl/voice_remote_ctrl.ingw | 12 +- .../voice_remote_ctrl.uvoptx | 32 +- .../voice_remote_ctrl.uvproj | 4 +- .../voice_remote_ctrl.uvprojx | 107 +- src/BSP/eflash.c | 3 +- src/FWlib/peripheral_pinctrl.c | 4 +- src/Mesh/Mesh.lib | Bin 0 -> 9279128 bytes {bundles/mesh/inc => src/Mesh}/access.h | 93 +- {bundles/mesh/inc => src/Mesh}/ble_hs_log.h | 0 src/Mesh/device_composition.c | 3050 ++++++ src/Mesh/device_composition.h | 179 + src/Mesh/errno.h | 192 + src/Mesh/health_cli.c | 553 -- src/Mesh/health_cli.h | 72 - src/Mesh/health_srv.c | 441 - src/Mesh/health_srv.h | 91 - src/Mesh/light_model.c | 865 -- src/Mesh/light_model.h | 43 - {bundles/mesh/inc => src/Mesh}/mesh.h | 10 +- src/Mesh/mesh_api.h | 508 + src/Mesh/mesh_def.h | 1400 +++ src/Mesh/mesh_priv.h | 59 +- src/Mesh/mesh_queue.h | 93 + src/Mesh/mesh_srv.c | 820 ++ src/Mesh/model_cli.c | 276 - src/Mesh/model_cli.h | 46 - src/Mesh/model_srv.c | 259 - src/Mesh/model_srv.h | 69 +- {bundles/mesh/inc => src/Mesh}/nimble_npl.h | 0 .../mesh/inc => src/Mesh}/nimble_npl_os.h | 19 +- {bundles/mesh/inc => src/Mesh}/npl_freertos.h | 30 +- {bundles/mesh/inc => src/Mesh}/os/endian.h | 0 {bundles/mesh/inc => src/Mesh}/os/os.h | 3 +- {bundles/mesh/inc => src/Mesh}/os/os_error.h | 0 {bundles/mesh/inc => src/Mesh/os}/os_mbuf.h | 4 +- .../mesh/inc => src/Mesh}/os/os_mempool.h | 0 .../inc/queue.h => src/Mesh/os/queue_mesh.h | 4 +- src/Mesh/state_binding.c | 322 + .../Mesh/state_binding.h | 40 +- src/Mesh/transition.c | 875 ++ src/Mesh/transition.h | 87 + src/Mesh/type_def.h | 11 + src/Tools/trace.c | 42 +- src/Tools/trace.h | 42 +- 274 files changed, 37021 insertions(+), 28119 deletions(-) delete mode 100644 bundles/mesh/ING9188xx/meta.json delete mode 100644 bundles/mesh/ING9188xx/platform.bin delete mode 100644 bundles/mesh/ING9188xx/symdefs.g delete mode 100644 bundles/mesh/ING9188xx/symdefs.i delete mode 100644 bundles/mesh/ING9188xx/symdefs.m delete mode 100644 bundles/mesh/ING9188xx/symdefs.s delete mode 100644 bundles/mesh/inc/aes.h delete mode 100644 bundles/mesh/inc/att_db.h delete mode 100644 bundles/mesh/inc/att_dispatch.h delete mode 100644 bundles/mesh/inc/att_server.h delete mode 100644 bundles/mesh/inc/ble.h delete mode 100644 bundles/mesh/inc/ble_uuid.h delete mode 100644 bundles/mesh/inc/bluetooth.h delete mode 100644 bundles/mesh/inc/bt_types.h delete mode 100644 bundles/mesh/inc/btstack_defines.h delete mode 100644 bundles/mesh/inc/btstack_event.h delete mode 100644 bundles/mesh/inc/btstack_linked_list.h delete mode 100644 bundles/mesh/inc/btstack_util.h delete mode 100644 bundles/mesh/inc/cfg_cli.h delete mode 100644 bundles/mesh/inc/cfg_srv.h delete mode 100644 bundles/mesh/inc/cmac_mode.h delete mode 100644 bundles/mesh/inc/compiler.h delete mode 100644 bundles/mesh/inc/constants.h delete mode 100644 bundles/mesh/inc/ecc_dh.h delete mode 100644 bundles/mesh/inc/gap.h delete mode 100644 bundles/mesh/inc/gap_external.h delete mode 100644 bundles/mesh/inc/gatt_client.h delete mode 100644 bundles/mesh/inc/gatt_external.h delete mode 100644 bundles/mesh/inc/glue.h delete mode 100644 bundles/mesh/inc/health_cli.h delete mode 100644 bundles/mesh/inc/health_srv.h delete mode 100644 bundles/mesh/inc/kv_storage.h delete mode 100644 bundles/mesh/inc/l2cap.h delete mode 100644 bundles/mesh/inc/l2cap_signaling.h delete mode 100644 bundles/mesh/inc/log.h delete mode 100644 bundles/mesh/inc/main.h delete mode 100644 bundles/mesh/inc/mesh_api.h delete mode 100644 bundles/mesh/inc/modlog.h delete mode 100644 bundles/mesh/inc/os/FreeRTOS.h delete mode 100644 bundles/mesh/inc/os/FreeRTOSConfig.h delete mode 100644 bundles/mesh/inc/os/deprecated_definitions.h delete mode 100644 bundles/mesh/inc/os/event_groups.h delete mode 100644 bundles/mesh/inc/os/list.h delete mode 100644 bundles/mesh/inc/os/mpu_wrappers.h delete mode 100644 bundles/mesh/inc/os/os_mbuf.h delete mode 100644 bundles/mesh/inc/os/portable.h delete mode 100644 bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c delete mode 100644 bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h delete mode 100644 bundles/mesh/inc/os/portable/IAR/ARM_CM3/portasm.s delete mode 100644 bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h delete mode 100644 bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h delete mode 100644 bundles/mesh/inc/os/projdefs.h delete mode 100644 bundles/mesh/inc/os/queue.h delete mode 100644 bundles/mesh/inc/os/semphr.h delete mode 100644 bundles/mesh/inc/os/task.h delete mode 100644 bundles/mesh/inc/os/timers.h delete mode 100644 bundles/mesh/inc/platform_api.h delete mode 100644 bundles/mesh/inc/proxy.h delete mode 100644 bundles/mesh/inc/sm.h delete mode 100644 bundles/mesh/inc/syscfg.h delete mode 100644 bundles/mesh/inc/utils.h create mode 100644 bundles/typical/ING9188xx/platform.hex create mode 100644 bundles/typical/ING9188xx/platform_entry.hex create mode 100644 bundles/typical/ING9188xx/platform_entry_lock.hex delete mode 100644 examples/secondary_fota/src/ota_service.h create mode 100644 examples/voice_remote_ctrl/data/advertising_atv.adv create mode 100644 examples/voice_remote_ctrl/data/advertising_atv2.adv create mode 100644 examples/voice_remote_ctrl/src/app_cfg.h create mode 100644 examples/voice_remote_ctrl/src/profile_android.c create mode 100644 examples/voice_remote_ctrl/src/profile_customer.c create mode 100644 examples/voice_remote_ctrl/src/profile_ing.c create mode 100644 examples/voice_remote_ctrl/src/profile_miboxs.c create mode 100644 src/Mesh/Mesh.lib rename {bundles/mesh/inc => src/Mesh}/access.h (82%) rename {bundles/mesh/inc => src/Mesh}/ble_hs_log.h (100%) create mode 100644 src/Mesh/device_composition.c create mode 100644 src/Mesh/device_composition.h create mode 100644 src/Mesh/errno.h delete mode 100644 src/Mesh/health_cli.c delete mode 100644 src/Mesh/health_cli.h delete mode 100644 src/Mesh/health_srv.c delete mode 100644 src/Mesh/health_srv.h delete mode 100644 src/Mesh/light_model.c delete mode 100644 src/Mesh/light_model.h rename {bundles/mesh/inc => src/Mesh}/mesh.h (62%) create mode 100644 src/Mesh/mesh_api.h create mode 100644 src/Mesh/mesh_def.h create mode 100644 src/Mesh/mesh_queue.h create mode 100644 src/Mesh/mesh_srv.c delete mode 100644 src/Mesh/model_cli.c delete mode 100644 src/Mesh/model_cli.h delete mode 100644 src/Mesh/model_srv.c rename {bundles/mesh/inc => src/Mesh}/nimble_npl.h (100%) rename {bundles/mesh/inc => src/Mesh}/nimble_npl_os.h (96%) rename {bundles/mesh/inc => src/Mesh}/npl_freertos.h (75%) rename {bundles/mesh/inc => src/Mesh}/os/endian.h (100%) rename {bundles/mesh/inc => src/Mesh}/os/os.h (97%) rename {bundles/mesh/inc => src/Mesh}/os/os_error.h (100%) rename {bundles/mesh/inc => src/Mesh/os}/os_mbuf.h (99%) rename {bundles/mesh/inc => src/Mesh}/os/os_mempool.h (100%) rename bundles/mesh/inc/queue.h => src/Mesh/os/queue_mesh.h (99%) create mode 100644 src/Mesh/state_binding.c rename bundles/mesh/inc/nimble_port_freertos.h => src/Mesh/state_binding.h (56%) create mode 100644 src/Mesh/transition.c create mode 100644 src/Mesh/transition.h create mode 100644 src/Mesh/type_def.h diff --git a/bundles/mesh/ING9188xx/meta.json b/bundles/mesh/ING9188xx/meta.json deleted file mode 100644 index 0193cce16..000000000 --- a/bundles/mesh/ING9188xx/meta.json +++ /dev/null @@ -1,288 +0,0 @@ -{ - "api": [ - "att_server_init", - "att_server_register_packet_handler", - "att_server_can_send_packet_now", - "att_server_request_can_send_now_event", - "att_server_notify", - "att_server_indicate", - "att_server_get_mtu", - "att_emit_general_event", - "att_set_db", - "att_set_read_callback", - "att_set_write_callback", - "att_dispatch_register_client", - "att_dispatch_register_server", - "att_dispatch_client_can_send_now", - "att_dispatch_server_can_send_now", - "att_dispatch_client_request_can_send_now_event", - "att_dispatch_server_request_can_send_now_event", - "gatt_client_discover_primary_services", - "gatt_client_discover_primary_services_by_uuid16", - "gatt_client_discover_primary_services_by_uuid128", - "gatt_client_find_included_services_for_service", - "gatt_client_discover_characteristics_for_service", - "gatt_client_discover_characteristics_for_handle_range_by_uuid16", - "gatt_client_discover_characteristics_for_handle_range_by_uuid128", - "gatt_client_discover_characteristic_descriptors", - "gatt_client_read_value_of_characteristic_using_value_handle", - "gatt_client_read_value_of_characteristics_by_uuid16", - "gatt_client_read_value_of_characteristics_by_uuid128", - "gatt_client_read_long_value_of_characteristic_using_value_handle", - "gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset", - "gatt_client_read_multiple_characteristic_values", - "gatt_client_write_value_of_characteristic_without_response", - "gatt_client_signed_write_without_response", - "gatt_client_write_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic", - "gatt_client_write_long_value_of_characteristic_with_offset", - "gatt_client_reliable_write_long_value_of_characteristic", - "gatt_client_read_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle", - "gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset", - "gatt_client_write_client_characteristic_configuration", - "gatt_client_prepare_write", - "gatt_client_execute_write", - "gatt_client_cancel_write", - "gatt_client_get_mtu", - "gatt_client_is_ready", - "gatt_client_listen_for_characteristic_value_updates", - "gatt_client_register_handler", - "gatt_client_pts_suppress_mtu_exchange", - "gap_set_random_device_address", - "gap_disconnect", - "gap_disconnect_all", - "gap_add_whitelist", - "gap_remove_whitelist", - "gap_clear_white_lists", - "gap_read_rssi", - "gap_read_remote_used_features", - "gap_read_remote_info", - "gap_le_read_channel_map", - "gap_read_phy", - "gap_set_def_phy", - "gap_set_phy", - "gap_set_adv_set_random_addr", - "gap_set_ext_scan_para", - "gap_set_ext_scan_response_data", - "gap_set_ext_scan_enable", - "gap_set_ext_adv_enable", - "gap_set_ext_adv_para", - "gap_set_ext_adv_data", - "gap_set_periodic_adv_data", - "gap_set_periodic_adv_enable", - "gap_set_periodic_adv_para", - "gap_clr_adv_set", - "gap_rmv_adv_set", - "gap_periodic_adv_create_sync", - "gap_periodic_adv_create_sync_cancel", - "gap_periodic_adv_term_sync", - "gap_add_dev_to_periodic_list", - "gap_rmv_dev_from_periodic_list", - "gap_clr_periodic_adv_list", - "gap_read_periodic_adv_list_size", - "gap_ext_create_connection", - "gap_create_connection_cancel", - "gap_set_connectionless_cte_tx_param", - "gap_set_connectionless_cte_tx_enable", - "gap_set_connectionless_iq_sampling_enable", - "gap_set_connection_cte_rx_param", - "gap_set_connection_cte_tx_param", - "gap_set_connection_cte_request_enable", - "gap_set_connection_cte_response_enable", - "gap_read_antenna_info", - "gap_set_periodic_adv_rx_enable", - "gap_periodic_adv_sync_transfer", - "gap_periodic_adv_set_info_transfer", - "gap_periodic_adv_sync_transfer_param", - "gap_default_periodic_adv_sync_transfer_param", - "gap_set_host_channel_classification", - "gap_update_connection_parameters", - "gap_get_connection_parameter_range", - "gap_set_connection_parameter_range", - "gap_aes_encrypt", - "gap_start_ccm", - "hci_add_event_handler", - "hci_register_acl_packet_handler", - "hci_power_control", - "platform_set_evt_callback", - "platform_set_irq_callback", - "platform_get_version", - "platform_raise_assertion", - "platform_get_heap_status", - "platform_reset", - "platform_switch_app", - "platform_write_persistent_reg", - "platform_read_persistent_reg", - "platform_config", - "platform_shutdown", - "platform_hrng", - "platform_printf", - "sysSetPublicDeviceAddr", - "platform_set_rf_clk_source", - "platform_set_rf_init_data", - "platform_set_rf_power_mapping", - "platform_patch_rf_init_data", - "ll_set_adv_coded_scheme", - "ll_set_initiating_coded_scheme", - "ll_hint_on_ce_len", - "ll_set_def_antenna", - "big_endian_read_16", - "big_endian_read_32", - "big_endian_store_16", - "big_endian_store_32", - "reverse_bytes", - "reverse_24", - "reverse_48", - "reverse_56", - "reverse_64", - "reverse_128", - "reverse_bd_addr", - "char_for_nibble", - "nibble_for_char", - "bd_addr_cmp", - "bd_addr_copy", - "printf_hexdump", - "uuid128_to_str", - "bd_addr_to_str", - "sscanf_bd_addr", - "uuid_add_bluetooth_prefix", - "uuid_has_bluetooth_prefix", - "btstack_push_user_msg", - "l2cap_register_fixed_channel", - "l2cap_can_send_fixed_channel_packet_now", - "l2cap_request_can_send_fix_channel_now_event", - "l2cap_send_connectionless", - "l2cap_send_connectionless3", - "l2cap_le_send_flow_control_credit", - "l2cap_send_echo_request", - "l2cap_require_security_level_2_for_outgoing_sdp", - "l2cap_init", - "l2cap_register_packet_handler", - "l2cap_max_mtu", - "l2cap_max_le_mtu", - "l2cap_create_channel", - "l2cap_disconnect", - "l2cap_get_remote_mtu_for_local_cid", - "l2cap_send", - "l2cap_register_service", - "l2cap_unregister_service", - "l2cap_can_send_packet_now", - "l2cap_request_can_send_now_event", - "l2cap_request_connection_parameter_update", - "l2cap_send_signaling_le", - "l2cap_next_sig_id", - "l2cap_next_local_cid", - "sm_config", - "sm_add_event_handler", - "sm_private_random_address_generation_set_mode", - "sm_private_random_address_generation_get_mode", - "sm_private_random_address_generation_set_update_period", - "sm_private_random_address_generation_get", - "sm_register_oob_data_callback", - "sm_bonding_decline", - "sm_just_works_confirm", - "sm_passkey_input", - "sm_set_accepted_stk_generation_methods", - "sm_set_encryption_key_size_range", - "sm_set_authentication_requirements", - "sm_send_security_request", - "sm_encryption_key_size", - "sm_authenticated", - "sm_authorization_state", - "sm_request_pairing", - "sm_authorization_decline", - "sm_authorization_grant", - "sm_address_resolution_lookup", - "sm_le_device_key", - "kv_init", - "kv_remove_all", - "kv_remove", - "kv_put", - "kv_get", - "kv_value_modified", - "kv_commit", - "kv_visit", - "kv_commit", - "xQueueGenericSend", - "xQueuePeek", - "xQueuePeekFromISR", - "xQueueReceive", - "uxQueueMessagesWaiting", - "uxQueueSpacesAvailable", - "vQueueDelete", - "xQueueGenericSendFromISR", - "xQueueGiveFromISR", - "xQueueReceiveFromISR", - "xQueueIsQueueEmptyFromISR", - "xQueueIsQueueFullFromISR", - "uxQueueMessagesWaitingFromISR", - "xQueueCreateMutex", - "xQueueCreateMutexStatic", - "xQueueCreateCountingSemaphore", - "xQueueCreateCountingSemaphoreStatic", - "xQueueSemaphoreTake", - "xQueueTakeMutexRecursive", - "xQueueGiveMutexRecursive", - "xQueueGenericCreate", - "xQueueGenericCreateStatic", - "xQueueCreateSet", - "xQueueAddToSet", - "xQueueRemoveFromSet", - "xQueueSelectFromSet", - "xQueueSelectFromSetFromISR", - "vQueueWaitForMessageRestricted", - "xQueueGenericReset", - "xTaskCreate", - "xTaskCreateStatic", - "vTaskDelay", - "vTaskStartScheduler", - "vTaskSuspendAll", - "xTaskResumeAll", - "xTaskGetTickCount", - "xTaskIncrementTick", - "vTaskPlaceOnEventList", - "vTaskPlaceOnEventListRestricted", - "xTaskRemoveFromEventList", - "vTaskSwitchContext", - "xTaskGetCurrentTaskHandle", - "xTaskCheckForTimeOut", - "vTaskMissedYield", - "xTaskGetSchedulerState", - "xTaskPriorityInherit", - "xTaskPriorityDisinherit", - "vTaskPriorityDisinheritAfterTimeout", - "vTaskStepTick", - "eTaskConfirmSleepModeStatus", - "pvTaskIncrementMutexHeldCount", - "vTaskInternalSetTimeOutState", - "xTimerCreate", - "xTimerCreateStatic", - "pvTimerGetTimerID", - "xTimerCreateTimerTask", - "xTimerGenericCommand", - "pxPortInitialiseStack", - "pvPortMalloc", - "vPortFree", - "xPortStartScheduler" - ], - "app": { - "base": 155648 - }, - "ram": { - "base": 536880176, - "size": 30488 - }, - "rom": { - "base": 16384, - "size": 135180 - }, - "version": [ - 1, - 0, - 1 - ] -} \ No newline at end of file diff --git a/bundles/mesh/ING9188xx/platform.bin b/bundles/mesh/ING9188xx/platform.bin deleted file mode 100644 index e21387dd3605e193af5f17818bb0869040273965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134688 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 z 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 pqf7~pE>)RE4K3tG47jjW@qNBOSMfJ# ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 -0x00006329 T att_dispatch_client_can_send_now -0x0000632f T att_dispatch_client_request_can_send_now_event -0x00006335 T att_dispatch_register_client -0x00006349 T att_dispatch_register_server -0x0000635d T att_dispatch_server_can_send_now -0x00006363 T att_dispatch_server_request_can_send_now_event -0x00006421 T att_emit_general_event -0x00006b59 T att_server_can_send_packet_now -0x00006b5d T att_server_get_mtu -0x00006bd1 T att_server_indicate -0x00006c55 T att_server_init -0x00006c91 T att_server_notify -0x00006d79 T att_server_register_packet_handler -0x00006d85 T att_server_request_can_send_now_event -0x00006da1 T att_set_db -0x00006db5 T att_set_read_callback -0x00006dc1 T att_set_write_callback -0x00006f05 T bd_addr_cmp -0x00006f0b T bd_addr_copy -0x00006f15 T bd_addr_to_str -0x00006f4d T big_endian_read_16 -0x00006f55 T big_endian_read_32 -0x00006f69 T big_endian_store_16 -0x00006f75 T big_endian_store_32 -0x000072f9 T btstack_push_user_msg -0x00007565 T char_for_nibble -0x000077f5 T eTaskConfirmSleepModeStatus -0x00008101 T gap_add_dev_to_periodic_list -0x00008119 T gap_add_whitelist -0x0000812d T gap_aes_encrypt -0x00008155 T gap_clear_white_lists -0x00008165 T gap_clr_adv_set -0x00008175 T gap_clr_periodic_adv_list -0x000081a1 T gap_create_connection_cancel -0x000081b1 T gap_default_periodic_adv_sync_transfer_param -0x000081c9 T gap_disconnect -0x000081f5 T gap_disconnect_all -0x0000829d T gap_ext_create_connection -0x00008361 T gap_get_connection_parameter_range -0x0000839d T gap_le_read_channel_map -0x00008411 T gap_periodic_adv_create_sync -0x00008435 T gap_periodic_adv_create_sync_cancel -0x00008445 T gap_periodic_adv_set_info_transfer -0x0000845d T gap_periodic_adv_sync_transfer -0x00008475 T gap_periodic_adv_sync_transfer_param -0x00008491 T gap_periodic_adv_term_sync -0x00008525 T gap_read_antenna_info -0x00008535 T gap_read_periodic_adv_list_size -0x00008545 T gap_read_phy -0x00008559 T gap_read_remote_info -0x0000856d T gap_read_remote_used_features -0x00008581 T gap_read_rssi -0x00008595 T gap_remove_whitelist -0x00008621 T gap_rmv_adv_set -0x00008635 T gap_rmv_dev_from_periodic_list -0x00008675 T gap_set_adv_set_random_addr -0x000086c1 T gap_set_connection_cte_request_enable -0x000086dd T gap_set_connection_cte_response_enable -0x000086f1 T gap_set_connection_cte_rx_param -0x0000874d T gap_set_connection_cte_tx_param -0x000087a1 T gap_set_connection_parameter_range -0x000087b9 T gap_set_connectionless_cte_tx_enable -0x000087cd T gap_set_connectionless_cte_tx_param -0x00008831 T gap_set_connectionless_iq_sampling_enable -0x00008895 T gap_set_def_phy -0x000088ad T gap_set_ext_adv_data -0x000088c5 T gap_set_ext_adv_enable -0x00008941 T gap_set_ext_adv_para -0x00008a21 T gap_set_ext_scan_enable -0x00008a39 T gap_set_ext_scan_para -0x00008ae1 T gap_set_ext_scan_response_data -0x00008af9 T gap_set_host_channel_classification -0x00008b0d T gap_set_periodic_adv_data -0x00008b81 T gap_set_periodic_adv_enable -0x00008b95 T gap_set_periodic_adv_para -0x00008bad T gap_set_periodic_adv_rx_enable -0x00008bc1 T gap_set_phy -0x00008bdd T gap_set_random_device_address -0x00008c41 T gap_start_ccm -0x00008c75 T gap_update_connection_parameters -0x0000915d T gatt_client_cancel_write -0x00009183 T gatt_client_discover_characteristic_descriptors -0x000091c5 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x00009215 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x00009265 T gatt_client_discover_characteristics_for_service -0x0000929b T gatt_client_discover_primary_services -0x000092cd T gatt_client_discover_primary_services_by_uuid128 -0x00009311 T gatt_client_discover_primary_services_by_uuid16 -0x0000934d T gatt_client_execute_write -0x00009373 T gatt_client_find_included_services_for_service -0x000093a1 T gatt_client_get_mtu -0x00009449 T gatt_client_is_ready -0x0000945f T gatt_client_listen_for_characteristic_value_updates -0x00009483 T gatt_client_prepare_write -0x000094c1 T gatt_client_pts_suppress_mtu_exchange -0x000094cd T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x000094f7 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x000094fd T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x0000952b T gatt_client_read_long_value_of_characteristic_using_value_handle -0x00009531 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x0000955f T gatt_client_read_multiple_characteristic_values -0x0000958f T gatt_client_read_value_of_characteristic_using_value_handle -0x000095bd T gatt_client_read_value_of_characteristics_by_uuid128 -0x00009609 T gatt_client_read_value_of_characteristics_by_uuid16 -0x00009655 T gatt_client_register_handler -0x00009661 T gatt_client_reliable_write_long_value_of_characteristic -0x00009a8d T gatt_client_signed_write_without_response -0x00009b51 T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x00009b8b T gatt_client_write_client_characteristic_configuration -0x00009bdd T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x00009bed T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00009c29 T gatt_client_write_long_value_of_characteristic -0x00009c39 T gatt_client_write_long_value_of_characteristic_with_offset -0x00009c75 T gatt_client_write_value_of_characteristic -0x00009cab T gatt_client_write_value_of_characteristic_without_response -0x0000b235 T hci_add_event_handler -0x0000b97d T hci_power_control -0x0000bb31 T hci_register_acl_packet_handler -0x0000c199 T kv_commit -0x0000c1d1 T kv_get -0x0000c1e9 T kv_init -0x0000c239 T kv_put -0x0000c2b1 T kv_remove -0x0000c2ed T kv_remove_all -0x0000c331 T kv_value_modified -0x0000c335 T kv_visit -0x0000c3f5 T l2cap_can_send_fixed_channel_packet_now -0x0000c3f9 T l2cap_can_send_packet_now -0x0000c5b1 T l2cap_create_channel -0x0000c6e9 T l2cap_disconnect -0x0000c98d T l2cap_get_remote_mtu_for_local_cid -0x0000ce0d T l2cap_init -0x0000ce55 T l2cap_le_send_flow_control_credit -0x0000d0b9 T l2cap_max_le_mtu -0x0000d0bd T l2cap_max_mtu -0x0000d0c1 T l2cap_next_local_cid -0x0000d0d1 T l2cap_next_sig_id -0x0000d169 T l2cap_register_fixed_channel -0x0000d185 T l2cap_register_packet_handler -0x0000d191 T l2cap_register_service -0x0000d279 T l2cap_request_can_send_fix_channel_now_event -0x0000d29d T l2cap_request_can_send_now_event -0x0000d2b7 T l2cap_request_connection_parameter_update -0x0000d2e9 T l2cap_require_security_level_2_for_outgoing_sdp -0x0000d6ad T l2cap_send -0x0000d725 T l2cap_send_connectionless -0x0000d7b5 T l2cap_send_connectionless3 -0x0000d84d T l2cap_send_echo_request -0x0000d8b1 T l2cap_send_signaling_le -0x0000d909 T l2cap_unregister_service -0x0000daed T ll_hint_on_ce_len -0x0000ddd1 T ll_set_adv_coded_scheme -0x0000de01 T ll_set_def_antenna -0x0000de1d T ll_set_initiating_coded_scheme -0x0001dbfd T nibble_for_char -0x0001dca1 T platform_config -0x0001dd01 T platform_get_heap_status -0x0001dd19 T platform_get_version -0x0001dd21 T platform_hrng -0x0001dd29 T platform_patch_rf_init_data -0x0001dd45 T platform_printf -0x0001dd59 T platform_raise_assertion -0x0001dd6d T platform_read_persistent_reg -0x0001dd7d T platform_reset -0x0001ddb1 T platform_set_evt_callback -0x0001ddc5 T platform_set_irq_callback -0x0001ddfd T platform_set_rf_clk_source -0x0001de09 T platform_set_rf_init_data -0x0001de15 T platform_set_rf_power_mapping -0x0001de21 T platform_shutdown -0x0001de25 T platform_switch_app -0x0001de49 T platform_write_persistent_reg -0x0001de59 T printf_hexdump -0x0001e955 T pvPortMalloc -0x0001ea3d T pvTaskIncrementMutexHeldCount -0x0001ea55 T pvTimerGetTimerID -0x0001ea81 T pxPortInitialiseStack -0x0001ec41 T reverse_128 -0x0001ec47 T reverse_24 -0x0001ec4d T reverse_48 -0x0001ec53 T reverse_56 -0x0001ec59 T reverse_64 -0x0001ec5f T reverse_bd_addr -0x0001ec65 T reverse_bytes -0x0001ee09 T sm_add_event_handler -0x0001ef35 T sm_address_resolution_lookup -0x0001f00f T sm_authenticated -0x0001f01d T sm_authorization_decline -0x0001f03d T sm_authorization_grant -0x0001f05d T sm_authorization_state -0x0001f079 T sm_bonding_decline -0x0001f451 T sm_config -0x0001f55d T sm_encryption_key_size -0x0001fd2d T sm_just_works_confirm -0x0001ff7d T sm_le_device_key -0x00020015 T sm_passkey_input -0x000203a1 T sm_private_random_address_generation_get -0x000203a9 T sm_private_random_address_generation_get_mode -0x000203b5 T sm_private_random_address_generation_set_mode -0x000203dd T sm_private_random_address_generation_set_update_period -0x00020415 T sm_register_oob_data_callback -0x00020421 T sm_request_pairing -0x00020e5b T sm_send_security_request -0x00020e81 T sm_set_accepted_stk_generation_methods -0x00020e8d T sm_set_authentication_requirements -0x00020e99 T sm_set_encryption_key_size_range -0x0002116d T sscanf_bd_addr -0x000214c1 T sysSetPublicDeviceAddr -0x00021a91 T uuid128_to_str -0x00021ae9 T uuid_add_bluetooth_prefix -0x00021b09 T uuid_has_bluetooth_prefix -0x00021b4d T uxQueueMessagesWaiting -0x00021b75 T uxQueueMessagesWaitingFromISR -0x00021b91 T uxQueueSpacesAvailable -0x00021cc1 T vPortFree -0x00021e81 T vQueueDelete -0x00021ead T vQueueWaitForMessageRestricted -0x00021ef5 T vTaskDelay -0x00021f41 T vTaskInternalSetTimeOutState -0x00021f51 T vTaskMissedYield -0x00021f5d T vTaskPlaceOnEventList -0x00021f95 T vTaskPlaceOnEventListRestricted -0x00021fd5 T vTaskPriorityDisinheritAfterTimeout -0x00022081 T vTaskStartScheduler -0x00022111 T vTaskStepTick -0x00022141 T vTaskSuspendAll -0x00022151 T vTaskSwitchContext -0x000221f9 T xPortStartScheduler -0x000222b5 T xQueueAddToSet -0x000222d9 T xQueueCreateCountingSemaphore -0x00022315 T xQueueCreateCountingSemaphoreStatic -0x00022359 T xQueueCreateMutex -0x0002236f T xQueueCreateMutexStatic -0x00022389 T xQueueCreateSet -0x00022391 T xQueueGenericCreate -0x000223dd T xQueueGenericCreateStatic -0x00022445 T xQueueGenericReset -0x000224d1 T xQueueGenericSend -0x0002263d T xQueueGenericSendFromISR -0x000226fd T xQueueGiveFromISR -0x000227a1 T xQueueGiveMutexRecursive -0x000227e1 T xQueueIsQueueEmptyFromISR -0x00022805 T xQueueIsQueueFullFromISR -0x0002282d T xQueuePeek -0x00022955 T xQueuePeekFromISR -0x000229c1 T xQueueReceive -0x00022aed T xQueueReceiveFromISR -0x00022b81 T xQueueRemoveFromSet -0x00022ba3 T xQueueSelectFromSet -0x00022bb5 T xQueueSelectFromSetFromISR -0x00022bc9 T xQueueSemaphoreTake -0x00022d35 T xQueueTakeMutexRecursive -0x00022d79 T xTaskCheckForTimeOut -0x00022de9 T xTaskCreate -0x00022e45 T xTaskCreateStatic -0x00022eb5 T xTaskGetCurrentTaskHandle -0x00022ec1 T xTaskGetSchedulerState -0x00022edd T xTaskGetTickCount -0x00022ee9 T xTaskIncrementTick -0x00022fb5 T xTaskPriorityDisinherit -0x00023049 T xTaskPriorityInherit -0x000230dd T xTaskRemoveFromEventList -0x0002315d T xTaskResumeAll -0x00023225 T xTimerCreate -0x00023259 T xTimerCreateStatic -0x00023291 T xTimerCreateTimerTask -0x000232fd T xTimerGenericCommand diff --git a/bundles/mesh/ING9188xx/symdefs.s b/bundles/mesh/ING9188xx/symdefs.s deleted file mode 100644 index 1b72107a9..000000000 --- a/bundles/mesh/ING9188xx/symdefs.s +++ /dev/null @@ -1,267 +0,0 @@ ---defsym:att_dispatch_client_can_send_now=0x00006329 ---defsym:att_dispatch_client_request_can_send_now_event=0x0000632f ---defsym:att_dispatch_register_client=0x00006335 ---defsym:att_dispatch_register_server=0x00006349 ---defsym:att_dispatch_server_can_send_now=0x0000635d ---defsym:att_dispatch_server_request_can_send_now_event=0x00006363 ---defsym:att_emit_general_event=0x00006421 ---defsym:att_server_can_send_packet_now=0x00006b59 ---defsym:att_server_get_mtu=0x00006b5d ---defsym:att_server_indicate=0x00006bd1 ---defsym:att_server_init=0x00006c55 ---defsym:att_server_notify=0x00006c91 ---defsym:att_server_register_packet_handler=0x00006d79 ---defsym:att_server_request_can_send_now_event=0x00006d85 ---defsym:att_set_db=0x00006da1 ---defsym:att_set_read_callback=0x00006db5 ---defsym:att_set_write_callback=0x00006dc1 ---defsym:bd_addr_cmp=0x00006f05 ---defsym:bd_addr_copy=0x00006f0b ---defsym:bd_addr_to_str=0x00006f15 ---defsym:big_endian_read_16=0x00006f4d ---defsym:big_endian_read_32=0x00006f55 ---defsym:big_endian_store_16=0x00006f69 ---defsym:big_endian_store_32=0x00006f75 ---defsym:btstack_push_user_msg=0x000072f9 ---defsym:char_for_nibble=0x00007565 ---defsym:eTaskConfirmSleepModeStatus=0x000077f5 ---defsym:gap_add_dev_to_periodic_list=0x00008101 ---defsym:gap_add_whitelist=0x00008119 ---defsym:gap_aes_encrypt=0x0000812d ---defsym:gap_clear_white_lists=0x00008155 ---defsym:gap_clr_adv_set=0x00008165 ---defsym:gap_clr_periodic_adv_list=0x00008175 ---defsym:gap_create_connection_cancel=0x000081a1 ---defsym:gap_default_periodic_adv_sync_transfer_param=0x000081b1 ---defsym:gap_disconnect=0x000081c9 ---defsym:gap_disconnect_all=0x000081f5 ---defsym:gap_ext_create_connection=0x0000829d ---defsym:gap_get_connection_parameter_range=0x00008361 ---defsym:gap_le_read_channel_map=0x0000839d ---defsym:gap_periodic_adv_create_sync=0x00008411 ---defsym:gap_periodic_adv_create_sync_cancel=0x00008435 ---defsym:gap_periodic_adv_set_info_transfer=0x00008445 ---defsym:gap_periodic_adv_sync_transfer=0x0000845d ---defsym:gap_periodic_adv_sync_transfer_param=0x00008475 ---defsym:gap_periodic_adv_term_sync=0x00008491 ---defsym:gap_read_antenna_info=0x00008525 ---defsym:gap_read_periodic_adv_list_size=0x00008535 ---defsym:gap_read_phy=0x00008545 ---defsym:gap_read_remote_info=0x00008559 ---defsym:gap_read_remote_used_features=0x0000856d ---defsym:gap_read_rssi=0x00008581 ---defsym:gap_remove_whitelist=0x00008595 ---defsym:gap_rmv_adv_set=0x00008621 ---defsym:gap_rmv_dev_from_periodic_list=0x00008635 ---defsym:gap_set_adv_set_random_addr=0x00008675 ---defsym:gap_set_connection_cte_request_enable=0x000086c1 ---defsym:gap_set_connection_cte_response_enable=0x000086dd ---defsym:gap_set_connection_cte_rx_param=0x000086f1 ---defsym:gap_set_connection_cte_tx_param=0x0000874d ---defsym:gap_set_connection_parameter_range=0x000087a1 ---defsym:gap_set_connectionless_cte_tx_enable=0x000087b9 ---defsym:gap_set_connectionless_cte_tx_param=0x000087cd ---defsym:gap_set_connectionless_iq_sampling_enable=0x00008831 ---defsym:gap_set_def_phy=0x00008895 ---defsym:gap_set_ext_adv_data=0x000088ad ---defsym:gap_set_ext_adv_enable=0x000088c5 ---defsym:gap_set_ext_adv_para=0x00008941 ---defsym:gap_set_ext_scan_enable=0x00008a21 ---defsym:gap_set_ext_scan_para=0x00008a39 ---defsym:gap_set_ext_scan_response_data=0x00008ae1 ---defsym:gap_set_host_channel_classification=0x00008af9 ---defsym:gap_set_periodic_adv_data=0x00008b0d ---defsym:gap_set_periodic_adv_enable=0x00008b81 ---defsym:gap_set_periodic_adv_para=0x00008b95 ---defsym:gap_set_periodic_adv_rx_enable=0x00008bad ---defsym:gap_set_phy=0x00008bc1 ---defsym:gap_set_random_device_address=0x00008bdd ---defsym:gap_start_ccm=0x00008c41 ---defsym:gap_update_connection_parameters=0x00008c75 ---defsym:gatt_client_cancel_write=0x0000915d ---defsym:gatt_client_discover_characteristic_descriptors=0x00009183 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000091c5 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00009215 ---defsym:gatt_client_discover_characteristics_for_service=0x00009265 ---defsym:gatt_client_discover_primary_services=0x0000929b ---defsym:gatt_client_discover_primary_services_by_uuid128=0x000092cd ---defsym:gatt_client_discover_primary_services_by_uuid16=0x00009311 ---defsym:gatt_client_execute_write=0x0000934d ---defsym:gatt_client_find_included_services_for_service=0x00009373 ---defsym:gatt_client_get_mtu=0x000093a1 ---defsym:gatt_client_is_ready=0x00009449 ---defsym:gatt_client_listen_for_characteristic_value_updates=0x0000945f ---defsym:gatt_client_prepare_write=0x00009483 ---defsym:gatt_client_pts_suppress_mtu_exchange=0x000094c1 ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x000094cd ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x000094f7 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000094fd ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x0000952b ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00009531 ---defsym:gatt_client_read_multiple_characteristic_values=0x0000955f ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x0000958f ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x000095bd ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00009609 ---defsym:gatt_client_register_handler=0x00009655 ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00009661 ---defsym:gatt_client_signed_write_without_response=0x00009a8d ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009b51 ---defsym:gatt_client_write_client_characteristic_configuration=0x00009b8b ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009bdd ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009bed ---defsym:gatt_client_write_long_value_of_characteristic=0x00009c29 ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00009c39 ---defsym:gatt_client_write_value_of_characteristic=0x00009c75 ---defsym:gatt_client_write_value_of_characteristic_without_response=0x00009cab ---defsym:hci_add_event_handler=0x0000b235 ---defsym:hci_power_control=0x0000b97d ---defsym:hci_register_acl_packet_handler=0x0000bb31 ---defsym:kv_commit=0x0000c199 ---defsym:kv_get=0x0000c1d1 ---defsym:kv_init=0x0000c1e9 ---defsym:kv_put=0x0000c239 ---defsym:kv_remove=0x0000c2b1 ---defsym:kv_remove_all=0x0000c2ed ---defsym:kv_value_modified=0x0000c331 ---defsym:kv_visit=0x0000c335 ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c3f5 ---defsym:l2cap_can_send_packet_now=0x0000c3f9 ---defsym:l2cap_create_channel=0x0000c5b1 ---defsym:l2cap_disconnect=0x0000c6e9 ---defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c98d ---defsym:l2cap_init=0x0000ce0d ---defsym:l2cap_le_send_flow_control_credit=0x0000ce55 ---defsym:l2cap_max_le_mtu=0x0000d0b9 ---defsym:l2cap_max_mtu=0x0000d0bd ---defsym:l2cap_next_local_cid=0x0000d0c1 ---defsym:l2cap_next_sig_id=0x0000d0d1 ---defsym:l2cap_register_fixed_channel=0x0000d169 ---defsym:l2cap_register_packet_handler=0x0000d185 ---defsym:l2cap_register_service=0x0000d191 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d279 ---defsym:l2cap_request_can_send_now_event=0x0000d29d ---defsym:l2cap_request_connection_parameter_update=0x0000d2b7 ---defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d2e9 ---defsym:l2cap_send=0x0000d6ad ---defsym:l2cap_send_connectionless=0x0000d725 ---defsym:l2cap_send_connectionless3=0x0000d7b5 ---defsym:l2cap_send_echo_request=0x0000d84d ---defsym:l2cap_send_signaling_le=0x0000d8b1 ---defsym:l2cap_unregister_service=0x0000d909 ---defsym:ll_hint_on_ce_len=0x0000daed ---defsym:ll_set_adv_coded_scheme=0x0000ddd1 ---defsym:ll_set_def_antenna=0x0000de01 ---defsym:ll_set_initiating_coded_scheme=0x0000de1d ---defsym:nibble_for_char=0x0001dbfd ---defsym:platform_config=0x0001dca1 ---defsym:platform_get_heap_status=0x0001dd01 ---defsym:platform_get_version=0x0001dd19 ---defsym:platform_hrng=0x0001dd21 ---defsym:platform_patch_rf_init_data=0x0001dd29 ---defsym:platform_printf=0x0001dd45 ---defsym:platform_raise_assertion=0x0001dd59 ---defsym:platform_read_persistent_reg=0x0001dd6d ---defsym:platform_reset=0x0001dd7d ---defsym:platform_set_evt_callback=0x0001ddb1 ---defsym:platform_set_irq_callback=0x0001ddc5 ---defsym:platform_set_rf_clk_source=0x0001ddfd ---defsym:platform_set_rf_init_data=0x0001de09 ---defsym:platform_set_rf_power_mapping=0x0001de15 ---defsym:platform_shutdown=0x0001de21 ---defsym:platform_switch_app=0x0001de25 ---defsym:platform_write_persistent_reg=0x0001de49 ---defsym:printf_hexdump=0x0001de59 ---defsym:pvPortMalloc=0x0001e955 ---defsym:pvTaskIncrementMutexHeldCount=0x0001ea3d ---defsym:pvTimerGetTimerID=0x0001ea55 ---defsym:pxPortInitialiseStack=0x0001ea81 ---defsym:reverse_128=0x0001ec41 ---defsym:reverse_24=0x0001ec47 ---defsym:reverse_48=0x0001ec4d ---defsym:reverse_56=0x0001ec53 ---defsym:reverse_64=0x0001ec59 ---defsym:reverse_bd_addr=0x0001ec5f ---defsym:reverse_bytes=0x0001ec65 ---defsym:sm_add_event_handler=0x0001ee09 ---defsym:sm_address_resolution_lookup=0x0001ef35 ---defsym:sm_authenticated=0x0001f00f ---defsym:sm_authorization_decline=0x0001f01d ---defsym:sm_authorization_grant=0x0001f03d ---defsym:sm_authorization_state=0x0001f05d ---defsym:sm_bonding_decline=0x0001f079 ---defsym:sm_config=0x0001f451 ---defsym:sm_encryption_key_size=0x0001f55d ---defsym:sm_just_works_confirm=0x0001fd2d ---defsym:sm_le_device_key=0x0001ff7d ---defsym:sm_passkey_input=0x00020015 ---defsym:sm_private_random_address_generation_get=0x000203a1 ---defsym:sm_private_random_address_generation_get_mode=0x000203a9 ---defsym:sm_private_random_address_generation_set_mode=0x000203b5 ---defsym:sm_private_random_address_generation_set_update_period=0x000203dd ---defsym:sm_register_oob_data_callback=0x00020415 ---defsym:sm_request_pairing=0x00020421 ---defsym:sm_send_security_request=0x00020e5b ---defsym:sm_set_accepted_stk_generation_methods=0x00020e81 ---defsym:sm_set_authentication_requirements=0x00020e8d ---defsym:sm_set_encryption_key_size_range=0x00020e99 ---defsym:sscanf_bd_addr=0x0002116d ---defsym:sysSetPublicDeviceAddr=0x000214c1 ---defsym:uuid128_to_str=0x00021a91 ---defsym:uuid_add_bluetooth_prefix=0x00021ae9 ---defsym:uuid_has_bluetooth_prefix=0x00021b09 ---defsym:uxQueueMessagesWaiting=0x00021b4d ---defsym:uxQueueMessagesWaitingFromISR=0x00021b75 ---defsym:uxQueueSpacesAvailable=0x00021b91 ---defsym:vPortFree=0x00021cc1 ---defsym:vQueueDelete=0x00021e81 ---defsym:vQueueWaitForMessageRestricted=0x00021ead ---defsym:vTaskDelay=0x00021ef5 ---defsym:vTaskInternalSetTimeOutState=0x00021f41 ---defsym:vTaskMissedYield=0x00021f51 ---defsym:vTaskPlaceOnEventList=0x00021f5d ---defsym:vTaskPlaceOnEventListRestricted=0x00021f95 ---defsym:vTaskPriorityDisinheritAfterTimeout=0x00021fd5 ---defsym:vTaskStartScheduler=0x00022081 ---defsym:vTaskStepTick=0x00022111 ---defsym:vTaskSuspendAll=0x00022141 ---defsym:vTaskSwitchContext=0x00022151 ---defsym:xPortStartScheduler=0x000221f9 ---defsym:xQueueAddToSet=0x000222b5 ---defsym:xQueueCreateCountingSemaphore=0x000222d9 ---defsym:xQueueCreateCountingSemaphoreStatic=0x00022315 ---defsym:xQueueCreateMutex=0x00022359 ---defsym:xQueueCreateMutexStatic=0x0002236f ---defsym:xQueueCreateSet=0x00022389 ---defsym:xQueueGenericCreate=0x00022391 ---defsym:xQueueGenericCreateStatic=0x000223dd ---defsym:xQueueGenericReset=0x00022445 ---defsym:xQueueGenericSend=0x000224d1 ---defsym:xQueueGenericSendFromISR=0x0002263d ---defsym:xQueueGiveFromISR=0x000226fd ---defsym:xQueueGiveMutexRecursive=0x000227a1 ---defsym:xQueueIsQueueEmptyFromISR=0x000227e1 ---defsym:xQueueIsQueueFullFromISR=0x00022805 ---defsym:xQueuePeek=0x0002282d ---defsym:xQueuePeekFromISR=0x00022955 ---defsym:xQueueReceive=0x000229c1 ---defsym:xQueueReceiveFromISR=0x00022aed ---defsym:xQueueRemoveFromSet=0x00022b81 ---defsym:xQueueSelectFromSet=0x00022ba3 ---defsym:xQueueSelectFromSetFromISR=0x00022bb5 ---defsym:xQueueSemaphoreTake=0x00022bc9 ---defsym:xQueueTakeMutexRecursive=0x00022d35 ---defsym:xTaskCheckForTimeOut=0x00022d79 ---defsym:xTaskCreate=0x00022de9 ---defsym:xTaskCreateStatic=0x00022e45 ---defsym:xTaskGetCurrentTaskHandle=0x00022eb5 ---defsym:xTaskGetSchedulerState=0x00022ec1 ---defsym:xTaskGetTickCount=0x00022edd ---defsym:xTaskIncrementTick=0x00022ee9 ---defsym:xTaskPriorityDisinherit=0x00022fb5 ---defsym:xTaskPriorityInherit=0x00023049 ---defsym:xTaskRemoveFromEventList=0x000230dd ---defsym:xTaskResumeAll=0x0002315d ---defsym:xTimerCreate=0x00023225 ---defsym:xTimerCreateStatic=0x00023259 ---defsym:xTimerCreateTimerTask=0x00023291 ---defsym:xTimerGenericCommand=0x000232fd diff --git a/bundles/mesh/inc/aes.h b/bundles/mesh/inc/aes.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/bundles/mesh/inc/att_db.h b/bundles/mesh/inc/att_db.h deleted file mode 100644 index 1766aff40..000000000 --- a/bundles/mesh/inc/att_db.h +++ /dev/null @@ -1,142 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -#ifndef __ATT_H -#define __ATT_H - -#include -#include "bluetooth.h" -#include "bt_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// custom BTstack error codes -#define ATT_ERROR_HCI_DISCONNECT_RECEIVED 0x1f - -// custom BTstack ATT error coders -#define ATT_ERROR_DATA_MISMATCH 0x7e -#define ATT_ERROR_TIMEOUT 0x7F - -// ATT Client Read Callback for Dynamic Data -// - if buffer == NULL, don't copy data, just return size of value -// - if buffer != NULL, copy data and return number bytes copied -// @param con_handle of hci le connection -// @param attribute_handle to be read -// @param offset defines start of attribute value -// @param buffer -// @param buffer_size -typedef uint16_t (*att_read_callback_t)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size); - -// ATT Client Write Callback for Dynamic Data -// @param con_handle of hci le connection -// @param attribute_handle to be written -// @param transaction - ATT_TRANSACTION_MODE_NONE for regular writes, ATT_TRANSACTION_MODE_ACTIVE for prepared writes and ATT_TRANSACTION_MODE_EXECUTE -// @param offset into the value - used for queued writes and long attributes -// @param buffer -// @param buffer_size -// @param signature used for signed write commmands -// @returns 0 if write was ok, ATT_ERROR_PREPARE_QUEUE_FULL if no space in queue, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer -typedef int (*att_write_callback_t)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size); - -/* API_START */ -/* - * @brief setup ATT server - * @param read_callback, see att_db.h, can be NULL - * @param write_callback, see attl.h, can be NULL - * NOTE: this function function must be called before seting up a custom HCI handler (if any) - */ -void att_server_init(att_read_callback_t read_callback, att_write_callback_t write_callback); - -/* - * @brief register packet handler for ATT server events: - * - ATT_EVENT_MTU_EXCHANGE_COMPLETE - * - ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE - * @param handler - */ -void att_server_register_packet_handler(btstack_packet_handler_t handler); - -/* - * @brief tests if a notification or indication can be send right now - * @param con_handle - * @return 1, if packet can be sent - */ -int att_server_can_send_packet_now(hci_con_handle_t con_handle); - -/** - * @brief Request emission of ATT_EVENT_CAN_SEND_NOW as soon as possible - * @note ATT_EVENT_CAN_SEND_NOW might be emitted during call to this function - * so packet handler should be ready to handle it - * @param con_handle - */ -void att_server_request_can_send_now_event(hci_con_handle_t con_handle); - -/* - * @brief notify client about attribute value change - * @param con_handle - * @param attribute_handle - * @param value - * @param value_len - * @return 0 if ok, error otherwise - */ -int att_server_notify(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); - -/* - * @brief indicate value change to client. client is supposed to reply with an indication_response - * @param con_handle - * @param attribute_handle - * @param value - * @param value_len - * @return 0 if ok, error otherwise - */ -int att_server_indicate(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); - -/* - * @brief get current MTU size - * @return current MTU size - */ -uint16_t att_server_get_mtu(hci_con_handle_t con_handle); - -/* - * @brief emit a general event to att handler - * @param event - * @param length - * @return void - */ -void att_emit_general_event(uint8_t *event, uint16_t length); - -/* - * @brief setup ATT database - * @param con_handle[in] associated connection handle - * @param db[in] the ATT db - */ -void att_set_db(hci_con_handle_t con_handle, const uint8_t *db); - -/* - * @brief set callback for read of dynamic attributes - * @param callback - */ -void att_set_read_callback(att_read_callback_t callback); - -/* - * @brief set callback for write of dynamic attributes - * @param callback - */ -void att_set_write_callback(att_write_callback_t callback); - -#ifdef __cplusplus -} -#endif - -#endif // __ATT_H diff --git a/bundles/mesh/inc/att_dispatch.h b/bundles/mesh/inc/att_dispatch.h deleted file mode 100644 index 60f62817b..000000000 --- a/bundles/mesh/inc/att_dispatch.h +++ /dev/null @@ -1,72 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -/** - * Dispatcher for independent implementation of ATT client and server - */ - -#ifndef __ATT_DISPATCH_H -#define __ATT_DISPATCH_H - -#include "btstack_util.h" -#include "bt_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief reset att dispatchter - * @param packet_hander for ATT client packets - */ -void att_dispatch_register_client(btstack_packet_handler_t packet_handler); - -/** - * @brief reset att dispatchter - * @param packet_hander for ATT server packets - */ -void att_dispatch_register_server(btstack_packet_handler_t packet_handler); - -/** - * @brief can send packet for client - * @param con_handle - */ -int att_dispatch_client_can_send_now(hci_con_handle_t con_handle); - -/** - * @brief can send packet for server - * @param con_handle - */ -int att_dispatch_server_can_send_now(hci_con_handle_t con_handle); - -/** - * @brief Request emission of L2CAP_EVENT_CAN_SEND_NOW as soon as possible for client - * @note L2CAP_EVENT_CAN_SEND_NOW might be emitted during call to this function - * so packet handler should be ready to handle it - * @param con_handle - */ -void att_dispatch_client_request_can_send_now_event(hci_con_handle_t con_handle); - -/** - * @brief Request emission of L2CAP_EVENT_CAN_SEND_NOW as soon as possible for server - * @note L2CAP_EVENT_CAN_SEND_NOW might be emitted during call to this function - * so packet handler should be ready to handle it - * @param con_handle - */ -void att_dispatch_server_request_can_send_now_event(hci_con_handle_t con_handle); - -#ifdef __cplusplus -} -#endif - -#endif // __ATT_DISPATCH_H diff --git a/bundles/mesh/inc/att_server.h b/bundles/mesh/inc/att_server.h deleted file mode 100644 index 060edd2a5..000000000 --- a/bundles/mesh/inc/att_server.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2014 BlueKitchen GmbH - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * 4. Any redistribution, use, or modification is done solely for - * personal benefit and not for any commercial purpose or for - * monetary gain. - * - * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS - * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Please inquire about commercial licensing options at - * contact@bluekitchen-gmbh.com - * - */ -#ifndef __ATT_SERVER_H -#define __ATT_SERVER_H - -#include -#include "att_db.h" -#include "btstack_defines.h" -#include "gatt_external.h" -#if defined __cplusplus -extern "C" { -#endif - -/* API_END */ - -#if defined __cplusplus -} -#endif - -#endif // __ATT_SERVER_H diff --git a/bundles/mesh/inc/ble.h b/bundles/mesh/inc/ble.h deleted file mode 100644 index 1442c82d5..000000000 --- a/bundles/mesh/inc/ble.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - * 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. - */ - -#ifndef H_BLE_ -#define H_BLE_ - -#include -#include -#include "syscfg.h" -#include "os/os.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* The number of advertising instances */ -#define BLE_ADV_INSTANCES (MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES) + 1) - -/* BLE encryption block definitions */ -#define BLE_ENC_BLOCK_SIZE (16) - -struct ble_encryption_block -{ - uint8_t key[BLE_ENC_BLOCK_SIZE]; - uint8_t plain_text[BLE_ENC_BLOCK_SIZE]; - uint8_t cipher_text[BLE_ENC_BLOCK_SIZE]; -}; - -/* - * BLE MBUF structure: - * - * The BLE mbuf structure is as follows. Note that this structure applies to - * the packet header mbuf (not mbufs that are part of a "packet chain"): - * struct os_mbuf (16) - * struct os_mbuf_pkthdr (8) - * struct ble_mbuf_hdr (8) - * Data buffer (payload size, in bytes) - * - * The BLE mbuf header contains the following: - * flags: bitfield with the following values - * 0x01: Set if there was a match on the whitelist - * 0x02: Set if a connect request was transmitted upon receiving pdu - * 0x04: Set the first time we transmit the PDU (used to detect retry). - * channel: The logical BLE channel PHY channel # (0 - 39) - * crcok: flag denoting CRC check passed (1) or failed (0). - * rssi: RSSI, in dBm. - */ -struct ble_mbuf_hdr_rxinfo -{ - uint16_t flags; - uint8_t channel; - uint8_t handle; - int8_t rssi; - /* XXX: we could just use single phy_mode field */ - int8_t phy; - uint8_t phy_mode; -#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV) - void *user_data; -#endif -}; - -/* Flag definitions for rxinfo */ -#define BLE_MBUF_HDR_F_EXT_ADV_SEC (0x1000) -#define BLE_MBUF_HDR_F_EXT_ADV (0x0800) -#define BLE_MBUF_HDR_F_RESOLVED (0x0400) -#define BLE_MBUF_HDR_F_AUX_PTR_WAIT (0x0200) -#define BLE_MBUF_HDR_F_AUX_INVALID (0x0100) -#define BLE_MBUF_HDR_F_CRC_OK (0x0080) -#define BLE_MBUF_HDR_F_DEVMATCH (0x0040) -#define BLE_MBUF_HDR_F_MIC_FAILURE (0x0020) -#define BLE_MBUF_HDR_F_SCAN_RSP_TXD (0x0010) -#define BLE_MBUF_HDR_F_SCAN_RSP_CHK (0x0008) -#define BLE_MBUF_HDR_F_RXSTATE_MASK (0x0007) - -/* Transmit info. NOTE: no flags defined */ -struct ble_mbuf_hdr_txinfo -{ - uint8_t flags; - uint8_t offset; - uint8_t pyld_len; - uint8_t hdr_byte; -}; - -struct ble_mbuf_hdr -{ - union { - struct ble_mbuf_hdr_rxinfo rxinfo; - struct ble_mbuf_hdr_txinfo txinfo; - }; - uint32_t beg_cputime; - uint32_t rem_usecs; -}; - -#define BLE_MBUF_HDR_EXT_ADV_SEC(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_EXT_ADV_SEC)) - -#define BLE_MBUF_HDR_EXT_ADV(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_EXT_ADV)) - -#define BLE_MBUF_HDR_DEVMATCH(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_DEVMATCH)) - -#define BLE_MBUF_HDR_SCAN_RSP_RCV(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_SCAN_RSP_CHK)) - -#define BLE_MBUF_HDR_AUX_INVALID(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_AUX_INVALID)) - -#define BLE_MBUF_HDR_WAIT_AUX(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_AUX_PTR_WAIT)) - -#define BLE_MBUF_HDR_CRC_OK(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_CRC_OK)) - -#define BLE_MBUF_HDR_MIC_FAILURE(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_MIC_FAILURE)) - -#define BLE_MBUF_HDR_RESOLVED(hdr) \ - (!!((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_RESOLVED)) - -#define BLE_MBUF_HDR_RX_STATE(hdr) \ - ((uint8_t)((hdr)->rxinfo.flags & BLE_MBUF_HDR_F_RXSTATE_MASK)) - -#define BLE_MBUF_HDR_PTR(om) \ - (struct ble_mbuf_hdr *)((uint8_t *)om + sizeof(struct os_mbuf) + \ - sizeof(struct os_mbuf_pkthdr)) - -/* BLE mbuf overhead per packet header mbuf */ -#define BLE_MBUF_PKTHDR_OVERHEAD \ - (sizeof(struct os_mbuf_pkthdr) + sizeof(struct ble_mbuf_hdr)) - -#define BLE_MBUF_MEMBLOCK_OVERHEAD \ - (sizeof(struct os_mbuf) + BLE_MBUF_PKTHDR_OVERHEAD) - -/* Length of host user header. Only contains the peer's connection handle. */ -#define BLE_MBUF_HS_HDR_LEN (2) - -#define BLE_DEV_ADDR_LEN (6) -extern uint8_t g_dev_addr[BLE_DEV_ADDR_LEN]; -extern uint8_t g_random_addr[BLE_DEV_ADDR_LEN]; - -/* BLE Error Codes (Core v4.2 Vol 2 part D) */ -enum ble_error_codes -{ - /* An "error" code of 0x0 means success */ - BLE_ERR_SUCCESS = 0x00, - BLE_ERR_UNKNOWN_HCI_CMD = 0x01, - BLE_ERR_UNK_CONN_ID = 0x02, - BLE_ERR_HW_FAIL = 0x03, - BLE_ERR_PAGE_TMO = 0x04, - BLE_ERR_AUTH_FAIL = 0x05, - BLE_ERR_PINKEY_MISSING = 0x06, - BLE_ERR_MEM_CAPACITY = 0x07, - BLE_ERR_CONN_SPVN_TMO = 0x08, - BLE_ERR_CONN_LIMIT = 0x09, - BLE_ERR_SYNCH_CONN_LIMIT = 0x0a, - BLE_ERR_ACL_CONN_EXISTS = 0x0b, - BLE_ERR_CMD_DISALLOWED = 0x0c, - BLE_ERR_CONN_REJ_RESOURCES = 0x0d, - BLE_ERR_CONN_REJ_SECURITY = 0x0e, - BLE_ERR_CONN_REJ_BD_ADDR = 0x0f, - BLE_ERR_CONN_ACCEPT_TMO = 0x10, - BLE_ERR_UNSUPPORTED = 0x11, - BLE_ERR_INV_HCI_CMD_PARMS = 0x12, - BLE_ERR_REM_USER_CONN_TERM = 0x13, - BLE_ERR_RD_CONN_TERM_RESRCS = 0x14, - BLE_ERR_RD_CONN_TERM_PWROFF = 0x15, - BLE_ERR_CONN_TERM_LOCAL = 0x16, - BLE_ERR_REPEATED_ATTEMPTS = 0x17, - BLE_ERR_NO_PAIRING = 0x18, - BLE_ERR_UNK_LMP = 0x19, - BLE_ERR_UNSUPP_REM_FEATURE = 0x1a, - BLE_ERR_SCO_OFFSET = 0x1b, - BLE_ERR_SCO_ITVL = 0x1c, - BLE_ERR_SCO_AIR_MODE = 0x1d, - BLE_ERR_INV_LMP_LL_PARM = 0x1e, - BLE_ERR_UNSPECIFIED = 0x1f, - BLE_ERR_UNSUPP_LMP_LL_PARM = 0x20, - BLE_ERR_NO_ROLE_CHANGE = 0x21, - BLE_ERR_LMP_LL_RSP_TMO = 0x22, - BLE_ERR_LMP_COLLISION = 0x23, - BLE_ERR_LMP_PDU = 0x24, - BLE_ERR_ENCRYPTION_MODE = 0x25, - BLE_ERR_LINK_KEY_CHANGE = 0x26, - BLE_ERR_UNSUPP_QOS = 0x27, - BLE_ERR_INSTANT_PASSED = 0x28, - BLE_ERR_UNIT_KEY_PAIRING = 0x29, - BLE_ERR_DIFF_TRANS_COLL = 0x2a, - /* BLE_ERR_RESERVED = 0x2b */ - BLE_ERR_QOS_PARM = 0x2c, - BLE_ERR_QOS_REJECTED = 0x2d, - BLE_ERR_CHAN_CLASS = 0x2e, - BLE_ERR_INSUFFICIENT_SEC = 0x2f, - BLE_ERR_PARM_OUT_OF_RANGE = 0x30, - /* BLE_ERR_RESERVED = 0x31 */ - BLE_ERR_PENDING_ROLE_SW = 0x32, - /* BLE_ERR_RESERVED = 0x33 */ - BLE_ERR_RESERVED_SLOT = 0x34, - BLE_ERR_ROLE_SW_FAIL = 0x35, - BLE_ERR_INQ_RSP_TOO_BIG = 0x36, - BLE_ERR_SEC_SIMPLE_PAIR = 0x37, - BLE_ERR_HOST_BUSY_PAIR = 0x38, - BLE_ERR_CONN_REJ_CHANNEL = 0x39, - BLE_ERR_CTLR_BUSY = 0x3a, - BLE_ERR_CONN_PARMS = 0x3b, - BLE_ERR_DIR_ADV_TMO = 0x3c, - BLE_ERR_CONN_TERM_MIC = 0x3d, - BLE_ERR_CONN_ESTABLISHMENT = 0x3e, - BLE_ERR_MAC_CONN_FAIL = 0x3f, - BLE_ERR_COARSE_CLK_ADJ = 0x40, - BLE_ERR_TYPE0_SUBMAP_NDEF = 0x41, - BLE_ERR_UNK_ADV_INDENT = 0x42, - BLE_RR_LIMIT_REACHED = 0x43, - BLE_ERR_MAX = 0xff -}; - -int ble_err_from_os(int os_err); - -/* HW error codes */ -#define BLE_HW_ERR_DO_NOT_USE (0) /* XXX: reserve this one for now */ -#define BLE_HW_ERR_HCI_SYNC_LOSS (1) - -/* Own Bluetooth Device address type */ -#define BLE_OWN_ADDR_PUBLIC (0x00) -#define BLE_OWN_ADDR_RANDOM (0x01) -#define BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT (0x02) -#define BLE_OWN_ADDR_RPA_RANDOM_DEFAULT (0x03) - -/* Bluetooth Device address type */ -#define BLE_ADDR_PUBLIC (0x00) -#define BLE_ADDR_RANDOM (0x01) -#define BLE_ADDR_PUBLIC_ID (0x02) -#define BLE_ADDR_RANDOM_ID (0x03) - -#define BLE_ADDR_ANY (&(ble_addr_t) { 0, {0, 0, 0, 0, 0, 0} }) - -#define BLE_ADDR_IS_RPA(addr) (((addr)->type == BLE_ADDR_RANDOM) && \ - ((addr)->val[5] & 0xc0) == 0x40) -#define BLE_ADDR_IS_NRPA(addr) (((addr)->type == BLE_ADDR_RANDOM) && \ - (((addr)->val[5] & 0xc0) == 0x00) -#define BLE_ADDR_IS_STATIC(addr) (((addr)->type == BLE_ADDR_RANDOM) && \ - (((addr)->val[5] & 0xc0) == 0xc0) - -typedef struct { - uint8_t type; - uint8_t val[6]; -} ble_addr_t; - - -static inline int ble_addr_cmp(const ble_addr_t *a, const ble_addr_t *b) -{ - int type_diff; - - type_diff = a->type - b->type; - if (type_diff != 0) { - return type_diff; - } - - return memcmp(a->val, b->val, sizeof(a->val)); -} - -#ifdef __cplusplus -} -#endif - -#endif /* H_BLE_ */ diff --git a/bundles/mesh/inc/ble_uuid.h b/bundles/mesh/inc/ble_uuid.h deleted file mode 100644 index d3576c595..000000000 --- a/bundles/mesh/inc/ble_uuid.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * 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. - */ - -#ifndef H_BLE_UUID_ -#define H_BLE_UUID_ - -/** - * @brief Bluetooth UUID - * @defgroup bt_uuid Bluetooth UUID - * @ingroup bt_host - * @{ - */ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct os_mbuf; - -/** Type of UUID */ -enum { - /** 16-bit UUID (BT SIG assigned) */ - BLE_UUID_TYPE_16 = 16, - - /** 32-bit UUID (BT SIG assigned) */ - BLE_UUID_TYPE_32 = 32, - - /** 128-bit UUID */ - BLE_UUID_TYPE_128 = 128, -}; - -/** Generic UUID type, to be used only as a pointer */ -typedef struct { - /** Type of the UUID */ - uint8_t type; -} ble_uuid_t; - -/** 16-bit UUID */ -typedef struct { - ble_uuid_t u; - uint16_t value; -} ble_uuid16_t; - -/** 32-bit UUID */ -typedef struct { - ble_uuid_t u; - uint32_t value; -} ble_uuid32_t; - -/** 128-bit UUID */ -typedef struct { - ble_uuid_t u; - uint8_t value[16]; -} ble_uuid128_t; - -/** Universal UUID type, to be used for any-UUID static allocation */ -typedef union { - ble_uuid_t u; - ble_uuid16_t u16; - ble_uuid32_t u32; - ble_uuid128_t u128; -} ble_uuid_any_t; - -#define BLE_UUID16_INIT(uuid16) \ - { \ - .u.type = BLE_UUID_TYPE_16, \ - .value = (uuid16), \ - } - -#define BLE_UUID32_INIT(uuid32) \ - { \ - .u.type = BLE_UUID_TYPE_32, \ - .value = (uuid32), \ - } - -#define BLE_UUID128_INIT(uuid128...) \ - { \ - .u.type = BLE_UUID_TYPE_128, \ - .value = { uuid128 }, \ - } - -#define BLE_UUID16_DECLARE(uuid16) \ - ((ble_uuid_t *) (&(ble_uuid16_t) BLE_UUID16_INIT(uuid16))) - -#define BLE_UUID32_DECLARE(uuid32) \ - ((ble_uuid_t *) (&(ble_uuid32_t) BLE_UUID32_INIT(uuid32))) - -#define BLE_UUID128_DECLARE(uuid128...) \ - ((ble_uuid_t *) (&(ble_uuid128_t) BLE_UUID128_INIT(uuid128))) - -#define BLE_UUID16(u) \ - ((ble_uuid16_t *) (u)) - -#define BLE_UUID32(u) \ - ((ble_uuid32_t *) (u)) - -#define BLE_UUID128(u) \ - ((ble_uuid128_t *) (u)) - -/** Size of buffer needed to store UUID as a string. - * Includes trailing \0. - */ -#define BLE_UUID_STR_LEN (37) - -/** @brief Constructs a UUID object from a byte array. - * - * @param uuid On success, this gets populated with the constructed UUID. - * @param buf The source buffer to parse. - * @param len The size of the buffer, in bytes. - * - * @return 0 on success, BLE_HS_EINVAL if the source buffer does not contain - * a valid UUID. - */ -int ble_uuid_init_from_buf(ble_uuid_any_t *uuid, const void *buf, size_t len); - -/** @brief Compares two Bluetooth UUIDs. - * - * @param uuid1 The first UUID to compare. - * @param uuid2 The second UUID to compare. - * - * @return 0 if the two UUIDs are equal, nonzero if the UUIDs differ. - */ -int ble_uuid_cmp(const ble_uuid_t *uuid1, const ble_uuid_t *uuid2); - -/** @brief Copy Bluetooth UUID - * - * @param dst Destination UUID. - * @param src Source UUID. - */ -void ble_uuid_copy(ble_uuid_any_t *dst, const ble_uuid_t *src); - -/** @brief Converts the specified UUID to its string representation. - * - * Example string representations: - * o 16-bit: 0x1234 - * o 32-bit: 0x12345678 - * o 128-bit: 12345678-1234-1234-1234-123456789abc - * - * @param uuid The source UUID to convert. - * @param dst The destination buffer. - * - * @return A pointer to the supplied destination buffer. - */ -char *ble_uuid_to_str(const ble_uuid_t *uuid, char *dst); - -/** @brief Converts the specified 16-bit UUID to a uint16_t. - * - * @param uuid The source UUID to convert. - * - * @return The converted integer on success, NULL if the specified UUID is - * not 16 bits. - */ -uint16_t ble_uuid_u16(const ble_uuid_t *uuid); - -#ifdef __cplusplus -} -#endif - -/** - * @} - */ - -#endif /* _BLE_HOST_UUID_H */ diff --git a/bundles/mesh/inc/bluetooth.h b/bundles/mesh/inc/bluetooth.h deleted file mode 100644 index d1ec9d45a..000000000 --- a/bundles/mesh/inc/bluetooth.h +++ /dev/null @@ -1,763 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- - -#ifndef __BLUETOOTH_H -#define __BLUETOOTH_H - -#include - -#define BD_ADDR_LEN 0x06 - -/** - * @brief hci connection handle type - */ -typedef uint16_t hci_con_handle_t; - -/** - * @brief Length of a bluetooth device address. - */ - -/** - * @brief Bluetooth address - */ -typedef uint8_t bd_addr_t[BD_ADDR_LEN]; - -/** - * Address types - * @note: BTstack uses a custom addr type to refer to classic ACL and SCO devices - */ - typedef enum { - BD_ADDR_TYPE_LE_PUBLIC = 0, - BD_ADDR_TYPE_LE_RANDOM = 0x01, - BD_ADDR_TYPE_LE_RESOVLED_PUB = 0x02, - BD_ADDR_TYPE_LE_RESOVLED_RAN = 0x03 -} bd_addr_type_t; - -/** - * @brief link key - */ -#define LINK_KEY_LEN 16 -#define LINK_KEY_STR_LEN (LINK_KEY_LEN*2) -typedef uint8_t link_key_t[LINK_KEY_LEN]; - -/** - * @brief link key type - */ -typedef enum { - COMBINATION_KEY = 0, // standard pairing - LOCAL_UNIT_KEY, // ? - REMOTE_UNIT_KEY, // ? -} link_key_type_t; - -/** - * HCI Transport - */ - -/** - * packet types - used in BTstack and over the H4 UART interface - */ -#define HCI_COMMAND_DATA_PACKET 0x01 -#define HCI_ACL_DATA_PACKET 0x02 -#define HCI_EVENT_PACKET 0x04 //changed to align with spec -#define HCI_COMPLETED_SDU_PACKET 0x0B // for LE credit channel : completed SDU event -#define L2CAP_EVENT_PACKET 0x0A - -// packet header sizes -#define HCI_CMD_HEADER_SIZE 3 -#define HCI_ACL_HEADER_SIZE 4 -#define HCI_SCO_HEADER_SIZE 3 -#define HCI_EVENT_HEADER_SIZE 2 - -/** - * HCI Layer - */ - -// -// Error Codes -// - -// from Bluetooth Core Specification -#define ERROR_CODE_SUCCESS 0x00 -#define ERROR_CODE_UNKNOWN_HCI_COMMAND 0x01 -#define ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 -#define ERROR_CODE_HARDWARE_FAILURE 0x03 -#define ERROR_CODE_PAGE_TIMEOUT 0x04 -#define ERROR_CODE_AUTHENTICATION_FAILURE 0x05 -#define ERROR_CODE_PIN_OR_KEY_MISSING 0x06 -#define ERROR_CODE_MEMORY_CAPACITY_EXCEEDED 0x07 -#define ERROR_CODE_CONNECTION_TIMEOUT 0x08 -#define ERROR_CODE_CONNECTION_LIMIT_EXCEEDED 0x09 -#define ERROR_CODE_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED 0x0A -#define ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS 0x0B -#define ERROR_CODE_COMMAND_DISALLOWED 0x0C -#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D -#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_SECURITY_REASONS 0x0E -#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR 0x0F -#define ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED 0x10 -#define ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE 0x11 -#define ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS 0x12 -#define ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION 0x13 -#define ERROR_CODE_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES 0x14 -#define ERROR_CODE_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER_OFF 0x15 -#define ERROR_CODE_CONNECTION_TERMINATED_BY_LOCAL_HOST 0x16 -#define ERROR_CODE_REPEATED_ATTEMPTS 0x17 -#define ERROR_CODE_PAIRING_NOT_ALLOWED 0x18 -#define ERROR_CODE_UNKNOWN_LMP_PDU 0x19 -#define ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE_UNSUPPORTED_LMP_FEATURE 0x1A -#define ERROR_CODE_SCO_OFFSET_REJECTED 0x1B -#define ERROR_CODE_SCO_INTERVAL_REJECTED 0x1C -#define ERROR_CODE_SCO_AIR_MODE_REJECTED 0x1D -#define ERROR_CODE_INVALID_LMP_PARAMETERS_INVALID_LL_PARAMETERS 0x1E -#define ERROR_CODE_UNSPECIFIED_ERROR 0x1F -#define ERROR_CODE_UNSUPPORTED_LMP_PARAMETER_VALUE_UNSUPPORTED_LL_PARAMETER_VALUE 0x20 -#define ERROR_CODE_ROLE_CHANGE_NOT_ALLOWED 0x21 -#define ERROR_CODE_LMP_RESPONSE_TIMEOUT_LL_RESPONSE_TIMEOUT 0x22 -#define ERROR_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 -#define ERROR_CODE_LMP_PDU_NOT_ALLOWED 0x24 -#define ERROR_CODE_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25 -#define ERROR_CODE_LINK_KEY_CANNOT_BE_CHANGED 0x26 -#define ERROR_CODE_REQUESTED_QOS_NOT_SUPPORTED 0x27 -#define ERROR_CODE_INSTANT_PASSED 0x28 -#define ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29 -#define ERROR_CODE_DIFFERENT_TRANSACTION_COLLISION 0x2A -#define ERROR_CODE_RESERVED 0x2B -#define ERROR_CODE_QOS_UNACCEPTABLE_PARAMETER 0x2C -#define ERROR_CODE_QOS_REJECTED 0x2D -#define ERROR_CODE_CHANNEL_CLASSIFICATION_NOT_SUPPORTED 0x2E -#define ERROR_CODE_INSUFFICIENT_SECURITY 0x2F -#define ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 -// #define ERROR_CODE_RESERVED -#define ERROR_CODE_ROLE_SWITCH_PENDING 0x32 -// #define ERROR_CODE_RESERVED -#define ERROR_CODE_RESERVED_SLOT_VIOLATION 0x34 -#define ERROR_CODE_ROLE_SWITCH_FAILED 0x35 -#define ERROR_CODE_EXTENDED_INQUIRY_RESPONSE_TOO_LARGE 0x36 -#define ERROR_CODE_SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST 0x37 -#define ERROR_CODE_HOST_BUSY_PAIRING 0x38 -#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_NO_SUITABLE_CHANNEL_FOUND 0x39 -#define ERROR_CODE_CONTROLLER_BUSY 0x3A -#define ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS 0x3B -#define ERROR_CODE_DIRECTED_ADVERTISING_TIMEOUT 0x3C -#define ERROR_CODE_CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE 0x3D -#define ERROR_CODE_CONNECTION_FAILED_TO_BE_ESTABLISHED 0x3E -#define ERROR_CODE_MAC_CONNECTION_FAILED 0x3F -#define ERROR_CODE_COARSE_CLOCK_ADJUSTMENT_REJECTED_BUT_WILL_TRY_TO_ADJUST_USING_CLOCK_DRAGGING 0x40 -#define ERROR_CODE_UNKNOWN_ADVERTISING_IDENTIFIER 0x42 -#define ERROR_CODE_LIMIT_REACHED 0x43 -// HCI roles -#define HCI_ROLE_MASTER 0 -#define HCI_ROLE_SLAVE 1 - -// packet sizes (max payload) -#define HCI_ACL_DM1_SIZE 17 -#define HCI_ACL_DH1_SIZE 27 -#define HCI_ACL_2DH1_SIZE 54 -#define HCI_ACL_3DH1_SIZE 83 -#define HCI_ACL_DM3_SIZE 121 -#define HCI_ACL_DH3_SIZE 183 -#define HCI_ACL_DM5_SIZE 224 -#define HCI_ACL_DH5_SIZE 339 -#define HCI_ACL_2DH3_SIZE 367 -#define HCI_ACL_3DH3_SIZE 552 -#define HCI_ACL_2DH5_SIZE 679 -#define HCI_ACL_3DH5_SIZE 1021 - -#define HCI_EVENT_PAYLOAD_SIZE 255 -#define HCI_CMD_PAYLOAD_SIZE 255 - -#define LE_ADVERTISING_DATA_SIZE 31 - -/** - * Default INQ Mode - */ -#define HCI_INQUIRY_LAP 0x9E8B33L // 0x9E8B33: General/Unlimited Inquiry Access Code (GIAC) - -/** - * SSP IO Capabilities - */ -#define SSP_IO_CAPABILITY_DISPLAY_ONLY 0 -#define SSP_IO_CAPABILITY_DISPLAY_YES_NO 1 -#define SSP_IO_CAPABILITY_KEYBOARD_ONLY 2 -#define SSP_IO_CAPABILITY_NO_INPUT_NO_OUTPUT 3 -#define SSP_IO_CAPABILITY_UNKNOWN 0xff - - -/** - * SSP Authentication Requirements, see IO Capability Request Reply Commmand - */ - -// Numeric comparison with automatic accept allowed. -#define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_NO_BONDING 0x00 - -// Use IO Capabilities to deter- mine authentication procedure -#define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_NO_BONDING 0x01 - -// Numeric compar- ison with automatic accept allowed. -#define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_DEDICATED_BONDING 0x02 - -// Use IO Capabilities to determine authentication procedure -#define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_DEDICATED_BONDING 0x03 - -// Numeric Compari- son with automatic accept allowed. -#define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_GENERAL_BONDING 0x04 - -// Use IO capabilities to determine authentication procedure. -#define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_GENERAL_BONDING 0x05 - - -// OGFs -#define OGF_LINK_CONTROL 0x01 -#define OGF_LINK_POLICY 0x02 -#define OGF_CONTROLLER_BASEBAND 0x03 -#define OGF_INFORMATIONAL_PARAMETERS 0x04 -#define OGF_STATUS_PARAMETERS 0x05 -#define OGF_TESTING 0x06 -#define OGF_LE_CONTROLLER 0x08 -#define OGF_VENDOR 0x3f - - -// Events from host controller to host - -/** - * @format 1 - * @param status - */ -#define HCI_EVENT_INQUIRY_COMPLETE 0x01 -// no format yet, can contain multiple results - -/** - * @format 1B11132 - * @param num_responses - * @param bd_addr - * @param page_scan_repetition_mode - * @param reserved1 - * @param reserved2 - * @param class_of_device - * @param clock_offset - */ -#define HCI_EVENT_INQUIRY_RESULT 0x02 - -/** - * @format 12B11 - * @param status - * @param connection_handle - * @param bd_addr - * @param link_type - * @param encryption_enabled - */ -#define HCI_EVENT_CONNECTION_COMPLETE 0x03 -/** - * @format B31 - * @param bd_addr - * @param class_of_device - * @param link_type - */ -#define HCI_EVENT_CONNECTION_REQUEST 0x04 -/** - * @format 121 - * @param status - * @param connection_handle - * @param reason - */ -#define HCI_EVENT_DISCONNECTION_COMPLETE 0x05 -/** - * @format 12 - * @param status - * @param connection_handle - */ -#define HCI_EVENT_AUTHENTICATION_COMPLETE_EVENT 0x06 -/** - * @format 1BN - * @param status - * @param bd_addr - * @param remote_name - */ -#define HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07 -/** - * @format 121 - * @param status - * @param connection_handle - * @param encryption_enabled - */ -#define HCI_EVENT_ENCRYPTION_CHANGE 0x08 -/** - * @format 12 - * @param status - * @param connection_handle - */ -#define HCI_EVENT_CHANGE_CONNECTION_LINK_KEY_COMPLETE 0x09 -/** - * @format 121 - * @param status - * @param connection_handle - * @param key_flag - */ -#define HCI_EVENT_MASTER_LINK_KEY_COMPLETE 0x0A -#define HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE 0x0B -#define HCI_EVENT_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C -#define HCI_EVENT_QOS_SETUP_COMPLETE 0x0D - -/** - * @format 12R - * @param num_hci_command_packets - * @param command_opcode - * @param return_parameters - */ -#define HCI_EVENT_COMMAND_COMPLETE 0x0E -/** - * @format 112 - * @param status - * @param num_hci_command_packets - * @param command_opcode - */ -#define HCI_EVENT_COMMAND_STATUS 0x0F - -/** - * @format 121 - * @param hardware_code - */ -#define HCI_EVENT_HARDWARE_ERROR 0x10 - -#define HCI_EVENT_FLUSH_OCCURED 0x11 - -/** - * @format 1B1 - * @param status - * @param bd_addr - * @param role - */ -#define HCI_EVENT_ROLE_CHANGE 0x12 - -// TODO: number_of_handles 1, connection_handle[H*i], hc_num_of_completed_packets[2*i] -#define HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13 - -/** - * @format 1H12 - * @param status - * @param handle - * @param mode - * @param interval - */ -#define HCI_EVENT_MODE_CHANGE_EVENT 0x14 - -// TODO: num_keys, bd_addr[B*i], link_key[16 octets * i] -#define HCI_EVENT_RETURN_LINK_KEYS 0x15 - -/** - * @format B - * @param bd_addr - */ -#define HCI_EVENT_PIN_CODE_REQUEST 0x16 - -/** - * @format B - * @param bd_addr - */ -#define HCI_EVENT_LINK_KEY_REQUEST 0x17 - -// TODO: bd_addr B, link_key 16octets, key_type 1 -#define HCI_EVENT_LINK_KEY_NOTIFICATION 0x18 - -/** - * @format 1 - * @param link_type - */ -#define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1A - -/** - * @format H1 - * @param handle - * @param lmp_max_slots - */ -#define HCI_EVENT_MAX_SLOTS_CHANGED 0x1B - -/** - * @format 1H2 - * @param status - * @param handle - * @param clock_offset - */ -#define HCI_EVENT_READ_CLOCK_OFFSET_COMPLETE 0x1C - -/** - * @format 1H2 - * @param status - * @param handle - * @param packet_types - */ -#define HCI_EVENT_CONNECTION_PACKET_TYPE_CHANGED 0x1D - -/** - * @format 1B11321 - * @param num_responses - * @param bd_addr - * @param page_scan_repetition_mode - * @param reserved - * @param class_of_device - * @param clock_offset - * @param rssi - */ -#define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22 - -/** - * @format 1HB111221 - * @param status - * @param handle - * @param bd_addr - * @param link_type - * @param transmission_interval - * @param retransmission_interval - * @param rx_packet_length - * @param tx_packet_length - * @param air_mode - */ -#define HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE 0x2C - -// TODO: serialize extended_inquiry_response and provide parser -/** - * @format 1B11321 - * @param num_responses - * @param bd_addr - * @param page_scan_repetition_mode - * @param reserved - * @param class_of_device - * @param clock_offset - * @param rssi - */ -#define HCI_EVENT_EXTENDED_INQUIRY_RESPONSE 0x2F - - /** - * @format 1H - * @param status - * @param handle - */ -#define HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 - -#define HCI_EVENT_IO_CAPABILITY_REQUEST 0x31 -#define HCI_EVENT_IO_CAPABILITY_RESPONSE 0x32 -#define HCI_EVENT_USER_CONFIRMATION_REQUEST 0x33 -#define HCI_EVENT_USER_PASSKEY_REQUEST 0x34 -#define HCI_EVENT_REMOTE_OOB_DATA_REQUEST 0x35 -#define HCI_EVENT_SIMPLE_PAIRING_COMPLETE 0x36 - -#define HCI_EVENT_LE_META 0x3E -/*add the event of BLE dengyiyun*/ -#define HCI_EVENT_AUTHENTICATED_PAYLOAD_TIMEOUT_EXPIRED 0x57 - -#define HCI_EVENT_VENDOR_SPECIFIC 0xFF - - -// add by dengyiyun for event originated in HCI to L2CAP - -#define HCI_EVENT_L2CAP_CONN_PARA_UPDATE_REQUEST 0xFB - -/** - * @format 11H11B2221 - * @param subevent_code - * @param status - * @param connection_handle - * @param role - * @param peer_address_type - * @param peer_address - * @param conn_interval - * @param conn_latency - * @param supervision_timeout - * @param master_clock_accuracy - */ -#define HCI_SUBEVENT_LE_CONNECTION_COMPLETE 0x01 -#define HCI_SUBEVENT_LE_ADVERTISING_REPORT 0x02 -#define HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE 0x03 -#define HCI_SUBEVENT_LE_READ_REMOTE_USED_FEATURES_COMPLETE 0x04 -#define HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST 0x05 -/*+add new subevent of LE event dengyiyun 26-Aug-2016*/ -#define HCI_SUBEVENT_LE_REMOTE_CONNECTION_PARAMETER_REQUEST_COMPLETE 0x06 -#define HCI_SUBEVENT_LE_DATA_LENGTH_CHANGE_EVENT 0x07 -/*-add new subevent of LE event dengyiyun 26-Aug-2016*/ -#define HCI_SUBEVENT_LE_DIRECT_ADVERTISING_REPORT 0x0B -#define HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE 0x0A - -#define HCI_SUBEVENT_LE_PHY_UPDATE_COMPLETE 0X0C -#define HCI_SUBEVENT_LE_EXTENDED_ADVERTISING_REPORT 0X0D -#define HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_SYNC_ESTABLISHED 0X0E -#define HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_REPORT 0X0F -#define HCI_SUBEVENT_LE_PERIODIC_ADVERTISING_SYNC_LOST 0X10 -#define HCI_SUBEVENT_LE_SCAN_TIMEOUT 0X11 -#define HCI_SUBEVENT_LE_ADVERTISING_SET_TERMINATED 0X12 -#define HCI_SUBEVENT_LE_SCAN_REQUEST_RECEIVED 0X13 -#define HCI_SUBEVENT_LE_CHANNEL_SELECTION_ALGORITHM 0X14 - - -// last used HCI_EVENT in 2.1 is 0x3d -// last used HCI_EVENT in 4.1 is 0x57 - -/** - * L2CAP Layer - */ - -#define L2CAP_HEADER_SIZE 4 - -#define L2CAP_SIG_ID_INVALID 0 - -// size of HCI ACL + L2CAP Header for regular data packets (8) -#define COMPLETE_L2CAP_HEADER (HCI_ACL_HEADER_SIZE + L2CAP_HEADER_SIZE) - -// minimum signaling MTU -#define L2CAP_MINIMAL_MTU 48 -#define L2CAP_DEFAULT_MTU 672 - -// Minimum/default MTU -#define L2CAP_LE_DEFAULT_MTU 23 - -// L2CAP Fixed Channel IDs - -#define L2CAP_CID_ATTRIBUTE_PROTOCOL 0x0004 -#define L2CAP_CID_SIGNALING_LE 0x0005 -#define L2CAP_CID_SECURITY_MANAGER_PROTOCOL 0x0006 - -// L2CAP Configuration Result Codes -#define L2CAP_CONF_RESULT_UNKNOWN_OPTIONS 0x0003 - -// L2CAP Reject Result Codes -#define L2CAP_REJ_CMD_UNKNOWN 0x0000 - -// Response Timeout eXpired -#define L2CAP_RTX_TIMEOUT_MS 10000 - -// Extended Response Timeout eXpired -#define L2CAP_ERTX_TIMEOUT_MS 120000 - -// Fixed PSM numbers -#define PSM_SDP 0x01 -#define PSM_RFCOMM 0x03 -#define PSM_BNEP 0x0F -#define PSM_HID_CONTROL 0x11 -#define PSM_HID_INTERRUPT 0x13 - - -/** - * ATT - */ - -// Minimum/default MTU -#define ATT_DEFAULT_MTU 23 - -// MARK: Attribute PDU Opcodes -#define ATT_ERROR_RESPONSE 0x01 - -#define ATT_EXCHANGE_MTU_REQUEST 0x02 -#define ATT_EXCHANGE_MTU_RESPONSE 0x03 - -#define ATT_FIND_INFORMATION_REQUEST 0x04 -#define ATT_FIND_INFORMATION_REPLY 0x05 -#define ATT_FIND_BY_TYPE_VALUE_REQUEST 0x06 -#define ATT_FIND_BY_TYPE_VALUE_RESPONSE 0x07 - -#define ATT_READ_BY_TYPE_REQUEST 0x08 -#define ATT_READ_BY_TYPE_RESPONSE 0x09 -#define ATT_READ_REQUEST 0x0a -#define ATT_READ_RESPONSE 0x0b -#define ATT_READ_BLOB_REQUEST 0x0c -#define ATT_READ_BLOB_RESPONSE 0x0d -#define ATT_READ_MULTIPLE_REQUEST 0x0e -#define ATT_READ_MULTIPLE_RESPONSE 0x0f -#define ATT_READ_BY_GROUP_TYPE_REQUEST 0x10 -#define ATT_READ_BY_GROUP_TYPE_RESPONSE 0x11 - -#define ATT_WRITE_REQUEST 0x12 -#define ATT_WRITE_RESPONSE 0x13 - -#define ATT_PREPARE_WRITE_REQUEST 0x16 -#define ATT_PREPARE_WRITE_RESPONSE 0x17 -#define ATT_EXECUTE_WRITE_REQUEST 0x18 -#define ATT_EXECUTE_WRITE_RESPONSE 0x19 - -#define ATT_HANDLE_VALUE_NOTIFICATION 0x1b -#define ATT_HANDLE_VALUE_INDICATION 0x1d -#define ATT_HANDLE_VALUE_CONFIRMATION 0x1e - - -#define ATT_WRITE_COMMAND 0x52 -#define ATT_SIGNED_WRITE_COMMAND 0xD2 - -// MARK: ATT Error Codes -#define ATT_ERROR_INVALID_HANDLE 0x01 -#define ATT_ERROR_READ_NOT_PERMITTED 0x02 -#define ATT_ERROR_WRITE_NOT_PERMITTED 0x03 -#define ATT_ERROR_INVALID_PDU 0x04 -#define ATT_ERROR_INSUFFICIENT_AUTHENTICATION 0x05 -#define ATT_ERROR_REQUEST_NOT_SUPPORTED 0x06 -#define ATT_ERROR_INVALID_OFFSET 0x07 -#define ATT_ERROR_INSUFFICIENT_AUTHORIZATION 0x08 -#define ATT_ERROR_PREPARE_QUEUE_FULL 0x09 -#define ATT_ERROR_ATTRIBUTE_NOT_FOUND 0x0a -#define ATT_ERROR_ATTRIBUTE_NOT_LONG 0x0b -#define ATT_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE 0x0c -#define ATT_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH 0x0d -#define ATT_ERROR_UNLIKELY_ERROR 0x0e -#define ATT_ERROR_INSUFFICIENT_ENCRYPTION 0x0f -#define ATT_ERROR_UNSUPPORTED_GROUP_TYPE 0x10 -#define ATT_ERROR_INSUFFICIENT_RESOURCES 0x11 - -// MARK: Attribute Property Flags -#define ATT_PROPERTY_BROADCAST 0x01 -#define ATT_PROPERTY_READ 0x02 -#define ATT_PROPERTY_WRITE_WITHOUT_RESPONSE 0x04 -#define ATT_PROPERTY_WRITE 0x08 -#define ATT_PROPERTY_NOTIFY 0x10 -#define ATT_PROPERTY_INDICATE 0x20 -#define ATT_PROPERTY_AUTHENTICATED_SIGNED_WRITE 0x40 -#define ATT_PROPERTY_EXTENDED_PROPERTIES 0x80 - -// MARK: Attribute Property Flag, BTstack extension -// value is asked from client -#define ATT_PROPERTY_DYNAMIC 0x100 -// 128 bit UUID used -#define ATT_PROPERTY_UUID128 0x200 -// Authentication required -#define ATT_PROPERTY_AUTHENTICATION_REQUIRED 0x400 -// Authorization from user required -#define ATT_PROPERTY_AUTHORIZATION_REQUIRED 0x800 -// Encryption key size stored in upper 4 bits, 0 == no encryption, encryption key size - 1 otherwise - -// ATT Transaction Timeout of 30 seconds for Command/Response or Incidationc/Confirmation -#define ATT_TRANSACTION_TIMEOUT_MS 30000 - -#define ATT_TRANSACTION_MODE_NONE 0x0 -#define ATT_TRANSACTION_MODE_ACTIVE 0x1 -#define ATT_TRANSACTION_MODE_EXECUTE 0x2 -#define ATT_TRANSACTION_MODE_CANCEL 0x3 - -// MARK: GATT UUIDs -#define GATT_PRIMARY_SERVICE_UUID 0x2800 -#define GATT_SECONDARY_SERVICE_UUID 0x2801 -#define GATT_INCLUDE_SERVICE_UUID 0x2802 -#define GATT_CHARACTERISTICS_UUID 0x2803 -#define GATT_CHARACTERISTIC_EXTENDED_PROPERTIES 0x2900 -#define GATT_CHARACTERISTIC_USER_DESCRIPTION 0x2901 -#define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION 0x2902 -#define GATT_SERVER_CHARACTERISTICS_CONFIGURATION 0x2903 -#define GATT_CHARACTERISTIC_PRESENTATION_FORMAT 0x2904 -#define GATT_CHARACTERISTIC_AGGREGATE_FORMAT 0x2905 - -#define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE 0 -#define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION 1 -#define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION 2 - -// GAP Service and Characteristics -#define GAP_SERVICE_UUID 0x1800 -#define GAP_DEVICE_NAME_UUID 0x2a00 -#define GAP_APPEARANCE_UUID 0x2a01 -#define GAP_PERIPHERAL_PRIVACY_FLAG 0x2a02 -#define GAP_RECONNECTION_ADDRESS_UUID 0x2a03 -#define GAP_PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS_UUID 0x2a04 -#define GAP_SERVICE_CHANGED 0x2a05 - -/** - * SM - LE Security Manager - */ -// Bluetooth Spec definitions -typedef enum { - SM_CODE_PAIRING_REQUEST = 0X01, - SM_CODE_PAIRING_RESPONSE, - SM_CODE_PAIRING_CONFIRM, - SM_CODE_PAIRING_RANDOM, - SM_CODE_PAIRING_FAILED, - SM_CODE_ENCRYPTION_INFORMATION, - SM_CODE_MASTER_IDENTIFICATION, - SM_CODE_IDENTITY_INFORMATION, - SM_CODE_IDENTITY_ADDRESS_INFORMATION, - SM_CODE_SIGNING_INFORMATION, - SM_CODE_SECURITY_REQUEST -} SECURITY_MANAGER_COMMANDS; - -// IO Capability Values -typedef enum { - IO_CAPABILITY_UNINITIALIZED = -1, - IO_CAPABILITY_DISPLAY_ONLY = 0, - IO_CAPABILITY_DISPLAY_YES_NO, - IO_CAPABILITY_KEYBOARD_ONLY, - IO_CAPABILITY_NO_INPUT_NO_OUTPUT, - IO_CAPABILITY_KEYBOARD_DISPLAY, // not used by secure simple pairing -} io_capability_t; - -// Authentication requirement flags -#define SM_AUTHREQ_NO_BONDING 0x00 -#define SM_AUTHREQ_BONDING 0x01 -#define SM_AUTHREQ_MITM_PROTECTION 0x04 - -// Key distribution flags used by spec -#define SM_KEYDIST_ENC_KEY 0X01 -#define SM_KEYDIST_ID_KEY 0x02 -#define SM_KEYDIST_SIGN 0x04 - -// Key distribution flags used internally -#define SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION 0x01 -#define SM_KEYDIST_FLAG_MASTER_IDENTIFICATION 0x02 -#define SM_KEYDIST_FLAG_IDENTITY_INFORMATION 0x04 -#define SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION 0x08 -#define SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION 0x10 - -// STK Generation Methods -#define SM_STK_GENERATION_METHOD_JUST_WORKS 0x01 -#define SM_STK_GENERATION_METHOD_OOB 0x02 -#define SM_STK_GENERATION_METHOD_PASSKEY 0x04 - -// Pairing Failed Reasons -#define SM_REASON_RESERVED 0x00 -#define SM_REASON_PASSKEYT_ENTRY_FAILED 0x01 -#define SM_REASON_OOB_NOT_AVAILABLE 0x02 -#define SM_REASON_AUTHENTHICATION_REQUIREMENTS 0x03 -#define SM_REASON_CONFIRM_VALUE_FAILED 0x04 -#define SM_REASON_PAIRING_NOT_SUPPORTED 0x05 -#define SM_REASON_ENCRYPTION_KEY_SIZE 0x06 -#define SM_REASON_COMMAND_NOT_SUPPORTED 0x07 -#define SM_REASON_UNSPECIFIED_REASON 0x08 -#define SM_REASON_REPEATED_ATTEMPTS 0x09 -// also, invalid parameters -// and reserved - -// Company identifiers / manufacturers -#define COMPANY_ID_INGCHIPS 0x06AC - -/** Generic UUID type, to be used only as a pointer */ -typedef struct { - /** Type of the UUID */ - uint8_t type; -} ble_uuid_t; - -/** 16-bit UUID */ -typedef struct { - ble_uuid_t u; - uint16_t value; -} ble_uuid16_t; - -/** 32-bit UUID */ -typedef struct { - ble_uuid_t u; - uint32_t value; -} ble_uuid32_t; - -/** 128-bit UUID */ -typedef struct { - ble_uuid_t u; - uint8_t value[16]; -} ble_uuid128_t; - -/** Universal UUID type, to be used for any-UUID static allocation */ -typedef union { - ble_uuid_t u; - ble_uuid16_t u16; - ble_uuid32_t u32; - ble_uuid128_t u128; -} ble_uuid_any_t; - -#endif diff --git a/bundles/mesh/inc/bt_types.h b/bundles/mesh/inc/bt_types.h deleted file mode 100644 index 366b11e41..000000000 --- a/bundles/mesh/inc/bt_types.h +++ /dev/null @@ -1,82 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- - -#ifndef __BT_TYPES_H -#define __BT_TYPES_H -#include -#include "bluetooth.h" -#include "btstack_linked_list.h" - -#define BIT(pos) (1UL<<(pos)) - -typedef enum { - GAP_RANDOM_ADDRESS_OFF = 0, - GAP_RANDOM_ADDRESS_NON_RESOLVABLE, - GAP_RANDOM_ADDRESS_RESOLVABLE, -} gap_random_address_type_t; - -/** - * @brief 128 bit key used with AES128 in Security Manager - */ -typedef uint8_t sm_key_t[16]; - - -// packet handler -typedef void (*btstack_packet_handler_t) (uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size); - -// packet callback supporting multiple registrations -typedef struct { - btstack_linked_item_t item; - btstack_packet_handler_t callback; -} btstack_packet_callback_registration_t; - -// packet handler -typedef void (*user_packet_handler_t) (uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size); - -//macro definition: - -/** - * state of Bluetooth controller - */ -typedef enum { - HCI_POWER_OFF = 0, - HCI_POWER_ON, - HCI_POWER_SLEEP -} HCI_POWER_MODE; - -/** - * State of BTstack - */ -typedef enum { - HCI_STATE_OFF = 0, - HCI_STATE_INITIALIZING, - HCI_STATE_WORKING, - HCI_STATE_HALTING, - HCI_STATE_SLEEPING, - HCI_STATE_FALLING_ASLEEP -} HCI_STATE; - -/** - * @format 1 - * @param state - */ -#define BTSTACK_EVENT_STATE 0x60 - -/** - * @format - */ -#define ATT_EVENT_CAN_SEND_NOW 0xB7 - -#define BTSTACK_EVENT_USER_MSG 0xFF - -#endif - diff --git a/bundles/mesh/inc/btstack_defines.h b/bundles/mesh/inc/btstack_defines.h deleted file mode 100644 index 1ff939afe..000000000 --- a/bundles/mesh/inc/btstack_defines.h +++ /dev/null @@ -1,1062 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- - -#ifndef __BTSTACK_DEFINES_H -#define __BTSTACK_DEFINES_H - -#include - - -// DEFINES - -#define DAEMON_EVENT_PACKET 0x05 - -// L2CAP data -#define L2CAP_DATA_PACKET 0x06 - -// RFCOMM data -#define RFCOMM_DATA_PACKET 0x07 - -// Attribute protocol data -#define ATT_DATA_PACKET 0x08 - -// Security Manager protocol data -#define SM_DATA_PACKET 0x09 - -// SDP query result -// format: type (8), record_id (16), attribute_id (16), attribute_length (16), attribute_value (max 1k) -#define SDP_CLIENT_PACKET 0x0a - -// BNEP data -#define BNEP_DATA_PACKET 0x0b - -// Unicast Connectionless Data -#define UCD_DATA_PACKET 0x0c - -// debug log messages -#define LOG_MESSAGE_PACKET 0xfc - - -// ERRORS - -// last error code in 2.1 is 0x38 - we start with 0x50 for BTstack errors -#define BTSTACK_CONNECTION_TO_BTDAEMON_FAILED 0x50 -#define BTSTACK_ACTIVATION_FAILED_SYSTEM_BLUETOOTH 0x51 -#define BTSTACK_ACTIVATION_POWERON_FAILED 0x52 -#define BTSTACK_ACTIVATION_FAILED_UNKNOWN 0x53 -#define BTSTACK_NOT_ACTIVATED 0x54 -#define BTSTACK_BUSY 0x55 -#define BTSTACK_MEMORY_ALLOC_FAILED 0x56 -#define BTSTACK_ACL_BUFFERS_FULL 0x57 - - -#define BTSTACK_LE_CHANNEL_DISCONNECTED 0x58 -#define BTSTACK_LE_CHANNEL_NOT_EXIST 0x59 - -// l2cap errors - enumeration by the command that created them -#define L2CAP_COMMAND_REJECT_REASON_COMMAND_NOT_UNDERSTOOD 0x60 -#define L2CAP_COMMAND_REJECT_REASON_SIGNALING_MTU_EXCEEDED 0x61 -#define L2CAP_COMMAND_REJECT_REASON_INVALID_CID_IN_REQUEST 0x62 - -#define L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL 0x63 -#define L2CAP_CONNECTION_RESPONSE_RESULT_PENDING 0x64 -#define L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM 0x65 -#define L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY 0x66 -#define L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES 0x67 -#define L2CAP_CONNECTION_RESPONSE_RESULT_RTX_TIMEOUT 0x68 - -#define L2CAP_SERVICE_ALREADY_REGISTERED 0x69 -#define L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU 0x6A - -#define RFCOMM_MULTIPLEXER_STOPPED 0x70 -#define RFCOMM_CHANNEL_ALREADY_REGISTERED 0x71 -#define RFCOMM_NO_OUTGOING_CREDITS 0x72 -#define RFCOMM_AGGREGATE_FLOW_OFF 0x73 -#define RFCOMM_DATA_LEN_EXCEEDS_MTU 0x74 - -#define SDP_HANDLE_ALREADY_REGISTERED 0x80 -#define SDP_QUERY_INCOMPLETE 0x81 -#define SDP_SERVICE_NOT_FOUND 0x82 -#define SDP_HANDLE_INVALID 0x83 -#define SDP_QUERY_BUSY 0x84 - -#define ATT_HANDLE_VALUE_INDICATION_IN_PORGRESS 0x90 -#define ATT_HANDLE_VALUE_INDICATION_TIMEOUT 0x91 - -#define GATT_CLIENT_NOT_CONNECTED 0x93 -#define GATT_CLIENT_BUSY 0x94 -#define GATT_CLIENT_IN_WRONG_STATE 0x95 -#define GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS 0x96 -#define GATT_CLIENT_VALUE_TOO_LONG 0x97 -#define GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED 0x98 -#define GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED 0x99 - -#define BNEP_SERVICE_ALREADY_REGISTERED 0xA0 -#define BNEP_CHANNEL_NOT_CONNECTED 0xA1 -#define BNEP_DATA_LEN_EXCEEDS_MTU 0xA2 - - -// DAEMON COMMANDS - -#define OGF_BTSTACK 0x3d - -// cmds for BTstack -// get state: @returns HCI_STATE -#define BTSTACK_GET_STATE 0x01 - -// set power mode: param HCI_POWER_MODE -#define BTSTACK_SET_POWER_MODE 0x02 - -// set capture mode: param on -#define BTSTACK_SET_ACL_CAPTURE_MODE 0x03 - -// get BTstack version -#define BTSTACK_GET_VERSION 0x04 - -// get system Bluetooth state -#define BTSTACK_GET_SYSTEM_BLUETOOTH_ENABLED 0x05 - -// set system Bluetooth state -#define BTSTACK_SET_SYSTEM_BLUETOOTH_ENABLED 0x06 - -// enable inquiry scan for this client -#define BTSTACK_SET_DISCOVERABLE 0x07 - -// set global Bluetooth state -#define BTSTACK_SET_BLUETOOTH_ENABLED 0x08 - -// create l2cap channel: param bd_addr(48), psm (16) -#define L2CAP_CREATE_CHANNEL 0x20 - -// disconnect l2cap disconnect, param channel(16), reason(8) -#define L2CAP_DISCONNECT 0x21 - -// register l2cap service: param psm(16), mtu (16) -#define L2CAP_REGISTER_SERVICE 0x22 - -// unregister l2cap disconnect, param psm(16) -#define L2CAP_UNREGISTER_SERVICE 0x23 - -// accept connection param bd_addr(48), dest cid (16) -#define L2CAP_ACCEPT_CONNECTION 0x24 - -// decline l2cap disconnect,param bd_addr(48), dest cid (16), reason(8) -#define L2CAP_DECLINE_CONNECTION 0x25 - -// create l2cap channel: param bd_addr(48), psm (16), mtu (16) -#define L2CAP_CREATE_CHANNEL_MTU 0x26 - -// register SDP Service Record: service record (size) -#define SDP_REGISTER_SERVICE_RECORD 0x30 - -// unregister SDP Service Record -#define SDP_UNREGISTER_SERVICE_RECORD 0x31 - -// Get remote RFCOMM services -#define SDP_CLIENT_QUERY_RFCOMM_SERVICES 0x32 - -// Get remote SDP services -#define SDP_CLIENT_QUERY_SERVICES 0x33 - -// RFCOMM "HCI" Commands -#define RFCOMM_CREATE_CHANNEL 0x40 -#define RFCOMM_DISCONNECT 0x41 -#define RFCOMM_REGISTER_SERVICE 0x42 -#define RFCOMM_UNREGISTER_SERVICE 0x43 -#define RFCOMM_ACCEPT_CONNECTION 0x44 -#define RFCOMM_DECLINE_CONNECTION 0x45 -#define RFCOMM_PERSISTENT_CHANNEL 0x46 -#define RFCOMM_CREATE_CHANNEL_WITH_CREDITS 0x47 -#define RFCOMM_REGISTER_SERVICE_WITH_CREDITS 0x48 -#define RFCOMM_GRANT_CREDITS 0x49 - -// GAP Classic 0x50 -#define GAP_DISCONNECT 0x50 - -// GAP LE 0x60 -#define GAP_LE_SCAN_START 0x60 -#define GAP_LE_SCAN_STOP 0x61 -#define GAP_LE_CONNECT 0x62 -#define GAP_LE_CONNECT_CANCEL 0x63 -#define GAP_LE_SET_SCAN_PARAMETERS 0x64 - -// GATT (Client) 0x70 -#define GATT_DISCOVER_ALL_PRIMARY_SERVICES 0x70 -#define GATT_DISCOVER_PRIMARY_SERVICES_BY_UUID16 0x71 -#define GATT_DISCOVER_PRIMARY_SERVICES_BY_UUID128 0x72 -#define GATT_FIND_INCLUDED_SERVICES_FOR_SERVICE 0x73 -#define GATT_DISCOVER_CHARACTERISTICS_FOR_SERVICE 0x74 -#define GATT_DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID128 0x75 -#define GATT_DISCOVER_CHARACTERISTIC_DESCRIPTORS 0x76 -#define GATT_READ_VALUE_OF_CHARACTERISTIC 0x77 -#define GATT_READ_LONG_VALUE_OF_CHARACTERISTIC 0x78 -#define GATT_WRITE_VALUE_OF_CHARACTERISTIC_WITHOUT_RESPONSE 0x79 -#define GATT_WRITE_VALUE_OF_CHARACTERISTIC 0x7A -#define GATT_WRITE_LONG_VALUE_OF_CHARACTERISTIC 0x7B -#define GATT_RELIABLE_WRITE_LONG_VALUE_OF_CHARACTERISTIC 0x7C -#define GATT_READ_CHARACTERISTIC_DESCRIPTOR 0X7D -#define GATT_READ_LONG_CHARACTERISTIC_DESCRIPTOR 0X7E -#define GATT_WRITE_CHARACTERISTIC_DESCRIPTOR 0X7F -#define GATT_WRITE_LONG_CHARACTERISTIC_DESCRIPTOR 0X80 -#define GATT_WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION 0X81 -#define GATT_GET_MTU 0x82 - -// hci con handles (12 bit): 0x0000..0x0fff -#define HCI_CON_HANDLE_INVALID 0xffff - -// EVENTS - - - -// data: event(8), len(8), nr hci connections -#define BTSTACK_EVENT_NR_CONNECTIONS_CHANGED 0x61 - -/** - * @format - */ -#define BTSTACK_EVENT_POWERON_FAILED 0x62 - -/** - * @format 1 - * @param discoverable - */ -#define BTSTACK_EVENT_DISCOVERABLE_ENABLED 0x66 - -// Daemon Events - -/** - * @format 112 - * @param major - * @param minor - @ @param revision - */ -#define DAEMON_EVENT_VERSION 0x63 - -// data: system bluetooth on/off (bool) -/** - * @format 1 - * param system_bluetooth_enabled - */ -#define DAEMON_EVENT_SYSTEM_BLUETOOTH_ENABLED 0x64 - -// data: event (8), len(8), status (8) == 0, address (48), name (1984 bits = 248 bytes) - -/* - * @format 1BT - * @param status == 0 to match read_remote_name_request - * @param address - * @param name - */ -#define DAEMON_EVENT_REMOTE_NAME_CACHED 0x65 - -// internal - data: event(8) -#define DAEMON_EVENT_CONNECTION_OPENED 0x67 - -// internal - data: event(8) -#define DAEMON_EVENT_CONNECTION_CLOSED 0x68 - -// data: event(8), len(8), local_cid(16), credits(8) -#define DAEMON_EVENT_L2CAP_CREDITS 0x74 - -/** - * @format 12 - * @param status - * @param psm - */ -#define DAEMON_EVENT_L2CAP_SERVICE_REGISTERED 0x75 - -/** - * @format 21 - * @param rfcomm_cid - * @param credits - */ -#define DAEMON_EVENT_RFCOMM_CREDITS 0x84 - -/** - * @format 11 - * @param status - * @param channel_id - */ -#define DAEMON_EVENT_RFCOMM_SERVICE_REGISTERED 0x85 - -/** - * @format 11 - * @param status - * @param server_channel_id - */ -#define DAEMON_EVENT_RFCOMM_PERSISTENT_CHANNEL 0x86 - -/** - * @format 14 - * @param status - * @param service_record_handle - */ -#define DAEMON_EVENT_SDP_SERVICE_REGISTERED 0x90 - - - -// additional HCI events - -/** - * @brief Outgoing packet - */ -#define HCI_EVENT_TRANSPORT_PACKET_SENT 0x6E - -/** - * @format B - * @param handle - */ -#define HCI_EVENT_SCO_CAN_SEND_NOW 0x6F - - -// L2CAP EVENTS - -/** - * @format 1BH222222 - * @param status - * @param address - * @param handle - * @param psm - * @param local_cid - * @param remote_cid - * @param local_mtu - * @param remote_mtu - * @param flush_timeout - */ -#define L2CAP_EVENT_CHANNEL_OPENED 0x70 - -/* - * @format 2 - * @param local_cid - */ -#define L2CAP_EVENT_CHANNEL_CLOSED 0x71 - -/** - * @format BH222 - * @param address - * @param handle - * @param psm - * @param local_cid - * @param remote_cid - */ -#define L2CAP_EVENT_INCOMING_CONNECTION 0x72 - -// ?? -// data: event(8), len(8), handle(16) -#define L2CAP_EVENT_TIMEOUT_CHECK 0x73 - -/** - * @format H2222 - * @param handle - * @param interval_min - * @param interval_max - * @param latencey - * @param timeout_multiplier - */ -#define L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST 0x76 - -// data: event(8), len(8), handle(16), result (16) (0 == ok, 1 == fail) - /** - * @format H2 - * @param handle - * @result - */ -#define L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE 0x77 - -/** - * @format 2 - * @param local_cid - */ -#define L2CAP_EVENT_CAN_SEND_NOW 0x78 - -// RFCOMM EVENTS - -/** - * @format 1B2122 - * @param status - * @param bd_addr - * @param con_handle - * @param server_channel - * @param rfcomm_cid - * @param max_frame_size - */ -#define RFCOMM_EVENT_CHANNEL_OPENED 0x80 - -/** - * @format 2 - * @param rfcomm_cid - */ -#define RFCOMM_EVENT_CHANNEL_CLOSED 0x81 - -/** - * @format B12 - * @param bd_addr - * @param server_channel - * @param rfcomm_cid - */ -#define RFCOMM_EVENT_INCOMING_CONNECTION 0x82 - -/** - * @format 21 - * @param rfcomm_cid - * @param line_status - */ -#define RFCOMM_EVENT_REMOTE_LINE_STATUS 0x83 - -/** - * @format 21 - * @param rfcomm_cid - * @param modem_status - */ -#define RFCOMM_EVENT_REMOTE_MODEM_STATUS 0x87 - - /** - * TODO: format for variable data 2? - * param rfcomm_cid - * param rpn_data - */ -#define RFCOMM_EVENT_PORT_CONFIGURATION 0x88 - -/** - * @format 2 - * @param rfcomm_cid - */ -#define RFCOMM_EVENT_CAN_SEND_NOW 0x89 - - -/** - * @format 1 - * @param status - */ -#define SDP_EVENT_QUERY_COMPLETE 0x91 - -/** - * @format 1T - * @param rfcomm_channel - * @param name - */ -#define SDP_EVENT_QUERY_RFCOMM_SERVICE 0x92 - -/** - * @format 22221 - * @param record_id - * @param attribute_id - * @param attribute_length - * @param data_offset - * @param data - */ -#define SDP_EVENT_QUERY_ATTRIBUTE_BYTE 0x93 - -/** - * @format 22LV - * @param record_id - * @param attribute_id - * @param attribute_length - * @param attribute_value - */ -#define SDP_EVENT_QUERY_ATTRIBUTE_VALUE 0x94 - -/** - * @format 224 - * @param total_count - * @param record_index - * @param record_handle - * @note Not provided by daemon, only used for internal testing - */ -#define SDP_EVENT_QUERY_SERVICE_RECORD_HANDLE 0x95 - -/** - * @format H1 - * @param handle - * @param status - */ -#define GATT_EVENT_QUERY_COMPLETE 0xA0 - -/** - * @format HX - * @param handle - * @param service - */ -#define GATT_EVENT_SERVICE_QUERY_RESULT 0xA1 - -/** - * @format HY - * @param handle - * @param characteristic - */ -#define GATT_EVENT_CHARACTERISTIC_QUERY_RESULT 0xA2 - -/** - * @format H2X - * @param handle - * @param include_handle - * @param service - */ -#define GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT 0xA3 - -/** - * @format HZ - * @param handle - * @param characteristic_descriptor - */ -#define GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT 0xA4 - -/** - * @format H2LV - * @param handle - * @param value_handle - * @param value_length - * @param value - */ -#define GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT 0xA5 - -/** - * @format H22LV - * @param handle - * @param value_handle - * @param value_offset - * @param value_length - * @param value - */ -#define GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT 0xA6 - -/** - * @format H2LV - * @param handle - * @param value_handle - * @param value_length - * @param value - */ -#define GATT_EVENT_NOTIFICATION 0xA7 - -/** - * @format H2LV - * @param handle - * @param value_handle - * @param value_length - * @param value - */ -#define GATT_EVENT_INDICATION 0xA8 - -/** - * @format H2LV - * @param descriptor_handle - * @param descriptor_length - * @param descriptor - */ -#define GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT 0xA9 - -/** - * @format H2LV - * @param handle - * @param descriptor_offset - * @param descriptor_length - * @param descriptor - */ -#define GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT 0xAA - -/** - * @format H2 - * @param handle - * @param MTU - */ -#define GATT_EVENT_MTU 0xAB - -/** - * @format H2 - * @param handle - * @param MTU - */ -#define ATT_EVENT_MTU_EXCHANGE_COMPLETE 0xB5 - - /** - * @format 1H2 - * @param status - * @param conn_handle - * @param attribute_handle - */ -#define ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE 0xB6 - - -// TODO: daemon only event - -/** - * @format 12 - * @param status - * @param service_uuid - */ - #define BNEP_EVENT_SERVICE_REGISTERED 0xC0 - -/** - * @format 12222B - * @param status - * @param bnep_cid - * @param source_uuid - * @param destination_uuid - * @param mtu - * @param remote_address - */ - #define BNEP_EVENT_CHANNEL_OPENED 0xC1 - -/** - * @format 222B - * @param bnep_cid - * @param source_uuid - * @param destination_uuid - * @param remote_address - */ - #define BNEP_EVENT_CHANNEL_CLOSED 0xC2 - -/** - * @format 222B1 - * @param bnep_cid - * @param source_uuid - * @param destination_uuid - * @param remote_address - * @param channel_state - */ -#define BNEP_EVENT_CHANNEL_TIMEOUT 0xC3 - -/** - * @format 222B - * @param bnep_cid - * @param source_uuid - * @param destination_uuid - * @param remote_address - */ - #define BNEP_EVENT_CAN_SEND_NOW 0xC4 - - /** - * @format H1B - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_JUST_WORKS_REQUEST 0xD0 - - /** - * @format H1B - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_JUST_WORKS_CANCEL 0xD1 - - /** - * @format H1B4 - * @param handle - * @param addr_type - * @param address - * @param passkey - */ -#define SM_EVENT_PASSKEY_DISPLAY_NUMBER 0xD2 - - /** - * @format H1B - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_PASSKEY_DISPLAY_CANCEL 0xD3 - - /** - * @format H1B421 - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_PASSKEY_INPUT_NUMBER 0xD4 - - /** - * @format H1B - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_PASSKEY_INPUT_CANCEL 0xD5 - - /** - * @format H1B - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_IDENTITY_RESOLVING_STARTED 0xD6 - - /** - * @format H1B - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_IDENTITY_RESOLVING_FAILED 0xD7 - - /** - * @format H1B2 - * @param handle - * @param addr_type - * @param address - * @param le_device_db_index - */ -#define SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED 0xD8 - - /** - * @format H1B - * @param handle - * @param addr_type - * @param address - */ -#define SM_EVENT_AUTHORIZATION_REQUEST 0xD9 - - /** - * @format H1B1 - * @param handle - * @param addr_type - * @param address - * @param authorization_result - */ -#define SM_EVENT_AUTHORIZATION_RESULT 0xDA - - /** - * @format H1B1 - * @param handle - * @param new private resolvable/non-resolvable address - */ -#define SM_EVENT_PRIVATE_RANDOM_ADDR_UPDATE 0xDB - -// GAP - -/** - * @format H1 - * @param handle - * @param security_level - */ -#define GAP_EVENT_SECURITY_LEVEL 0xE0 - -/** - * @format 1B - * @param status - * @param address - */ -#define GAP_EVENT_DEDICATED_BONDING_COMPLETED 0xE1 - -/** - * @format 11B1JV - * @param advertising_event_type - * @param address_type - * @param address - * @param rssi - * @param data_length - * @param data - */ - -// Meta Events, see below for sub events -#define HCI_EVENT_HSP_META 0xE8 -#define HCI_EVENT_HFP_META 0xE9 -#define HCI_EVENT_ANCS_META 0xEA - -// Potential other meta groups - // #define HCI_EVENT_BNEP_META 0xxx -// #define HCI_EVENT_GAP_META 0xxx -// #define HCI_EVENT_GATT_META 0xxx -// #define HCI_EVENT_PAN_META 0xxx -// #define HCI_EVENT_SDP_META 0xxx -// #define HCI_EVENT_SM_META 0xxx - - -/** HSP Subevent */ - -/** - * @format 11 - * @param subevent_code - * @param status 0 == OK - */ -#define HSP_SUBEVENT_RFCOMM_CONNECTION_COMPLETE 0x01 - -/** - * @format 11 - * @param subevent_code - * @param status 0 == OK - */ -#define HSP_SUBEVENT_RFCOMM_DISCONNECTION_COMPLETE 0x02 - - -/** - * @format 11H - * @param subevent_code - * @param status 0 == OK - * @param handle - */ -#define HSP_SUBEVENT_AUDIO_CONNECTION_COMPLETE 0x03 - -/** - * @format 11 - * @param subevent_code - * @param status 0 == OK - */ -#define HSP_SUBEVENT_AUDIO_DISCONNECTION_COMPLETE 0x04 - -/** - * @format 1 - * @param subevent_code - */ -#define HSP_SUBEVENT_RING 0x05 - -/** - * @format 11 - * @param subevent_code - * @param gain Valid range: [0,15] - */ -#define HSP_SUBEVENT_MICROPHONE_GAIN_CHANGED 0x06 - -/** - * @format 11 - * @param subevent_code - * @param gain Valid range: [0,15] - */ -#define HSP_SUBEVENT_SPEAKER_GAIN_CHANGED 0x07 - -/** - * @format 1JV - * @param subevent_code - * @param value_length - * @param value - */ -#define HSP_SUBEVENT_HS_COMMAND 0x08 - -/** - * @format 1JV - * @param subevent_code - * @param value_length - * @param value - */ -#define HSP_SUBEVENT_AG_INDICATION 0x09 - - -/** HFP Subevent */ - -/** - * @format 11H - * @param subevent_code - * @param status 0 == OK - * @param con_handle - */ -#define HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_ESTABLISHED 0x01 - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_SERVICE_LEVEL_CONNECTION_RELEASED 0x02 - -/** - * @format 11H - * @param subevent_code - * @param status 0 == OK - * @param handle - */ -#define HFP_SUBEVENT_AUDIO_CONNECTION_ESTABLISHED 0x03 - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_AUDIO_CONNECTION_RELEASED 0x04 - -/** - * @format 11 - * @param subevent_code - * @param status 0 == OK - */ -#define HFP_SUBEVENT_COMPLETE 0x05 - -/** - * @format 111T - * @param subevent_code - * @param indicator_index - * @param indicator_status - * @param indicator_name - */ -#define HFP_SUBEVENT_AG_INDICATOR_STATUS_CHANGED 0x06 - -/** - * @format 1111T - * @param subevent_code - * @param network_operator_mode - * @param network_operator_format - * @param network_operator_name - */ -#define HFP_SUBEVENT_NETWORK_OPERATOR_CHANGED 0x07 - -/** - * @format 11 - * @param subevent_code - * @param error - */ -#define HFP_SUBEVENT_EXTENDED_AUDIO_GATEWAY_ERROR 0x08 - -/** - * @format 11 - * @param subevent_code - * @param status - */ -#define HFP_SUBEVENT_CODECS_CONNECTION_COMPLETE 0x09 - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_START_RINGINIG 0x0A - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_STOP_RINGINIG 0x0B - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_CALL_TERMINATED 0x0C - -/** - * @format 1T - * @param subevent_code - * @param number - */ -#define HFP_SUBEVENT_PLACE_CALL_WITH_NUMBER 0x0D - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_ATTACH_NUMBER_TO_VOICE_TAG 0x0E - -/** - * @format 1T - * @param subevent_code - * @param number - */ -#define HFP_SUBEVENT_NUMBER_FOR_VOICE_TAG 0x0F - -/** - * @format 1T - * @param subevent_code - * @param dtmf code - */ -#define HFP_SUBEVENT_TRANSMIT_DTMF_CODES 0x10 - -/** - * @format 1 - * @param subevent_code - */ - #define HFP_SUBEVENT_CALL_ANSWERED 0x11 - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_CONFERENCE_CALL 0x12 - -/** - * @format 1 - * @param subevent_code - */ -#define HFP_SUBEVENT_RING 0x13 - -/** - * @format 111 - * @param subevent_code - * @param status - * @param gain - */ - #define HFP_SUBEVENT_SPEAKER_VOLUME 0x14 - -/** - * @format 111 - * @param subevent_code - * @param status - * @param gain - */ -#define HFP_SUBEVENT_MICROPHONE_VOLUME 0x15 - -/** - * @format 11T - * @param subevent_code - * @param type - * @param number - */ -#define HFP_SUBEVENT_CALL_WAITING_NOTIFICATION 0x16 - -/** - * @format 11T - * @param subevent_code - * @param type - * @param number - */ -#define HFP_SUBEVENT_CALLING_LINE_INDETIFICATION_NOTIFICATION 0x17 - -/** - * @format 111111T - * @param subevent_code - * @param clcc_idx - * @param clcc_dir - * @param clcc_status - * @param clcc_mpty - * @param bnip_type - * @param bnip_number - */ -#define HFP_SUBEVENT_ENHANCED_CALL_STATUS 0x18 - -/** - * @format 111T - * @param subevent_code - * @param status - * @param bnip_type - * @param bnip_number - */ - #define HFP_SUBEVENT_SUBSCRIBER_NUMBER_INFORMATION 0x19 - -/** - * @format 1T - * @param subevent_code - * @param value - */ -#define HFP_SUBEVENT_RESPONSE_AND_HOLD_STATUS 0x1A - -// ANCS Client - -/** - * @format 1H - * @param subevent_code - * @param handle - */ -#define ANCS_SUBEVENT_CLIENT_CONNECTED 0xF0 - -/** - * @format 1H2T - * @param subevent_code - * @param handle - * @param attribute_id - * @param text - */ -#define ANCS_SUBEVENT_CLIENT_NOTIFICATION 0xF1 - -/** - * @format 1H - * @param subevent_code - * @param handle - */ -#define ANCS_SUBEVENT_CLIENT_DISCONNECTED 0xF2 - -#endif diff --git a/bundles/mesh/inc/btstack_event.h b/bundles/mesh/inc/btstack_event.h deleted file mode 100644 index 515f75390..000000000 --- a/bundles/mesh/inc/btstack_event.h +++ /dev/null @@ -1,991 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- - -#ifndef __BTSTACK_EVENT_H -#define __BTSTACK_EVENT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "bluetooth.h" -#include "compiler.h" -#include "btstack_util.h" -#include "gap.h" - -/* API_START */ - -#ifdef C2NIM -#define decode_event_offset(packet, T, offset) ((const T *)((const int32_t)(packet) + offset)) -#else -#define decode_event_offset(packet, T, offset) ((const T *)((int32_t)(packet) + offset)) -#endif - -/** - * @brief Get event type - * @param event - * @return type of event - */ -static __INLINE uint8_t hci_event_packet_get_type(const uint8_t * event){ - - return *event; -} - -/** - * User messge - */ -typedef struct btstack_user_msg -{ - uint32_t msg_id; - void *data; - uint16_t len; -} btstack_user_msg_t; - -/** - * @brief Get user message - * @param event - * @return type of event - */ -static __INLINE const btstack_user_msg_t *hci_event_packet_get_user_msg(const uint8_t * event){ - - return decode_event_offset(event, btstack_user_msg_t, 4); -} - -/** - * @brief post a msg to btstack task, and handle it in the context of btstack task - * @param msg_id (Max allowed ID: 0x80000000) - * @param data - * @param len - * @return 0 if success; else error occured - */ -uint32_t btstack_push_user_msg(uint32_t msg_id, const void *data, const uint16_t len); - -/*** - * @brief Get subevent code for le event - * @param event packet - * @return subevent_code - */ -static __INLINE uint8_t hci_event_le_meta_get_subevent_code(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} - -#pragma pack(push, 1) - -typedef struct -{ - uint8_t status; - uint16_t conn_handle; - uint8_t enabled; -} hci_encryption_change_event_t; - -/** - * @brief Get field status from event HCI_EVENT_ENCRYPTION_CHANGE - * @param event packet - * @return status - * @note: btstack_type 1 - */ -static __INLINE uint8_t hci_event_encryption_change_get_status(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} -/** - * @brief Get field connection_handle from event HCI_EVENT_ENCRYPTION_CHANGE - * @param event packet - * @return connection_handle - * @note: btstack_type 2 - */ -static __INLINE uint16_t hci_event_encryption_change_get_connection_handle(const uint8_t * event){ - return little_endian_read_16(event, 3); -} -/** - * @brief Get field encryption_enabled from event HCI_EVENT_ENCRYPTION_CHANGE - * @param event packet - * @return encryption_enabled - * @note: btstack_type 1 - */ -static __INLINE uint8_t hci_event_encryption_change_get_encryption_enabled(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 5); -} - - -/** - * @brief Get field num_hci_command_packets from event HCI_EVENT_COMMAND_COMPLETE - * @param event packet - * @return num_hci_command_packets - * @note: btstack_type 1 - */ -static __INLINE uint8_t hci_event_command_complete_get_num_hci_command_packets(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} -/** - * @brief Get field command_opcode from event HCI_EVENT_COMMAND_COMPLETE - * @param event packet - * @return command_opcode - * @note: btstack_type 2 - */ -static __INLINE uint16_t hci_event_command_complete_get_command_opcode(const uint8_t * event){ - return little_endian_read_16(event, 3); -} -/** - * @brief Get field return_parameters from event HCI_EVENT_COMMAND_COMPLETE - * @param event packet - * @return return_parameters - * @note: btstack_type R - */ -static __INLINE const uint8_t * hci_event_command_complete_get_return_parameters(const uint8_t * event){ - return decode_event_offset(event, uint8_t, 5); -} - -/** - * @brief Get field status from event HCI_EVENT_COMMAND_STATUS - * @param event packet - * @return status - * @note: btstack_type 1 - */ -static __INLINE uint8_t hci_event_command_status_get_status(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} -/** - * @brief Get field num_hci_command_packets from event HCI_EVENT_COMMAND_STATUS - * @param event packet - * @return num_hci_command_packets - * @note: btstack_type 1 - */ -static __INLINE uint8_t hci_event_command_status_get_num_hci_command_packets(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 3); -} -/** - * @brief Get field command_opcode from event HCI_EVENT_COMMAND_STATUS - * @param event packet - * @return command_opcode - * @note: btstack_type 2 - */ -static __INLINE uint16_t hci_event_command_status_get_command_opcode(const uint8_t * event){ - return little_endian_read_16(event, 4); -} - -/** - * @brief Get field hardware_code from event HCI_EVENT_HARDWARE_ERROR - * @param event packet - * @return hardware_code - * @note: btstack_type 1 - */ -static __INLINE uint8_t hci_event_hardware_error_get_hardware_code(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} - -/** - * @brief Get field status from event HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE - * @param event packet - * @return status - * @note: btstack_type 1 - */ -static __INLINE uint8_t hci_event_encryption_key_refresh_complete_get_status(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} -/** - * @brief Get field handle from event HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t hci_event_encryption_key_refresh_complete_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 3); -} - -/** - * @brief Get field state from event BTSTACK_EVENT_STATE - * @param event packet - * @return state - * @note: btstack_type 1 - */ -static __INLINE uint8_t btstack_event_state_get_state(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} - - -/** - * @brief Get field discoverable from event BTSTACK_EVENT_DISCOVERABLE_ENABLED - * @param event packet - * @return discoverable - * @note: btstack_type 1 - */ -static __INLINE uint8_t btstack_event_discoverable_enabled_get_discoverable(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} - -/** - * @brief Get field handle from event L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t l2cap_event_connection_parameter_update_request_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field interval_min from event L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST - * @param event packet - * @return interval_min - * @note: btstack_type 2 - */ -static __INLINE uint16_t l2cap_event_connection_parameter_update_request_get_interval_min(const uint8_t * event){ - return little_endian_read_16(event, 4); -} -/** - * @brief Get field interval_max from event L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST - * @param event packet - * @return interval_max - * @note: btstack_type 2 - */ -static __INLINE uint16_t l2cap_event_connection_parameter_update_request_get_interval_max(const uint8_t * event){ - return little_endian_read_16(event, 6); -} -/** - * @brief Get field latencey from event L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST - * @param event packet - * @return latencey - * @note: btstack_type 2 - */ -static __INLINE uint16_t l2cap_event_connection_parameter_update_request_get_latencey(const uint8_t * event){ - return little_endian_read_16(event, 8); -} -/** - * @brief Get field timeout_multiplier from event L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_REQUEST - * @param event packet - * @return timeout_multiplier - * @note: btstack_type 2 - */ -static __INLINE uint16_t l2cap_event_connection_parameter_update_request_get_timeout_multiplier(const uint8_t * event){ - return little_endian_read_16(event, 10); -} - -/** - * @brief Get field handle from event L2CAP_EVENT_CONNECTION_PARAMETER_UPDATE_RESPONSE - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t l2cap_event_connection_parameter_update_response_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} - -/** - * @brief Get field local_cid from event L2CAP_EVENT_CAN_SEND_NOW - * @param event packet - * @return local_cid - * @note: btstack_type 2 - */ -static __INLINE uint16_t l2cap_event_can_send_now_get_local_cid(const uint8_t * event){ - return little_endian_read_16(event, 2); -} - -/** - * @brief Get field handle from event ATT_EVENT_MTU_EXCHANGE_COMPLETE - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t att_event_mtu_exchange_complete_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} - -/** - * @brief Get field MTU from event ATT_EVENT_MTU_EXCHANGE_COMPLETE - * @param event packet - * @return MTU - * @note: btstack_type 2 - */ -static __INLINE uint16_t att_event_mtu_exchange_complete_get_MTU(const uint8_t * event){ - return little_endian_read_16(event, 4); -} - -/** - * @brief Get field status from event ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE - * @param event packet - * @return status - * @note: btstack_type 1 - */ -static __INLINE uint8_t att_event_handle_value_indication_complete_get_status(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} -/** - * @brief Get field conn_handle from event ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE - * @param event packet - * @return conn_handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t att_event_handle_value_indication_complete_get_conn_handle(const uint8_t * event){ - return little_endian_read_16(event, 3); -} -/** - * @brief Get field attribute_handle from event ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE - * @param event packet - * @return attribute_handle - * @note: btstack_type 2 - */ -static __INLINE uint16_t att_event_handle_value_indication_complete_get_attribute_handle(const uint8_t * event){ - return little_endian_read_16(event, 5); -} - -/** - * @brief Get field handle from event SM_EVENT_JUST_WORKS_REQUEST - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_just_works_request_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_JUST_WORKS_REQUEST - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_just_works_request_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_JUST_WORKS_REQUEST - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_just_works_request_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_JUST_WORKS_CANCEL - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_just_works_cancel_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_JUST_WORKS_CANCEL - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_just_works_cancel_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_JUST_WORKS_CANCEL - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_just_works_cancel_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_PASSKEY_DISPLAY_NUMBER - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_passkey_display_number_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_PASSKEY_DISPLAY_NUMBER - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_passkey_display_number_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_PASSKEY_DISPLAY_NUMBER - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_passkey_display_number_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} -/** - * @brief Get field passkey from event SM_EVENT_PASSKEY_DISPLAY_NUMBER - * @param event packet - * @return passkey - * @note: btstack_type 4 - */ -static __INLINE uint32_t sm_event_passkey_display_number_get_passkey(const uint8_t * event){ - return little_endian_read_32(event, 11); -} - -/** - * @brief Get field handle from event SM_EVENT_PASSKEY_DISPLAY_CANCEL - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_passkey_display_cancel_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_PASSKEY_DISPLAY_CANCEL - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_passkey_display_cancel_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_PASSKEY_DISPLAY_CANCEL - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_passkey_display_cancel_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_PASSKEY_INPUT_NUMBER - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_passkey_input_number_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_PASSKEY_INPUT_NUMBER - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_passkey_input_number_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_PASSKEY_INPUT_NUMBER - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_passkey_input_number_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_PASSKEY_INPUT_CANCEL - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_passkey_input_cancel_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_PASSKEY_INPUT_CANCEL - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_passkey_input_cancel_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_PASSKEY_INPUT_CANCEL - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_passkey_input_cancel_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_IDENTITY_RESOLVING_STARTED - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_identity_resolving_started_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_IDENTITY_RESOLVING_STARTED - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_identity_resolving_started_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_IDENTITY_RESOLVING_STARTED - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_identity_resolving_started_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_IDENTITY_RESOLVING_FAILED - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_identity_resolving_failed_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_IDENTITY_RESOLVING_FAILED - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_identity_resolving_failed_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_IDENTITY_RESOLVING_FAILED - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_identity_resolving_failed_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_identity_resolving_succeeded_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_identity_resolving_succeeded_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_identity_resolving_succeeded_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} -/** - * @brief Get field le_device_db_index from event SM_EVENT_IDENTITY_RESOLVING_SUCCEEDED - * @param event packet - * @return le_device_db_index - * @note: btstack_type 2 - */ -static __INLINE uint16_t sm_event_identity_resolving_succeeded_get_le_device_db_index(const uint8_t * event){ - return little_endian_read_16(event, 11); -} - -/** - * @brief Get field handle from event SM_EVENT_AUTHORIZATION_REQUEST - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_authorization_request_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_AUTHORIZATION_REQUEST - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_authorization_request_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_AUTHORIZATION_REQUEST - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_authorization_request_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} - -/** - * @brief Get field handle from event SM_EVENT_AUTHORIZATION_RESULT - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t sm_event_authorization_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field addr_type from event SM_EVENT_AUTHORIZATION_RESULT - * @param event packet - * @return addr_type - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_authorization_result_get_addr_type(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} -/** - * @brief Get field address from event SM_EVENT_AUTHORIZATION_RESULT - * @param event packet - * @param Pointer to storage for address - * @note: btstack_type B - */ -static __INLINE void sm_event_authorization_result_get_address(const uint8_t * event, uint8_t * address){ - reverse_bd_addr(decode_event_offset(event, uint8_t, 5), address); -} -/** - * @brief Get field authorization_result from event SM_EVENT_AUTHORIZATION_RESULT - * @param event packet - * @return authorization_result - * @note: btstack_type 1 - */ -static __INLINE uint8_t sm_event_authorization_result_get_authorization_result(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 11); -} - -/** - * @brief Get field handle from event GAP_EVENT_SECURITY_LEVEL - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gap_event_security_level_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field security_level from event GAP_EVENT_SECURITY_LEVEL - * @param event packet - * @return security_level - * @note: btstack_type 1 - */ -static __INLINE uint8_t gap_event_security_level_get_security_level(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); -} - -/** - * @brief Get field status from event GAP_EVENT_DEDICATED_BONDING_COMPLETED - * @param event packet - * @return status - * @note: btstack_type 1 - */ -static __INLINE uint8_t gap_event_dedicated_bonding_completed_get_status(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 2); -} - -typedef struct event_disconn_complete -{ - uint8_t status; - uint16_t conn_handle; - uint8_t reason; -} event_disconn_complete_t; - -typedef struct -{ - uint8_t status; // for DEC, 0 means OK, 1 means ERROR - uint8_t type; // 0: encrypt 1: decrypt - uint8_t mic_size; - uint16_t msg_len; - uint16_t aad_len; - uint32_t tag; // same value as in command - uint8_t *out_msg; -} event_vendor_ccm_complete_t; - -typedef struct le_meta_event_create_conn_complete -{ - //Status of received command - uint8_t status; - //Connection handle - uint16_t handle; - //Device role - 0=Master/ 1=Slave - uint8_t role; - //Peer address type - 0=public/1=random - bd_addr_type_t peer_addr_type; - //Peer address - bd_addr_t peer_addr; - //Connection interval - uint16_t interval; - //Connection latency - uint16_t latency; - //Link supervision timeout - uint16_t sup_timeout; - //Master clock accuracy - uint8_t clk_accuracy; -} le_meta_event_create_conn_complete_t; - -// LE Connection Update Complete Event -typedef struct le_meta_event_conn_update_complete -{ - uint8_t status; - uint16_t handle; - uint16_t interval; - uint16_t latency; - uint16_t sup_timeout; -} le_meta_event_conn_update_complete_t; - -// LE Read Remote Features Complete Event -typedef struct le_meta_event_read_remote_feature_complete -{ - uint8_t status; - uint16_t handle; - uint8_t features[8]; -} le_meta_event_read_remote_feature_complete_t; - -// LE Long Term Key Request Event -typedef struct le_meta_event_long_term_key_request -{ - uint16_t handle; - uint8_t random_number[8]; - uint8_t encryption_div[2]; -} le_meta_event_long_term_key_request_t; - -// LE Remote Connection Parameter Request Event -typedef struct le_meta_event_remote_conn_param_request -{ - uint16_t handle; - uint16_t interval_min; - uint16_t interval_max; - uint16_t latency; - uint16_t timeout; -} le_meta_event_remote_conn_param_request_t; - -// LE Data Length Change Event -typedef struct le_meta_event_data_length_changed -{ - uint16_t handle; - uint16_t max_tx_octets; - uint16_t mx_tx_time; - uint16_t max_rx_octets; - uint16_t mx_rx_time; -} le_meta_event_data_length_changed_t; - -typedef struct le_directed_adv_report -{ - uint16_t evt_type; - bd_addr_type_t addr_type; - bd_addr_t address; - bd_addr_type_t direct_addr_type; - bd_addr_t direct_addr; - int8_t rssi; -} le_directed_adv_report_t; - -// LE Directed Advertising Report Event -typedef struct le_meta_directed_adv_report -{ - uint8_t num_of_reports; - le_directed_adv_report_t reports[1]; -} le_meta_directed_adv_report_t; - -// LE PHY Update Complete Event -typedef struct le_meta_phy_update_complete -{ - uint8_t status; - uint16_t handle; - phy_type_t tx_phy; - phy_type_t rx_phy; -} le_meta_phy_update_complete_t; - -// evt_type -#define HCI_EXT_ADV_PROP_CONNECTABLE (1 << 0) -#define HCI_EXT_ADV_PROP_SCANNABLE (1 << 1) -#define HCI_EXT_ADV_PROP_DIRECTED (1 << 2) -#define HCI_EXT_ADV_PROP_SCAN_RSP (1 << 3) -#define HCI_EXT_ADV_PROP_USE_LEGACY (1 << 4) -#define HCI_EXT_ADV_DATA_CML (0 << 5) -#define HCI_EXT_ADV_DATA_HAS_MORE (1 << 5) -#define HCI_EXT_ADV_DATA_TRUNCED (2 << 5) -#define HCI_EXT_ADV_DATA_MASK (3 << 5) - -typedef struct le_ext_adv_report -{ - uint16_t evt_type; - bd_addr_type_t addr_type; - bd_addr_t address; - uint8_t p_phy; // primary phy - uint8_t s_phy; // secondary phy - uint8_t sid; - int8_t tx_power; - int8_t rssi; - uint16_t prd_adv_interval; - bd_addr_type_t direct_addr_type; - bd_addr_t direct_addr; - uint8_t data_len; - uint8_t data[0]; -} le_ext_adv_report_t; - -// LE Extended Advertising Report Event -typedef struct le_meta_event_ext_adv_report -{ - uint8_t num_of_reports; // this is always 1 - le_ext_adv_report_t reports[1]; -} le_meta_event_ext_adv_report_t; - -// LE Periodic Advertising Sync Established Event -typedef struct le_meta_event_periodic_adv_sync_established -{ - uint8_t status; - uint16_t handle; - uint8_t sid; - bd_addr_type_t addr_type; - bd_addr_t address; - phy_type_t phy; - uint16_t interval; - uint8_t clk_accuracy; -} le_meta_event_periodic_adv_sync_established_t; - -#define HCI_PRD_ADV_DATA_STATUS_CML (0) -#define HCI_PRD_ADV_DATA_STATUS_HAS_MORE (1) -#define HCI_PRD_ADV_DATA_STATUS_TRUNCED (2) - -// LE Periodic Advertising Report Event -typedef struct le_meta_event_periodic_adv_report -{ - uint16_t handle; - int8_t tx_power; - int8_t rssi; - uint8_t unused; - uint8_t data_status; - uint8_t data_length; - uint8_t data[0]; -} le_meta_event_periodic_adv_report_t; - -// LE Periodic Advertising Sync Lost Event -typedef struct le_meta_event_periodic_adv_sync_lost -{ - uint16_t handle; -} le_meta_event_periodic_adv_sync_lost_t; - -// LE Scan Timeout Event -// {} - -// LE Advertising Set Terminated Event -typedef struct le_meta_adv_set_terminated -{ - uint8_t status; - uint8_t adv_handle; - uint16_t conn_handle; - uint8_t num_events; // Num_Completed_Extended_Advertising_Events -} le_meta_adv_set_terminated_t; - -// LE Scan Request Received Event -typedef struct le_meta_scan_req_received -{ - uint8_t adv_handle; - bd_addr_type_t scanner_addr_type; - bd_addr_t scanner_addr; -} le_meta_scan_req_received_t; - -typedef enum ble_ch_sel_algo -{ - BLE_ALGO_1, - BLE_ALGO_2, - BLE_ALGO_NUMBER -} ble_ch_sel_algo_t; - -// LE Channel Selection Algorithm Event -typedef struct le_meta_ch_sel_algo -{ - uint16_t conn_handle; - ble_ch_sel_algo_t algo; -} le_meta_ch_sel_algo; - -typedef struct le_iq_sample -{ - int8_t i; - int8_t q; -} le_iq_sample_t; - -typedef struct le_meta_connless_iq_report -{ - uint16_t sync_handle; - uint8_t channel_index; - int16_t rssi; - uint8_t rssi_ant_id; - uint8_t cte_type; - uint8_t slot_durations; - uint8_t packet_status; - uint16_t event_counter; - uint8_t sample_count; - le_iq_sample_t samples[0]; -} le_meta_connless_iq_report_t; - -typedef struct le_meta_conn_iq_report -{ - uint16_t conn_handle; - phy_type_t rx_phy; - uint8_t channel_index; - int16_t rssi; - uint8_t rssi_ant_id; - uint8_t cte_type; - uint8_t slot_durations; - uint8_t packet_status; - uint16_t event_counter; - uint8_t sample_count; - le_iq_sample_t samples[0]; -} le_meta_conn_iq_report_t; - -typedef struct le_meta_cte_req_failed -{ - uint8_t status; - uint16_t conn_handle; -} le_meta_cte_req_failed_t; - -typedef struct le_meta_prd_adv_sync_transfer_recv -{ - uint8_t status; - uint16_t conn_handle; - uint16_t service_data; - uint16_t sync_handle; - uint8_t adv_sid; - bd_addr_type_t addr_type; - bd_addr_t addr; - phy_type_t phy; - uint16_t prdAdvInterval; - uint8_t clkAcc; -} le_meta_prd_adv_sync_transfer_recv_t; - -#pragma pack (pop) - -// packet is from host callbacks -#define decode_hci_le_meta_event(packet, T) decode_event_offset(packet, T, 3) - -#define decode_hci_event_disconn_complete(packet) decode_event_offset(packet, event_disconn_complete_t, 2) -#define decode_hci_event_vendor_ccm_complete(packet) decode_event_offset(packet, event_vendor_ccm_complete_t, 5) - -#define decode_hci_event(packet, T) decode_event_offset(packet, T, 2) - -/* API_END */ - -#ifdef __cplusplus -} -#endif - -#endif // __BTSTACK_EVENT_H diff --git a/bundles/mesh/inc/btstack_linked_list.h b/bundles/mesh/inc/btstack_linked_list.h deleted file mode 100644 index cc8e6c278..000000000 --- a/bundles/mesh/inc/btstack_linked_list.h +++ /dev/null @@ -1,36 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- - -#ifndef __BTSTACK_LINKED_LIST_H -#define __BTSTACK_LINKED_LIST_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct btstack_linked_item { - struct btstack_linked_item *next; // <-- next element in list, or NULL -} btstack_linked_item_t; - -typedef btstack_linked_item_t * btstack_linked_list_t; - -typedef struct { - int advance_on_next; - btstack_linked_item_t * prev; // points to the item before the current one - btstack_linked_item_t * curr; // points to the current item (to detect item removal) -} btstack_linked_list_iterator_t; - -#ifdef __cplusplus -} -#endif - -#endif // __BTSTACK_LINKED_LIST_H diff --git a/bundles/mesh/inc/btstack_util.h b/bundles/mesh/inc/btstack_util.h deleted file mode 100644 index ccd78430e..000000000 --- a/bundles/mesh/inc/btstack_util.h +++ /dev/null @@ -1,160 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -#ifndef __BTSTACK_UTIL_H -#define __BTSTACK_UTIL_H - -#include - -#include "bluetooth.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef C2NIM -#define read_little_endian_t(T, buffer, position) (*(const T *)((const uint32_t)(buffer) + (position))) -#define little_endian_store_t(T, buffer, position, v) (*(T *)((const uint32_t)(buffer) + (position)) = (v)) -#else -#define read_little_endian_t(T, buffer, position) (*(const T *)((uint32_t)(buffer) + (position))) -#define little_endian_store_t(T, buffer, position, v) (*(T *)((uint32_t)(buffer) + (position)) = (v)) -#endif - -//basic utility: -#define little_endian_read_16(buffer, position) read_little_endian_t(uint16_t, buffer, position) -#define little_endian_read_24(buffer, position) (little_endian_read_32(buffer, position) & 0xffffffu) -#define little_endian_read_32(buffer, position) read_little_endian_t(uint32_t, buffer, position) - -#define little_endian_store_16(buffer, position, value) little_endian_store_t(uint16_t, buffer, position, value) -#define little_endian_store_32(buffer, position, value) little_endian_store_t(uint32_t, buffer, position, value) - -/** - * @brief Read 16/24/32 bit big endian value from buffer - * @param buffer - * @param position in buffer - * @return value - */ -uint32_t big_endian_read_16( const uint8_t * buffer, int pos); -uint32_t big_endian_read_32( const uint8_t * buffer, int pos); - -/** - * @brief Write 16/32 bit big endian value into buffer - * @param buffer - * @param position in buffer - * @param value - */ -void big_endian_store_16(uint8_t *buffer, uint16_t pos, uint16_t value); -void big_endian_store_32(uint8_t *buffer, uint16_t pos, uint32_t value); - -/** - * @brief Copy from source to destination and reverse byte order - * @param src - * @param dest - * @param len - */ -void reverse_bytes (const uint8_t *src, uint8_t * dest, int len); - -/** - * @brief Wrapper around reverse_bytes for common buffer sizes - * @param src - * @param dest - */ -void reverse_24 (const uint8_t *src, uint8_t * dest); -void reverse_48 (const uint8_t *src, uint8_t * dest); -void reverse_56 (const uint8_t *src, uint8_t * dest); -void reverse_64 (const uint8_t *src, uint8_t * dest); -void reverse_128(const uint8_t *src, uint8_t * dest); - -void reverse_bd_addr(const uint8_t *src, uint8_t * dest); - -// will be moved to daemon/btstack_device_name_db.h - -/** - * @brief The device name type - */ -#define DEVICE_NAME_LEN 248 -typedef uint8_t device_name_t[DEVICE_NAME_LEN+1]; - -/** - * @brief ASCII character for 4-bit nibble - * @return character - */ -char char_for_nibble(int nibble); - -/** - * @brif 4-bit nibble from ASCII character - * @return value - */ -int nibble_for_char(char c); - -/** - * @brief Compare two Bluetooth addresses - * @param a - * @param b - * @return true if equal - */ -int bd_addr_cmp(bd_addr_t a, bd_addr_t b); - -/** - * @brief Copy Bluetooth address - * @param dest - * @param src - */ -void bd_addr_copy(bd_addr_t dest, const bd_addr_t src); - -/** - * @brief Use printf to write hexdump as single line of data - */ -void printf_hexdump(const void *data, int size); - -/** - * @brief Create human readable representation for UUID128 - * @note uses fixed global buffer - * @return pointer to UUID128 string - */ -char * uuid128_to_str(const uint8_t * uuid); - -/** - * @brief Create human readable represenationt of Bluetooth address - * @note uses fixed global buffer - * @return pointer to Bluetooth address string - */ -char * bd_addr_to_str(const bd_addr_t addr); - -/** - * @brief Parse Bluetooth address - * @param address_string - * @param buffer for parsed address - * @return 1 if string was parsed successfully - */ -int sscanf_bd_addr(const char * addr_string, bd_addr_t addr); - -/** - * @brief Constructs UUID128 from 16 or 32 bit UUID using Bluetooth base UUID - * @param uuid128 output buffer - * @param short_uuid - */ -void uuid_add_bluetooth_prefix(uint8_t * uuid128, uint32_t short_uuid); - -/** - * @brief Checks if UUID128 has Bluetooth base UUID prefix - * @param uui128 to test - * @return 1 if it can be expressed as UUID32 - */ -int uuid_has_bluetooth_prefix(uint8_t * uuid128); - -#ifdef __cplusplus -} -#endif - -#endif // __BTSTACK_UTIL_H diff --git a/bundles/mesh/inc/cfg_cli.h b/bundles/mesh/inc/cfg_cli.h deleted file mode 100644 index b6fe17b71..000000000 --- a/bundles/mesh/inc/cfg_cli.h +++ /dev/null @@ -1,198 +0,0 @@ -/** @file - * @brief Bluetooth Mesh Configuration Client Model APIs. - */ - -/* - * Copyright (c) 2017 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef __BT_MESH_CFG_CLI_H -#define __BT_MESH_CFG_CLI_H - -/** - * @brief Bluetooth Mesh - * @defgroup bt_mesh_cfg_cli Bluetooth Mesh Configuration Client Model - * @ingroup bt_mesh - * @{ - */ - -/** Mesh Configuration Client Model Context */ -struct bt_mesh_cfg_cli { - struct bt_mesh_model *model; - - struct k_sem op_sync; - u32_t op_pending; - void *op_param; -}; - -typedef struct node_basic_info -{ - uint16_t netkey_ID; - uint16_t app_id; - uint8_t netkey[16]; - uint8_t devkey[16]; - uint8_t beaconkey[16]; - uint8_t appkey[16]; - uint16_t unitcast_addr; -}node_basic_info; - -extern const struct bt_mesh_model_op bt_mesh_cfg_cli_op[]; - -#define BT_MESH_MODEL_CFG_CLI(cli_data) \ - BT_MESH_MODEL(BT_MESH_MODEL_ID_CFG_CLI, \ - bt_mesh_cfg_cli_op, NULL, cli_data) - -int bt_mesh_cfg_comp_data_get(u16_t net_idx, u16_t addr, u8_t page, - u8_t *status, struct os_mbuf *comp); - -int bt_mesh_cfg_beacon_get(u16_t net_idx, u16_t addr, u8_t *status); - -int bt_mesh_cfg_beacon_set(u16_t net_idx, u16_t addr, u8_t val, u8_t *status); - -int bt_mesh_cfg_ttl_get(u16_t net_idx, u16_t addr, u8_t *ttl); - -int bt_mesh_cfg_ttl_set(u16_t net_idx, u16_t addr, u8_t val, u8_t *ttl); - -int bt_mesh_cfg_friend_get(u16_t net_idx, u16_t addr, u8_t *status); - -int bt_mesh_cfg_friend_set(u16_t net_idx, u16_t addr, u8_t val, u8_t *status); - -int bt_mesh_cfg_gatt_proxy_get(u16_t net_idx, u16_t addr, u8_t *status); - -int bt_mesh_cfg_gatt_proxy_set(u16_t net_idx, u16_t addr, u8_t val, - u8_t *status); - -int bt_mesh_cfg_relay_get(u16_t net_idx, u16_t addr, u8_t *status, - u8_t *transmit); - -int bt_mesh_cfg_relay_set(u16_t net_idx, u16_t addr, u8_t new_relay, - u8_t new_transmit, u8_t *status, u8_t *transmit); - -int bt_mesh_cfg_net_key_add(u16_t net_idx, u16_t addr, u16_t key_net_idx, - const u8_t net_key[16], u8_t *status); - -int bt_mesh_cfg_app_key_add(u16_t net_idx, u16_t addr, u16_t key_net_idx, - u16_t key_app_idx, const u8_t app_key[16], - u8_t *status); - -int bt_mesh_cfg_mod_app_bind(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t mod_app_idx, u16_t mod_id, u8_t *status); - -int bt_mesh_cfg_mod_app_bind_vnd(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t mod_app_idx, u16_t mod_id, u16_t cid, - u8_t *status); - -struct bt_mesh_cfg_mod_pub { - u16_t addr; - u16_t app_idx; - bool cred_flag; - u8_t ttl; - u8_t period; - u8_t transmit; -}; - -int bt_mesh_cfg_mod_pub_get(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t mod_id, struct bt_mesh_cfg_mod_pub *pub, - u8_t *status); - -int bt_mesh_cfg_mod_pub_get_vnd(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t mod_id, u16_t cid, - struct bt_mesh_cfg_mod_pub *pub, u8_t *status); - -int bt_mesh_cfg_mod_pub_set(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t mod_id, struct bt_mesh_cfg_mod_pub *pub, - u8_t *status); - -int bt_mesh_cfg_mod_pub_set_vnd(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t mod_id, u16_t cid, - struct bt_mesh_cfg_mod_pub *pub, u8_t *status); - -int bt_mesh_cfg_mod_sub_add(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t sub_addr, u16_t mod_id, u8_t *status); - -int bt_mesh_cfg_mod_sub_add_vnd(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t sub_addr, u16_t mod_id, u16_t cid, - u8_t *status); - -int bt_mesh_cfg_mod_sub_del(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t sub_addr, u16_t mod_id, u8_t *status); - -int bt_mesh_cfg_mod_sub_del_vnd(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t sub_addr, u16_t mod_id, u16_t cid, - u8_t *status); - -int bt_mesh_cfg_mod_sub_overwrite(u16_t net_idx, u16_t addr, u16_t elem_addr, - u16_t sub_addr, u16_t mod_id, u8_t *status); - -int bt_mesh_cfg_mod_sub_overwrite_vnd(u16_t net_idx, u16_t addr, - u16_t elem_addr, u16_t sub_addr, - u16_t mod_id, u16_t cid, u8_t *status); - -int bt_mesh_cfg_mod_sub_va_add(u16_t net_idx, u16_t addr, u16_t elem_addr, - const u8_t label[16], u16_t mod_id, - u16_t *virt_addr, u8_t *status); - -int bt_mesh_cfg_mod_sub_va_add_vnd(u16_t net_idx, u16_t addr, u16_t elem_addr, - const u8_t label[16], u16_t mod_id, - u16_t cid, u16_t *virt_addr, u8_t *status); - -int bt_mesh_cfg_mod_sub_va_del(u16_t net_idx, u16_t addr, u16_t elem_addr, - const u8_t label[16], u16_t mod_id, - u16_t *virt_addr, u8_t *status); - -int bt_mesh_cfg_mod_sub_va_del_vnd(u16_t net_idx, u16_t addr, u16_t elem_addr, - const u8_t label[16], u16_t mod_id, - u16_t cid, u16_t *virt_addr, u8_t *status); - -int bt_mesh_cfg_mod_sub_va_overwrite(u16_t net_idx, u16_t addr, - u16_t elem_addr, const u8_t label[16], - u16_t mod_id, u16_t *virt_addr, - u8_t *status); - -int bt_mesh_cfg_mod_sub_va_overwrite_vnd(u16_t net_idx, u16_t addr, - u16_t elem_addr, const u8_t label[16], - u16_t mod_id, u16_t cid, - u16_t *virt_addr, u8_t *status); - -struct bt_mesh_cfg_hb_sub { - u16_t src; - u16_t dst; - u8_t period; - u8_t count; - u8_t min; - u8_t max; -}; - -int bt_mesh_cfg_hb_sub_set(u16_t net_idx, u16_t addr, - struct bt_mesh_cfg_hb_sub *sub, u8_t *status); - -int bt_mesh_cfg_hb_sub_get(u16_t net_idx, u16_t addr, - struct bt_mesh_cfg_hb_sub *sub, u8_t *status); - -struct bt_mesh_cfg_hb_pub { - u16_t dst; - u8_t count; - u8_t period; - u8_t ttl; - u16_t feat; - u16_t net_idx; -}; - -int bt_mesh_cfg_hb_pub_set(u16_t net_idx, u16_t addr, - const struct bt_mesh_cfg_hb_pub *pub, u8_t *status); - -int bt_mesh_cfg_hb_pub_get(u16_t net_idx, u16_t addr, - struct bt_mesh_cfg_hb_pub *pub, u8_t *status); - -s32_t bt_mesh_cfg_cli_timeout_get(void); -void bt_mesh_cfg_cli_timeout_set(s32_t timeout); - -int find_dev_key(uint8_t devkey[16]); -int insert_node_info(uint8_t devkey[16],node_basic_info node); - -/** - * @} - */ - -#endif /* __BT_MESH_CFG_CLI_H */ diff --git a/bundles/mesh/inc/cfg_srv.h b/bundles/mesh/inc/cfg_srv.h deleted file mode 100644 index d1e9928ed..000000000 --- a/bundles/mesh/inc/cfg_srv.h +++ /dev/null @@ -1,70 +0,0 @@ -/** @file - * @brief Bluetooth Mesh Configuration Server Model APIs. - */ - -/* - * Copyright (c) 2017 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef __BT_MESH_CFG_SRV_H -#define __BT_MESH_CFG_SRV_H - -/** - * @brief Bluetooth Mesh - * @defgroup bt_mesh_cfg_srv Bluetooth Mesh Configuration Server Model - * @ingroup bt_mesh - * @{ - */ - -/** Mesh Configuration Server Model Context */ -struct bt_mesh_cfg_srv { - struct bt_mesh_model *model; - - u8_t net_transmit; /* Network Transmit state */ - u8_t relay; /* Relay Mode state */ - u8_t relay_retransmit; /* Relay Retransmit state */ - u8_t beacon; /* Secure Network Beacon state */ - u8_t gatt_proxy; /* GATT Proxy state */ - u8_t frnd; /* Friend state */ - u8_t default_ttl; /* Default TTL */ - - /* Heartbeat Publication */ - struct bt_mesh_hb_pub { - struct k_delayed_work timer; - - u16_t dst; - u16_t count; - u8_t period; - u8_t ttl; - u16_t feat; - u16_t net_idx; - } hb_pub; - - /* Heartbeat Subscription */ - struct bt_mesh_hb_sub { - s64_t expiry; - - u16_t src; - u16_t dst; - u16_t count; - u8_t min_hops; - u8_t max_hops; - - /* Optional subscription tracking function */ - void (*func)(u8_t hops, u16_t feat); - } hb_sub; -}; - -extern const struct bt_mesh_model_op bt_mesh_cfg_srv_op[]; - -#define BT_MESH_MODEL_CFG_SRV(srv_data) \ - BT_MESH_MODEL(BT_MESH_MODEL_ID_CFG_SRV, \ - bt_mesh_cfg_srv_op, NULL, srv_data) - - -/** - * @} - */ - -#endif /* __BT_MESH_CFG_SRV_H */ diff --git a/bundles/mesh/inc/cmac_mode.h b/bundles/mesh/inc/cmac_mode.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/bundles/mesh/inc/compiler.h b/bundles/mesh/inc/compiler.h deleted file mode 100644 index e17f58fae..000000000 --- a/bundles/mesh/inc/compiler.h +++ /dev/null @@ -1,26 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- - -#ifndef _COMPILER_H_ -#define _COMPILER_H_ - -#include - -#ifdef __CC_ARM - #define __INLINE __inline -#else - #define __INLINE inline -#endif - -#define __ASM __asm - -#endif // _COMPILER_H_ diff --git a/bundles/mesh/inc/constants.h b/bundles/mesh/inc/constants.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/bundles/mesh/inc/ecc_dh.h b/bundles/mesh/inc/ecc_dh.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/bundles/mesh/inc/gap.h b/bundles/mesh/inc/gap.h deleted file mode 100644 index 08d053c01..000000000 --- a/bundles/mesh/inc/gap.h +++ /dev/null @@ -1,668 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -#ifndef __GAP_EXTERNAL_H -#define __GAP_EXTERNAL_H - -#include -#include "bluetooth.h" -#include "bt_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct le_connection_parameter_range{ - uint16_t le_conn_interval_min; - uint16_t le_conn_interval_max; - uint16_t le_conn_latency_min; - uint16_t le_conn_latency_max; - uint16_t le_supervision_timeout_min; - uint16_t le_supervision_timeout_max; -} le_connection_parameter_range_t; - -//LE Scan type -typedef enum scan_type -{ - //Passive scan - SCAN_PASSIVE = 0x00, - //Active scan - SCAN_ACTIVE = 0x01, -} scan_type_t; - -void gap_set_random_device_address(const uint8_t *address); - -/** - * Disconnect connection with handle - * - * @param handle - */ -uint8_t gap_disconnect(hci_con_handle_t handle); - -uint8_t gap_add_whitelist(const uint8_t *address,bd_addr_type_t addtype); -uint8_t gap_remove_whitelist(const uint8_t *address,bd_addr_type_t addtype); - -typedef enum phy_type -{ - PHY_1M = 0x01, - PHY_2M = 0x02, - PHY_CODED = 0x03, -} phy_type_t; - -/*bit configure for */ -typedef enum phy_bittype -{ - PHY_1M_BIT = BIT(0), - PHY_2M_BIT = BIT(1), - PHY_CODED_BIT = BIT(2), -} phy_bittype_t; - -typedef uint8_t phy_bittypes_t; - -typedef enum -{ - ADV_CONNECTABLE, - ADV_SCANNABLE, - ADV_DIRECT, - ADV_HIGH_DUTY_DIR_ADV, - ADV_LEGACY, - ADV_ANONYMOUS, - ADV_INC_TX_POWER -} adv_event_property_t; - -#ifndef C2NIM -#define CONNECTABLE_ADV_BIT BIT(ADV_CONNECTABLE) -#define SCANNABLE_ADV_BIT BIT(ADV_SCANNABLE) -#define DIRECT_ADV_BIT BIT(ADV_DIRECT) -#define HIGH_DUTY_CIR_DIR_ADV_BIT BIT(ADV_HIGH_DUTY_DIR_ADV) -#define LEGACY_PDU_BIT BIT(ADV_LEGACY) -#define ANONY_ADV_BIT BIT(ADV_ANONYMOUS) -#define INC_TX_ADV_BIT BIT(ADV_INC_TX_POWER) -#endif - -typedef uint8_t adv_event_properties_t; - -#define PERIODIC_ADV_BIT_INC_TX BIT(6) -typedef uint8_t periodic_adv_properties_t; - -uint8_t gap_read_phy(const uint16_t con_handle); - -uint8_t gap_set_def_phy(const uint8_t all_phys, const phy_bittypes_t tx_phys, const phy_bittypes_t rx_phys); - -typedef enum phy_option -{ - HOST_NO_PREFERRED_CODING, - HOST_PREFER_S2_CODING, - HOST_PREFER_S8_CODING -} phy_option_t; - -uint8_t gap_set_phy(const uint16_t con_handle, const uint8_t all_phys, const phy_bittypes_t tx_phys, - const phy_bittypes_t rx_phys, const phy_option_t phy_opt); - -uint8_t gap_set_adv_set_random_addr(const uint8_t adv_handle, const uint8_t *random_addr); - -typedef struct scan_phy_config -{ - // Which phy to scan (valid phys: 1M & Coded) - phy_type_t phy; - //Scan type - 0=passive / 1=active - scan_type_t type; - //Scan interval, units is 625us - uint16_t interval; - //Scan window size, units is 625us - uint16_t window; -} scan_phy_config_t; - -//Scan filter policy -typedef enum scan_filter_policy -{ - // Accept all advertising packets except directed advertising packets not - // addressed to this device (default). - SCAN_ACCEPT_ALL_EXCEPT_NOT_DIRECTED, - // Accept only advertising packets from devices where the advertiser¡¯s - // address is in the White List. Directed advertising packets which are not - // addressed to this device shall be ignored - SCAN_ACCEPT_WLIST_EXCEPT_NOT_DIRECTED, - // Accept all advertising packets except directed advertising packets - // where the initiator's identity address does not address this device - SCAN_ACCEPT_ALL_EXCEPT_IDENTITY_NOT_MATCH, - // Accept all advertising packets except: - // 1. advertising packets where the advertiser's identity address is not in - // the White List; and - // 2. directed advertising packets where the initiator's identity address - // does not address this device - SCAN_ACCEPT_WLIST_EXCEPT_IDENTITY_NOT_MATCH -} scan_filter_policy_t; - -uint8_t gap_set_ext_scan_para(const bd_addr_type_t addr_type, const scan_filter_policy_t filter, const uint8_t config_num, - const scan_phy_config_t *configs); -uint8_t gap_set_ext_scan_response_data(const uint8_t adv_handle, const uint16_t length, const uint8_t *data); -uint8_t gap_set_ext_scan_enable(const uint8_t enable, const uint8_t filter, const uint16_t duration, const uint16_t period); - - -typedef struct ext_adv_set_en -{ - uint8_t handle; - // Advertising duration, unit 10ms. 0 for continuous advertising - uint16_t duration; - // Maximum number of extended advertising events the Controller shall attempt to send prior to terminating the extended advertising - // 0: no maximum number - uint8_t max_events; -} ext_adv_set_en_t; - -uint8_t gap_set_ext_adv_enable(const uint8_t enable, const uint8_t set_number, const ext_adv_set_en_t *adv_sets); - -// channel map bit -#define PRIMARY_ADV_CH_37 BIT(0) -#define PRIMARY_ADV_CH_38 BIT(1) -#define PRIMARY_ADV_CH_39 BIT(2) -#define PRIMARY_ADV_ALL_CHANNELS (PRIMARY_ADV_CH_37 | PRIMARY_ADV_CH_38 | PRIMARY_ADV_CH_39) - -typedef uint8_t adv_channel_bits_t; - -//Advertising filter policy -typedef enum adv_filter_policy -{ - //Allow both scan and connection requests from anyone - ADV_FILTER_ALLOW_ALL = 0x00, - //Allow both scan req from White List devices only and connection req from anyone - ADV_FILTER_ALLOW_SCAN_WLST_CON_ALL, - //Allow both scan req from anyone and connection req from White List devices only - ADV_FILTER_ALLOW_SCAN_ALL_CON_WLST, - //Allow scan and connection requests from White List devices only - ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST -} adv_filter_policy_t; - -uint8_t gap_set_ext_adv_para(const uint8_t adv_handle, - const adv_event_properties_t properties, - const uint32_t interval_min, - const uint32_t interval_max, - const adv_channel_bits_t primary_adv_channel_map, - const bd_addr_type_t own_addr_type, - const bd_addr_type_t peer_addr_type, - const uint8_t *peer_addr, - const adv_filter_policy_t adv_filter_policy, - const int8_t tx_power, - const phy_type_t primary_adv_phy, - const uint8_t secondary_adv_max_skip, - const phy_type_t secondary_adv_phy, - const uint8_t sid, - const uint8_t scan_req_notification_enable); - -typedef enum adv_data_frag_pref -{ - ADV_DATA_CTRL_MAY_FRAG = 0, - ADV_DATA_CTRL_NOT_FRAG = 1 -} adv_data_frag_pref_t_t; - -uint8_t gap_set_ext_adv_data(const uint8_t adv_handle, uint16_t length, const uint8_t *data); - -uint8_t gap_set_periodic_adv_data(const uint8_t adv_handle, uint16_t length, const uint8_t *data); -uint8_t gap_set_periodic_adv_enable(const uint8_t enable, const uint8_t adv_handle); -uint8_t gap_set_periodic_adv_para(const uint8_t adv_handle, - const uint16_t interval_min, - const uint16_t interval_max, - const periodic_adv_properties_t properties); - -uint8_t gap_clr_adv_set(void); -uint8_t gap_rmv_adv_set(const uint8_t adv_handle); - -typedef enum periodic_adv_filter_policy -{ - PERIODIC_ADVERTISER_FROM_PARAM = 0, - PERIODIC_ADVERTISER_FROM_LIST = 1 -} periodic_adv_filter_policy_t; - -uint8_t gap_periodic_adv_create_sync(const periodic_adv_filter_policy_t filter_policy, - const uint8_t adv_sid, - const bd_addr_type_t addr_type, - const uint8_t *addr, - const uint16_t skip, - const uint16_t sync_timeout, - const uint8_t sync_cte_type - ); -uint8_t gap_periodic_adv_create_sync_cancel(void); -uint8_t gap_periodic_adv_term_sync(const uint16_t sync_handle); -uint8_t gap_add_dev_to_periodic_list(const uint8_t addr_type, const uint8_t *addr, const uint8_t sid); -uint8_t gap_rmv_dev_from_periodic_list(const uint8_t addr_type, const uint8_t *addr, const uint8_t sid); -uint8_t gap_clr_periodic_adv_list(void); -uint8_t gap_read_periodic_adv_list_size(void); - -typedef enum initiating_filter_policy -{ - INITIATING_ADVERTISER_FROM_PARAM = 0, - INITIATING_ADVERTISER_FROM_LIST = 1 -} initiating_filter_policy_t; - -typedef struct { - //Scan interval, units is 625us - uint16_t scan_int; - //Scan window size, units is 625us - uint16_t scan_win; - // connection interval limiations. unit is 1.25ms - uint16_t interval_min; - uint16_t interval_max; - // Slave latency for the connection in number of connection events - uint16_t latency; - // Supervision timeout for the LE Link, unit is 10ms - uint16_t supervision_timeout; - // Informative parameter recommending the min/max length of connection event needed for this LE connection - uint16_t min_ce_len; - uint16_t max_ce_len; -} conn_para_t; - -typedef struct initiating_phy_config -{ - phy_type_t phy; - conn_para_t conn_param; -} initiating_phy_config_t; - - -uint8_t gap_ext_create_connection(const initiating_filter_policy_t filter_policy, - const bd_addr_type_t own_addr_type, - const bd_addr_type_t peer_addr_type, - const uint8_t *peer_addr, - const uint8_t initiating_phy_num, - const initiating_phy_config_t *phy_configs); - -/** - * @brief Cancel connection process initiated by gap_ext_create_connection - */ -uint8_t gap_create_connection_cancel(void); - -typedef enum -{ - CTE_AOA, - CTE_AOD_1US, - CTE_AOD_2US -} cte_type_t; - -/** - * @brief Set the type, length, and antenna switching pattern for the transmission - * of Constant Tone Extensions in any periodic advertising on the advertising set - * identified by the Advertising_Handle parameter. - * - * @param adv_handle Used to identify an advertising set. Range: 0x00 to 0xEF - * @param cte_len Constant Tone Extension length in 8 ¦Ìs units. Range: 0x02 to 0x14 - * @param cte_type CTE Type - * @param cte_count The number of Constant Tone Extensions to transmit in each periodic - * advertising interval. - * Range: 0x01 to 0x10 - * @param switching_pattern_len The number of Antenna IDs in the pattern. Range: 0x02 to 0x4B. - * @param antenna_ids List of Antenna IDs in the pattern - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_set_connectionless_cte_tx_param(const uint8_t adv_handle, -// const uint8_t cte_len, -// const cte_type_t cte_type, -// const uint8_t cte_count, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Request that the Controller enables or disables the use of Constant Tone - * Extensions in any periodic advertising on the advertising set identified by - * Advertising_Handle. - * - * @param adv_handle Identifier for the advertising set in which Constant Tone Extension is - * being enabled or disabled - * @param cte_enable Disable (0x00), Enable (0x01) - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_set_connectionless_cte_tx_enable(const uint8_t adv_handle, -// const uint8_t cte_enable); -// WARNING: ^^^ this API is not available in this release - - -typedef enum -{ - CTE_SLOT_DURATION_1US, - CTE_SLOT_DURATION_2US -} cte_slot_duration_type_t; - -/** - * @brief Request that the Controller enables or disables capturing IQ samples from the - * Constant Tone Extension of periodic advertising packets in the periodic - * advertising train identified by the Sync_Handle parameter. - * - * @param sync_handle identifying the periodic advertising train. - * @param sampling_enable Disable (0x00), Enable (0x01) - * @param slot_durations combination of bits representing cte_slot_duration_type_t - * @param max_sampled_ctes The maximum number of Constant Tone Extensions to sample and - * report in each periodic advertising interval. - * Range: 0x01 to 0x10. 0x00: sample and report all CTEs. - * @param switching_pattern_len The number of Antenna IDs in the pattern. Range: 0x02 to 0x4B. - * @param antenna_ids List of Antenna IDs in the pattern - * - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_set_connectionless_iq_sampling_enable(const uint16_t sync_handle, -// const uint8_t sampling_enable, -// const uint8_t slot_durations, -// const uint8_t max_sampled_ctes, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Enable or disable sampling received Constant Tone Extension fields on the - * connection identified by the Connection_Handle parameter and to set the - * antenna switching pattern and switching and sampling slot durations to be - * used. - * - * @param conn_handle Connection handle - * @param sampling_enable Disable (0x00), Enable (0x01) - * @param slot_durations combination of bits representing cte_slot_duration_type_t - * @param switching_pattern_len The number of Antenna IDs in the pattern. Range: 0x02 to 0x4B. - * @param antenna_ids List of Antenna IDs in the pattern - * @return 0: Message is sent out; Other: Message is not sent out - * - */ -// uint8_t gap_set_connection_cte_rx_param(const hci_con_handle_t conn_handle, -// const uint8_t sampling_enable, -// const uint8_t slot_durations, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Set the antenna switching pattern and permitted Constant Tone Extension - * types used for transmitting Constant Tone Extensions requested by the peer - * device on the connection identified by the Connection_Handle parameter. - * - * @param conn_handle Connection handle - * @param cte_types Combination of bits representing cte_type_t - * @param switching_pattern_len The number of Antenna IDs in the pattern. Range: 0x02 to 0x4B. - * @param antenna_ids List of Antenna IDs in the pattern - * @return 0: Message is sent out; Other: Message is not sent out - * - */ -// uint8_t gap_set_connection_cte_tx_param(const hci_con_handle_t conn_handle, -// const uint8_t cte_types, -// const uint8_t switching_pattern_len, -// const uint8_t *antenna_ids); -// WARNING: ^^^ this API is not available in this release - - - -/** - * @brief Set the antenna switching pattern and permitted Constant Tone Extension - * types used for transmitting Constant Tone Extensions requested by the peer - * device on the connection identified by the Connection_Handle parameter. - * - * @param conn_handle Connection handle - * @param enable Disable (0x00), Enable (0x01) - * @param requested_interval 0x0000: Initiate the Constant Tone Extension Request procedure once, at the - * earliest practical opportunity - * 0x0001 to 0xFFFF: - * Requested interval for initiating the Constant Tone Extension Request - * procedure in number of connection events. - * @param requested_cte_length Minimum length of the Constant Tone Extension being requested in 8 - * ¦Ìs units. Range: 0x02 to 0x14. - * @param requested_cte_type Requested CTE type - * @return 0: Message is sent out; Other: Message is not sent out - * - */ -// uint8_t gap_set_connection_cte_request_enable(const hci_con_handle_t conn_handle, -// const uint8_t enable, -// const uint16_t requested_cte_interval, -// const uint8_t requested_cte_length, -// const cte_type_t requested_cte_type); -// WARNING: ^^^ this API is not available in this release - - - -/** - * @brief Request the Controller to respond to LL_CTE_REQ PDUs with LL_CTE_RSP - * PDUs on the specified connection. - * - * @param conn_handle Connection handle - * @param enable Disable (0x00), Enable (0x01) - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_set_connection_cte_response_enable(const hci_con_handle_t conn_handle, -// const uint8_t enable); -// WARNING: ^^^ this API is not available in this release - -/** - * @brief Read the switching rates, the sampling rates, the number of antennae, and the - * maximum length of a transmitted Constant Tone Extension supported by the - * Controller. - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_read_antenna_info(void); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Enable or disable reports for the periodic advertising train identified by the - * Sync_Handle parameter. - * - * @param sync_handle identifying the periodic advertising train. - * @param enable Disable (0x00), Enable (0x01) - * - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_set_periodic_adv_rx_enable(const uint16_t sync_handle, -// const uint8_t enable); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Instruct the Controller to send synchronization information about the periodic - * advertising train identified by the Sync_Handle parameter to a connected - * device. - * - * @param conn_handle Connection handle - * @param service_data A value provided by the app for use by the app of the peer device. - * It is not used by the host or controller. - * @param sync_handle identifying the periodic advertising train. - * - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_periodic_adv_sync_transfer(const hci_con_handle_t conn_handle, -// const uint16_t service_data, -// const uint16_t sync_handle); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Instruct the Controller to send synchronization information about the periodic - * advertising in an advertising set to a connected device. - * - * @param conn_handle Connection handle - * @param service_data A value provided by the app for use by the app of the peer device. - * It is not used by the host or controller. - * @param adv_handle identifying the advertising set. - * - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_periodic_adv_set_info_transfer(const hci_con_handle_t conn_handle, -// const uint16_t service_data, -// const uint8_t adv_handle); -// WARNING: ^^^ this API is not available in this release - - - -typedef enum -{ - PERIODIC_TRANS_MODE_NULL, - PERIODIC_TRANS_MODE_SEND_EVT_DISABLE_REPORT, - PERIODIC_TRANS_MODE_SEND_EVT_ENABLE_REPORT -} periodic_adv_sync_transfer_mode_t; - -// synchronize exclusion flags -#define SYNC_EXCL_AOA 1 -#define SYNC_EXCL_AOD_1US 2 -#define SYNC_EXCL_AOD_2US 4 -#define SYNC_EXCL_WITHOUT_CTE 8 - -/** - * @brief Specify how the Controller will process periodic advertising - * synchronization information received from the device identified by the - * Connection_Handle parameter (the "transfer mode") - * - * @param conn_handle Connection handle - * @param mode The action to be taken when periodic advertising - * synchronization information is received. - * @param skip Number of consecutive periodic advertising - * packets that the receiver may skip after successfully receiving a periodic - * advertising packet. - * Range: 0x0000 to 0x01F3 - * @param sync_timeout maximum permitted time between successful receives. If this time is exceeded, synchronization is lost. - * Range: 0x000A to 0x4000. Time = N*10 ms - * @param cte_excl_types whether to only synchronize to periodic advertising with certain types of Constant Tone Extension. - * Combination of SYNC_EXCL_XXX - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_periodic_adv_sync_transfer_param(const hci_con_handle_t conn_handle, -// const periodic_adv_sync_transfer_mode_t mode, -// const uint16_t skip, -// const uint16_t sync_timeout, -// const uint8_t cte_excl_types); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Specify the initial value for the mode, skip, timeout, and - * Constant Tone Extension type (set by the - * HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters command; - * see Section 7.8.91) to be used for all subsequent connections over the LE - * transport. - * - * @param mode The action to be taken when periodic advertising - * synchronization information is received. - * @param skip Number of consecutive periodic advertising - * packets that the receiver may skip after successfully receiving a periodic - * advertising packet. - * Range: 0x0000 to 0x01F3 - * @param sync_timeout maximum permitted time between successful receives. If this time is exceeded, synchronization is lost. - * Range: 0x000A to 0x4000. Time = N*10 ms - * @param cte_excl_types whether to only synchronize to periodic advertising with certain types of Constant Tone Extension. - * Combination of SYNC_EXCL_XXX - * @return 0: Message is sent out; Other: Message is not sent out - */ -// uint8_t gap_default_periodic_adv_sync_transfer_param( -// const periodic_adv_sync_transfer_mode_t mode, -// const uint16_t skip, -// const uint16_t sync_timeout, -// const uint8_t cte_excl_types); -// WARNING: ^^^ this API is not available in this release - - -uint8_t gap_set_host_channel_classification(const uint32_t channel_low, const uint8_t channel_high); - - -/** - * @brief Sets update period for random address - * @param period_ms in ms - */ -// void gap_random_address_set_update_period(int period_ms); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Updates the connection parameters for a given LE connection - * @param handle - * @param conn_interval_min (unit: 1.25ms) - * @param conn_interval_max (unit: 1.25ms) - * @param conn_latency - * @param supervision_timeout (unit: 10ms) - * @returns 0 if ok - */ -int gap_update_connection_parameters(hci_con_handle_t con_handle, uint16_t conn_interval_min, - uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout, - uint16_t min_ce_len, uint16_t max_ce_len); - -/** - * @brief Set accepted connection parameter range - * @param range - */ -void gap_get_connection_parameter_range(le_connection_parameter_range_t * range); - -/** - * @brief Get accepted connection parameter range - * @param range - */ -void gap_set_connection_parameter_range(le_connection_parameter_range_t * range); - -/** - * @brief Encrypt the Plaintext_Data in the command using the Key given in the command and - * returns the Encrypted_Data to the Host. The AES-128 bit block cypher is - * defined in NIST Publication FIPS-197. - * @param key Key, 16 Octets. - * 0x1234.... is represented by {0x12, 0x34, ...} - * @param plaintext Plaintext_Data, 16 Octets - * 0x1234.... is represented by {0x12, 0x34, ...} - * @return 0: Message is sent out; Other: Message is not sent out - */ -uint8_t gap_aes_encrypt(const uint8_t *key, const uint8_t *plaintext); - -#define HCI_VENDOR_CCM 0xFC01 - -uint8_t gap_start_ccm( - uint8_t type, // 0: encrypt 1: decrypt - uint8_t mic_size, - uint16_t msg_len, - uint16_t aad_len, - uint32_t tag, // same value will be reported in event - uint8_t *key, - uint8_t *nonce, - uint8_t *msg, - uint8_t *aad, - uint8_t *out_msg); - -//HCI func interface - -/** - * @brief Add event packet handler. - */ -void hci_add_event_handler(btstack_packet_callback_registration_t * callback_handler); - -/** - * @brief Registers a packet handler for ACL data. Used by L2CAP - */ -void hci_register_acl_packet_handler(btstack_packet_handler_t handler); - -/** - * @brief Requests the change of BTstack power mode. - */ -int hci_power_control(HCI_POWER_MODE mode); - - -/*********************************/ -typedef enum { - // No security - // No encryption required - // No authentication - LEVEL_1 = 1, - - // Unauthenticated pairing with encryption - LEVEL_2, - - // Authenticated pairing with encryption - LEVEL_3, - - // Authenticated LE Secure Connections pairing with encryption - LEVEL_4, -} gap_security_level_t; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/bundles/mesh/inc/gap_external.h b/bundles/mesh/inc/gap_external.h deleted file mode 100644 index 6565a3311..000000000 --- a/bundles/mesh/inc/gap_external.h +++ /dev/null @@ -1,951 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- -// Design Information -// ---------------------------------------------------------------------------- -// -// File : gap_external.h -// -// Author : YiyunDeng -// -// Organisation : INGCHIPS -// -// Date : 2019-03-01 -// -// Revision : v0.1 -// -// Project : ING91800 -// -// Description : -// -// ---------------------------------------------------------------------------- -// Revision History -// ---------------------------------------------------------------------------- -// -// Date Author Revision Change Description -// ========== =============== ========= ======================================= -// 2019/03/01 Dengyiyun v0.1 Creat -// -// ---------------------------------------------------------------------------- - -#ifndef __GAP_EXTERNAL_H -#define __GAP_EXTERNAL_H - -#include -#include "bt_types.h" -#include "btstack_config.h" -#if defined __cplusplus -extern "C" { -#endif - -typedef struct { - uint8_t type; - uint8_t val[6]; -} ble_addr_t2; - -#define BLE_GAP_EVENT_CONNECT 0 -#define BLE_GAP_EVENT_DISCONNECT 1 -/* Reserved 2 */ -#define BLE_GAP_EVENT_CONN_UPDATE 3 -#define BLE_GAP_EVENT_CONN_UPDATE_REQ 4 -#define BLE_GAP_EVENT_L2CAP_UPDATE_REQ 5 -#define BLE_GAP_EVENT_TERM_FAILURE 6 -#define BLE_GAP_EVENT_DISC 7 -#define BLE_GAP_EVENT_DISC_COMPLETE 8 -#define BLE_GAP_EVENT_ADV_COMPLETE 9 -#define BLE_GAP_EVENT_ENC_CHANGE 10 -#define BLE_GAP_EVENT_PASSKEY_ACTION 11 -#define BLE_GAP_EVENT_NOTIFY_RX 12 -#define BLE_GAP_EVENT_NOTIFY_TX 13 -#define BLE_GAP_EVENT_SUBSCRIBE 14 -#define BLE_GAP_EVENT_MTU 15 -#define BLE_GAP_EVENT_IDENTITY_RESOLVED 16 -#define BLE_GAP_EVENT_REPEAT_PAIRING 17 -#define BLE_GAP_EVENT_PHY_UPDATE_COMPLETE 18 -#define BLE_GAP_EVENT_EXT_DISC 19 - - -/*bit configure for */ -typedef enum PHY_BIT_TYPE -{ - PHY_CODED_BIT = BIT(2), - PHY_1M_BIT = BIT(0), - PHY_2M_BIT = BIT(1), -}phy_bittype_t; - -typedef enum PHY_TYPE -{ - PHY_1M = 0x01, - PHY_2M = 0x02, - PHY_CODED = 0x03, -}phy_type_t; - -typedef enum scan_type -{ - PASSIVE_SCAN = 0x00, - ACTIVE_SCAN = 0x01, -} scan_type_t; - -typedef enum Advertising_Event_Properties -{ - CONNECTABLE_ADV_BIT = BIT(0), - SCANNABLE_ADV_BIT = BIT(1), - DIRECT_ADV_BIT = BIT(2), - HIGH_DUTY_CIR_DIR_ADV_BIT = BIT(3), - LEGACY_PDU_BIT = BIT(4), - ANONY_ADV_BIT = BIT(5), - INC_TX_ADV_BIT = BIT(6) -}Advertising_Event_Properties_t; - -typedef enum Periodic_Advertising_Properties -{ - INC_TX_ADV_PERIOD_BIT = BIT(6), -}Periodic_Advertising_Properties_t; - -typedef struct ble_gap_event mesh_gap_event; -#if BLE50_ENABLED -/* Ext Adv Set enable parameters, not in HCI order */ - -struct ble_gap_ext_adv_params { - unsigned int connectable:1; - unsigned int scannable:1; - unsigned int directed:1; - unsigned int high_duty_directed:1; - unsigned int legacy_pdu:1; - unsigned int anonymous:1; - unsigned int include_tx_power:1; - unsigned int scan_req_notif:1; - - uint32_t itvl_min; - uint32_t itvl_max; - uint8_t channel_map; - uint8_t own_addr_type; - ble_addr_t2 peer; - uint8_t filter_policy; - uint8_t primary_phy; - uint8_t secondary_phy; - int8_t tx_power; - uint8_t sid; -}; - -struct ble_gap_ext_disc_params { - uint16_t itvl; - uint16_t window; - uint8_t passive:1; -}; - -struct ble_gap_ext_disc_desc { - /*** Common fields. */ - uint8_t props; - uint8_t data_status; - uint8_t legacy_event_type; - ble_addr_t2 addr; - int8_t rssi; - uint8_t tx_power; - uint8_t sid; - uint8_t prim_phy; - uint8_t sec_phy; - uint8_t length_data; - uint8_t *data; - /*** - * LE direct advertising report fields; direct_addr is BLE_ADDR_ANY if - * direct address fields are not present. - */ - bd_addr_t direct_addr; -}; -#endif - - -struct ble_gap_disc_params { - uint16_t itvl; - uint16_t window; - uint8_t filter_policy; - uint8_t limited:1; - uint8_t passive:1; - uint8_t filter_duplicates:1; -}; - -struct ble_gap_sec_state { - /** If connection is encrypted */ - unsigned encrypted:1; - - /** If connection is authenticated */ - unsigned authenticated:1; - - /** If connection is bonded (security information is stored) */ - unsigned bonded:1; - - /** Size of a key used for encryption */ - unsigned key_size:5; -}; - -struct ble_gap_disc_desc { - /*** Common fields. */ - uint8_t event_type; - uint8_t length_data; - bd_addr_t addr; - int8_t rssi; - uint8_t *data; - - /*** - * LE direct advertising report fields; direct_addr is BLE_ADDR_ANY if - * direct address fields are not present. - */ - bd_addr_t direct_addr; -}; - -/** @brief Connection descriptor */ -struct ble_gap_conn_desc { - /** Connection security state */ - struct ble_gap_sec_state sec_state; - - /** Local identity address */ - bd_addr_t our_id_addr; - - /** Peer identity address */ - bd_addr_t peer_id_addr; - - /** Local over-the-air address */ - bd_addr_t our_ota_addr; - - /** Peer over-the-air address */ - bd_addr_t peer_ota_addr; - - /** Connection handle */ - uint16_t conn_handle; - - /** Connection interval */ - uint16_t conn_itvl; - - /** Connection latency */ - uint16_t conn_latency; - - /** Connection supervision timeout */ - uint16_t supervision_timeout; - - /** Connection Role - * Possible values BLE_GAP_ROLE_SLAVE or BLE_GAP_ROLE_MASTER - */ - uint8_t role; - - /** Master clock accuracy */ - uint8_t master_clock_accuracy; -}; - -struct ble_gap_event -{ - /** - * Indicates the type of GAP event that occurred. This is one of the - * BLE_GAP_EVENT codes. - */ - uint8_t type; - - /** - * A discriminated union containing additional details concerning the GAP - * event. The 'type' field indicates which member of the union is valid. - */ - union { - /** - * Represents a connection attempt. Valid for the following event - * types: - * o BLE_GAP_EVENT_CONNECT - */ - struct { - /** - * The status of the connection attempt; - * o 0: the connection was successfully established. - * o BLE host error code: the connection attempt failed for - * the specified reason. - */ - int status; - - /** The handle of the relevant connection. */ - uint16_t conn_handle; - } connect; - - /** - * Represents a terminated connection. Valid for the following event - * types: - * o BLE_GAP_EVENT_DISCONNECT - */ - struct { - /** - * A BLE host return code indicating the reason for the - * disconnect. - */ - int reason; - - /** Information about the connection prior to termination. */ - struct ble_gap_conn_desc conn; - } disconnect; - - /** - * Represents an advertising report received during a discovery - * procedure. Valid for the following event types: - * o BLE_GAP_EVENT_DISC - */ - struct ble_gap_disc_desc disc; - -#if (BLE50_ENABLED) - /** - * Represents an extended advertising report received during a discovery - * procedure. Valid for the following event types: - * o BLE_GAP_EVENT_EXT_DISC - */ - struct ble_gap_ext_disc_desc ext_disc; -#endif - - /** - * Represents a completed discovery procedure. Valid for the following - * event types: - * o BLE_GAP_EVENT_DISC_COMPLETE - */ - struct { - /** - * The reason the discovery procedure stopped. Typical reason - * codes are: - * o 0: Duration expired. - * o BLE_HS_EPREEMPTED: Host aborted procedure to configure a - * peer's identity. - */ - int reason; - } disc_complete; - - /** - * Represents a completed advertise procedure. Valid for the following - * event types: - * o BLE_GAP_EVENT_ADV_COMPLETE - */ - struct { - /** - * The reason the advertise procedure stopped. Typical reason - * codes are: - * o 0: Terminated due to connection. - * o BLE_HS_ETIMEOUT: Duration expired. - * o BLE_HS_EPREEMPTED: Host aborted procedure to configure a - * peer's identity. - */ - int reason; - -#if 0 //(BLE50_ENABLED) - /** Advertising instance */ - uint8_t instance; - /** The handle of the relevant connection - valid if reason=0 */ - uint16_t conn_handle; - /** - * Number of completed extended advertising events - * - * This field is only valid if non-zero max_events was passed to - * ble_gap_ext_adv_start() and advertising completed due to duration - * timeout or max events transmitted. - * */ - uint8_t num_ext_adv_events; -#endif - } adv_complete; - - /** - * Represents a failed attempt to terminate an established connection. - * Valid for the following event types: - * o BLE_GAP_EVENT_TERM_FAILURE - */ - struct { - /** - * A BLE host return code indicating the reason for the failure. - */ - int status; - - /** The handle of the relevant connection. */ - uint16_t conn_handle; - } term_failure; - /** - * Represents a state change in a peer's subscription status. In this - * comment, the term "update" is used to refer to either a notification - * or an indication. This event is triggered by any of the following - * occurrences: - * o Peer enables or disables updates via a CCCD write. - * o Connection is about to be terminated and the peer is - * subscribed to updates. - * o Peer is now subscribed to updates after its state was restored - * from persistence. This happens when bonding is restored. - * - * Valid for the following event types: - * o BLE_GAP_EVENT_SUBSCRIBE - */ - struct { - /** The handle of the relevant connection. */ - uint16_t conn_handle; - - /** The value handle of the relevant characteristic. */ - uint16_t attr_handle; - - /** One of the BLE_GAP_SUBSCRIBE_REASON codes. */ - uint8_t reason; - - /** Whether the peer was previously subscribed to notifications. */ - uint8_t prev_notify:1; - - /** Whether the peer is currently subscribed to notifications. */ - uint8_t cur_notify:1; - - /** Whether the peer was previously subscribed to indications. */ - uint8_t prev_indicate:1; - - /** Whether the peer is currently subscribed to indications. */ - uint8_t cur_indicate:1; - } subscribe; - - }; -}; -struct ble_gap_adv_params { - /** Advertising mode. Can be one of following constants: - * - BLE_GAP_CONN_MODE_NON (non-connectable; 3.C.9.3.2). - * - BLE_GAP_CONN_MODE_DIR (directed-connectable; 3.C.9.3.3). - * - BLE_GAP_CONN_MODE_UND (undirected-connectable; 3.C.9.3.4). - */ - uint8_t conn_mode; - /** Discoverable mode. Can be one of following constants: - * - BLE_GAP_DISC_MODE_NON (non-discoverable; 3.C.9.2.2). - * - BLE_GAP_DISC_MODE_LTD (limited-discoverable; 3.C.9.2.3). - * - BLE_GAP_DISC_MODE_GEN (general-discoverable; 3.C.9.2.4). - */ - uint8_t disc_mode; - - /** Minimum advertising interval, if 0 stack use sane defaults */ - uint16_t itvl_min; - /** Maximum advertising interval, if 0 stack use sane defaults */ - uint16_t itvl_max; - /** Advertising channel map , if 0 stack use sane defaults */ - uint8_t channel_map; - - /** Advertising Filter policy */ - uint8_t filter_policy; - - /** If do High Duty cycle for Directed Advertising */ - uint8_t high_duty_cycle:1; -}; - -typedef int ble_gap_event_fn(struct ble_gap_event *event, void *arg); -struct ble_gap_mesh_state { - ble_gap_event_fn *cb; - void *cb_arg; -}; - -extern struct ble_gap_mesh_state ble_gap_mesh; - -typedef struct le_connection_parameter_range{ - uint16_t le_conn_interval_min; - uint16_t le_conn_interval_max; - uint16_t le_conn_latency_min; - uint16_t le_conn_latency_max; - uint16_t le_supervision_timeout_min; - uint16_t le_supervision_timeout_max; -} le_connection_parameter_range_t; - -/***add by haoyanbiao 2016.11.23****/ -typedef enum{ - - //DEVDISC_MODE_NONDISCOVERABLE, - //No discoverable setting. - GENERAL_DISCOV_PROC=0X01, - //General Discoverable devices. - LIMITED_DISCOV_PROC, - //Limited Discoverable devices. - GENERAL_CONNECTION_PROC, - //DEVDISC_MODE_ALL -}gap_pro_state_t; - -typedef struct pro_ongoing{ -gap_pro_state_t discover_type; -}pro_ongoing_t; - -// void gap_dispose_set_scan_para_complete(uint8_t status); -typedef void (*f_gap_dispose_set_scan_para_complete)(uint8_t status); -#define gap_dispose_set_scan_para_complete ((f_gap_dispose_set_scan_para_complete)(0x000129f9)) - -// void gap_dispose_set_adv_para_complete(uint8_t status); -typedef void (*f_gap_dispose_set_adv_para_complete)(uint8_t status); -#define gap_dispose_set_adv_para_complete ((f_gap_dispose_set_adv_para_complete)(0x00012979)) - -// uint8_t gap_discovery_proc_init(gap_pro_state_t discover_type,uint8_t app_id); -typedef uint8_t (*f_gap_discovery_proc_init)(gap_pro_state_t discover_type,uint8_t app_id); -#define gap_discovery_proc_init ((f_gap_discovery_proc_init)(0x0001292d)) - -// uint8_t gap_general_connection_proc_init(uint8_t app_id); -typedef uint8_t (*f_gap_general_connection_proc_init)(uint8_t app_id); -#define gap_general_connection_proc_init ((f_gap_general_connection_proc_init)(0x00012a35)) - -// uint8_t gap_auto_connection_proc_init(uint8_t app_id,bd_addr_type_t address_type, bd_addr_t address); -typedef uint8_t (*f_gap_auto_connection_proc_init)(uint8_t app_id,bd_addr_type_t address_type, bd_addr_t address); -#define gap_auto_connection_proc_init ((f_gap_auto_connection_proc_init)(0x000125f5)) - -// void fill_advertising_report_from_packet(advertising_report_t * report, const uint8_t *packet); -typedef void (*f_fill_advertising_report_from_packet)(advertising_report_t * report, const uint8_t *packet); -#define fill_advertising_report_from_packet ((f_fill_advertising_report_from_packet)(0x000115f5)) - -// void fill_ext_advertising_report_from_packet(ext_advertising_report_t * report, const uint8_t *packet); -typedef void (*f_fill_ext_advertising_report_from_packet)(ext_advertising_report_t * report, const uint8_t *packet); -#define fill_ext_advertising_report_from_packet ((f_fill_ext_advertising_report_from_packet)(0x00011631)) - -// void fill_period_report_from_packet(prd_advertising_report_t * report, const uint8_t *packet); -typedef void (*f_fill_period_report_from_packet)(prd_advertising_report_t * report, const uint8_t *packet); -#define fill_period_report_from_packet ((f_fill_period_report_from_packet)(0x0001169d)) - -// void gap_get_advertisingReport(advertising_report_t * report, const uint8_t *packet); -typedef void (*f_gap_get_advertisingReport)(advertising_report_t * report, const uint8_t *packet); -#define gap_get_advertisingReport ((f_gap_get_advertisingReport)(0x00012a61)) - -// uint8_t gap_observe_proc_init(uint8_t app_id); -typedef uint8_t (*f_gap_observe_proc_init)(uint8_t app_id); -#define gap_observe_proc_init ((f_gap_observe_proc_init)(0x00012c69)) - - -/** - * @brief Set parameters for LE Scan - */ -// void gap_set_scan_parameters(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window); -typedef void (*f_gap_set_scan_parameters)(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window); -#define gap_set_scan_parameters ((f_gap_set_scan_parameters)(0x00013069)) - - -/** - * @brief Start LE Scan - */ -// void gap_start_scan(void); -typedef void (*f_gap_start_scan)(void); -#define gap_start_scan ((f_gap_start_scan)(0x00013125)) - - -/** - * @brief Stop LE Scan - */ -// void gap_stop_scan(void); -typedef void (*f_gap_stop_scan)(void); -#define gap_stop_scan ((f_gap_stop_scan)(0x000131c1)) - -// Classic | LE - -// void gap_set_random_device_address(bd_addr_t address); -typedef void (*f_gap_set_random_device_address)(bd_addr_t address); -#define gap_set_random_device_address ((f_gap_set_random_device_address)(0x0001305d)) - - - -/** - * @brief Enable privacy by using random addresses - * @param random_address_type to use (incl. OFF) - */ -// void gap_random_address_set_mode(gap_random_address_type_t random_address_type); -typedef void (*f_gap_random_address_set_mode)(gap_random_address_type_t random_address_type); -#define gap_random_address_set_mode ((f_gap_random_address_set_mode)(0x00012da9)) - - -/** - * @brief Sets a fixed random address for advertising - * @param addr - * @note Sets random address mode to type off - */ -// void gap_random_address_set(bd_addr_t addr); -typedef void (*f_gap_random_address_set)(bd_addr_t addr); -#define gap_random_address_set ((f_gap_random_address_set)(0x00012d81)) - -/** - * @brief Get privacy mode - */ -// gap_random_address_type_t gap_random_address_get_mode(void); -typedef gap_random_address_type_t (*f_gap_random_address_get_mode)(void); -#define gap_random_address_get_mode ((f_gap_random_address_get_mode)(0x00012d75)) - - - -/** - * @brief Auto Connection Establishment - Start Connecting to device - * @param address_typ - * @param address - * @returns 0 if ok - */ -// int gap_auto_connection_start(bd_addr_type_t address_typ, bd_addr_t address); -typedef int (*f_gap_auto_connection_start)(bd_addr_type_t address_typ, bd_addr_t address); -#define gap_auto_connection_start ((f_gap_auto_connection_start)(0x00012621)) - -// uint8_t gap_auto_connect(void); -typedef uint8_t (*f_gap_auto_connect)(void); -#define gap_auto_connect ((f_gap_auto_connect)(0x000125ad)) - - -/** - * @brief Auto Connection Establishment - Stop Connecting to device - * @param address_typ - * @param address - * @returns 0 if ok - */ -// int gap_auto_connection_stop(bd_addr_type_t address_typ, bd_addr_t address); -typedef int (*f_gap_auto_connection_stop)(bd_addr_type_t address_typ, bd_addr_t address); -#define gap_auto_connection_stop ((f_gap_auto_connection_stop)(0x00012671)) - - -/** - * @brief Auto Connection Establishment - Stop everything - * @note Convenience function to stop all active auto connection attempts - */ -// void gap_auto_connection_stop_all(void); -typedef void (*f_gap_auto_connection_stop_all)(void); -#define gap_auto_connection_stop_all ((f_gap_auto_connection_stop_all)(0x00012681)) - - - -/** - * @brief Connect to remote LE device - */ -// uint8_t gap_connect(bd_addr_t addr, bd_addr_type_t addr_type); -typedef uint8_t (*f_gap_connect)(bd_addr_t addr, bd_addr_type_t addr_type); -#define gap_connect ((f_gap_connect)(0x0001272d)) - - - -/** - * @brief Disconnect connection with handle - * @param handle - */ -// uint8_t gap_disconnect(hci_con_handle_t handle); -typedef uint8_t (*f_gap_disconnect)(hci_con_handle_t handle); -#define gap_disconnect ((f_gap_disconnect)(0x000128a5)) - - -/** - * @brief Get connection type - * @param con_handle - * @result connection_type - */ -// gap_connection_type_t gap_get_connection_type(hci_con_handle_t connection_handle); -typedef gap_connection_type_t (*f_gap_get_connection_type)(hci_con_handle_t connection_handle); -#define gap_get_connection_type ((f_gap_get_connection_type)(0x00012ae9)) - - - -/** - * @brief Set Advertisement Data - * @param advertising_data_length - * @param advertising_data (max 31 octets) - * @note data is not copied, pointer has to stay valid - */ -// void gap_advertisements_set_data(uint8_t advertising_data_length, uint8_t * advertising_data); -typedef void (*f_gap_advertisements_set_data)(uint8_t advertising_data_length, uint8_t * advertising_data); -#define gap_advertisements_set_data ((f_gap_advertisements_set_data)(0x00012555)) - - -/** - * @brief Set Advertisement Paramters - * @param adv_int_min - * @param adv_int_max - * @param adv_type - * @param direct_address_type - * @param direct_address - * @param channel_map - * @param filter_policy - * @note own_address_type is used from gap_random_address_set_mode - */ -// void gap_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type, -// uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy); -typedef void (*f_gap_advertisements_set_params)(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type, - uint8_t direct_address_typ, bd_addr_t direct_address, uint8_t channel_map, uint8_t filter_policy); -#define gap_advertisements_set_params ((f_gap_advertisements_set_params)(0x00012571)) - - -/** - * @brief Enable/Disable Advertisements - * @param enabled - */ -// void gap_advertisements_enable(int enabled); -typedef void (*f_gap_advertisements_enable)(int enabled); -#define gap_advertisements_enable ((f_gap_advertisements_enable)(0x000124f9)) - - -/** - * @brief Set Scan Response Data - * - * @note For scan response data, scannable undirected advertising (ADV_SCAN_IND) need to be used - * - * @param advertising_data_length - * @param advertising_data (max 31 octets) - * @note data is not copied, pointer has to stay valid - */ -// void gap_scan_response_set_data(uint8_t scan_response_data_length, uint8_t * scan_response_data); -typedef void (*f_gap_scan_response_set_data)(uint8_t scan_response_data_length, uint8_t * scan_response_data); -#define gap_scan_response_set_data ((f_gap_scan_response_set_data)(0x00012f95)) - -// void ble_gap_set_whitelist(bd_addr_t address,bd_addr_type_t addtype); -typedef void (*f_ble_gap_set_whitelist)(bd_addr_t address,bd_addr_type_t addtype); -#define ble_gap_set_whitelist ((f_ble_gap_set_whitelist)(0x00008939)) - -// void ble_gap_remove_whitelist(bd_addr_t address,bd_addr_type_t addtype); -typedef void (*f_ble_gap_remove_whitelist)(bd_addr_t address,bd_addr_type_t addtype); -#define ble_gap_remove_whitelist ((f_ble_gap_remove_whitelist)(0x00008925)) - - -// app_timer_source_t* btstack_memory_dtbt_app_timer_get(void); -typedef app_timer_source_t* (*f_btstack_memory_dtbt_app_timer_get)(void); -// WARNING: this API is not available in this release -#define btstack_memory_dtbt_app_timer_get ((f_btstack_memory_dtbt_app_timer_get)(btstack_memory_dtbt_app_timer_get)) - -// void btstack_memory_dtbt_app_timer_free(app_timer_source_t *dtbt_app_timer); -typedef void (*f_btstack_memory_dtbt_app_timer_free)(app_timer_source_t *dtbt_app_timer); -#define btstack_memory_dtbt_app_timer_free ((f_btstack_memory_dtbt_app_timer_free)(0x0000e67d)) - -// uint8_t app_funregister(APP_TimerExpFun funaddr); -typedef uint8_t (*f_app_funregister)(APP_TimerExpFun funaddr); -#define app_funregister ((f_app_funregister)(0x00006995)) - - -//for customer timer API. -// void app_OS_Timer(TimerHandle_t xTimer); -typedef void (*f_app_OS_Timer)(TimerHandle_t xTimer); -#define app_OS_Timer ((f_app_OS_Timer)(0x000068b5)) - -// void app_set_timer(app_timer_source_t *a,uint32_t timerid, uint32_t timeout_in_ms,uint8_t opt); -typedef void (*f_app_set_timer)(app_timer_source_t *a,uint32_t timerid, uint32_t timeout_in_ms,uint8_t opt); -#define app_set_timer ((f_app_set_timer)(0x00007281)) - -// void app_timer_delete(app_timer_source_t *a); -typedef void (*f_app_timer_delete)(app_timer_source_t *a); -#define app_timer_delete ((f_app_timer_delete)(0x000072dd)) - -// void app_add_timer(app_timer_source_t *ts); -typedef void (*f_app_add_timer)(app_timer_source_t *ts); -#define app_add_timer ((f_app_add_timer)(0x00006979)) - -// void reverse_bd_addr(const bd_addr_t src, bd_addr_t dest); -typedef void (*f_reverse_bd_addr)(const bd_addr_t src, bd_addr_t dest); -#define reverse_bd_addr ((f_reverse_bd_addr)(0x0003387b)) - -#if (BLE50_ENABLED) -// uint8_t gap_LE_read_phy(uint16_t connecton_handler); -typedef uint8_t (*f_gap_LE_read_phy)(uint16_t connecton_handler); -// WARNING: this API is not available in this release -#define gap_LE_read_phy ((f_gap_LE_read_phy)(gap_LE_read_phy)) - -// uint8_t gap_LE_set_def_phy(uint8_t ALL_PHYS,uint8_t TX_PHYS ,uint8_t RX_PHYS); -typedef uint8_t (*f_gap_LE_set_def_phy)(uint8_t ALL_PHYS,uint8_t TX_PHYS ,uint8_t RX_PHYS); -// WARNING: this API is not available in this release -#define gap_LE_set_def_phy ((f_gap_LE_set_def_phy)(gap_LE_set_def_phy)) - -// uint8_t gap_LE_set_phy(uint16_t con_handle,uint8_t all_phys,uint8_t tx_phys,uint8_t rx_phys,uint8_t phy_opt); -typedef uint8_t (*f_gap_LE_set_phy)(uint16_t con_handle,uint8_t all_phys,uint8_t tx_phys,uint8_t rx_phys,uint8_t phy_opt); -// WARNING: this API is not available in this release -#define gap_LE_set_phy ((f_gap_LE_set_phy)(gap_LE_set_phy)) - -// uint8_t gap_LE_Advertising_Set_Random_Address(uint8_t con_handle,bd_addr_t random_addr); -typedef uint8_t (*f_gap_LE_Advertising_Set_Random_Address)(uint8_t con_handle,bd_addr_t random_addr); -// WARNING: this API is not available in this release -#define gap_LE_Advertising_Set_Random_Address ((f_gap_LE_Advertising_Set_Random_Address)(gap_LE_Advertising_Set_Random_Address)) - -// uint8_t gap_LE_set_ext_scan_para(bd_addr_type_t,uint8_t filter,phy_bittype_t phys,scan_type_t scan_type, uint16_t scan_interval, uint16_t scan_window,...); -typedef uint8_t (*f_gap_LE_set_ext_scan_para)(bd_addr_type_t,uint8_t filter,phy_bittype_t phys,scan_type_t scan_type, uint16_t scan_interval, uint16_t scan_window,...); -// WARNING: this API is not available in this release -#define gap_LE_set_ext_scan_para ((f_gap_LE_set_ext_scan_para)(gap_LE_set_ext_scan_para)) - -// uint8_t gap_LE_ext_scan_response_set_data(uint8_t ad_handle,uint16_t scan_response_data_length, uint8_t * scan_response_data); -typedef uint8_t (*f_gap_LE_ext_scan_response_set_data)(uint8_t ad_handle,uint16_t scan_response_data_length, uint8_t * scan_response_data); -// WARNING: this API is not available in this release -#define gap_LE_ext_scan_response_set_data ((f_gap_LE_ext_scan_response_set_data)(gap_LE_ext_scan_response_set_data)) - -// uint8_t gap_LE_set_ext_scan_enable(uint8_t enable,uint8_t filter,uint16_t duration, uint16_t period ); -typedef uint8_t (*f_gap_LE_set_ext_scan_enable)(uint8_t enable,uint8_t filter,uint16_t duration, uint16_t period ); -// WARNING: this API is not available in this release -#define gap_LE_set_ext_scan_enable ((f_gap_LE_set_ext_scan_enable)(gap_LE_set_ext_scan_enable)) - -// uint8_t gap_LE_set_ext_adv_enable(uint8_t enable,uint8_t numberofset,...); -typedef uint8_t (*f_gap_LE_set_ext_adv_enable)(uint8_t enable,uint8_t numberofset,...); -// WARNING: this API is not available in this release -#define gap_LE_set_ext_adv_enable ((f_gap_LE_set_ext_adv_enable)(gap_LE_set_ext_adv_enable)) - -// uint8_t gap_LE_set_ext_adv_para(uint8_t,Advertising_Event_Properties_t Advertising_Event_Properties,uint32_t Primary_Advertising_Interval_Min,uint32_t Primary_Advertising_Interval_Max,uint8_t Primary_Advertising_Channel_Map, -// bd_addr_type_t Own_Address_Type,bd_addr_type_t Peer_Address_Type, bd_addr_t Peer_Address,uint8_t Advertising_Filter_Policy, int8_t Advertising_Tx_Power,phy_type_t Primary_Advertising_PHY, -// uint8_t Secondary_Advertising_Max_Skip, phy_type_t Secondary_Advertising_PHY,uint8_t Advertising_SID,uint8_t Scan_Request_Notification_Enable); -typedef uint8_t (*f_gap_LE_set_ext_adv_para)(uint8_t,Advertising_Event_Properties_t Advertising_Event_Properties,uint32_t Primary_Advertising_Interval_Min,uint32_t Primary_Advertising_Interval_Max,uint8_t Primary_Advertising_Channel_Map, - bd_addr_type_t Own_Address_Type,bd_addr_type_t Peer_Address_Type, bd_addr_t Peer_Address,uint8_t Advertising_Filter_Policy, int8_t Advertising_Tx_Power,phy_type_t Primary_Advertising_PHY, - uint8_t Secondary_Advertising_Max_Skip, phy_type_t Secondary_Advertising_PHY,uint8_t Advertising_SID,uint8_t Scan_Request_Notification_Enable); -// WARNING: this API is not available in this release -#define gap_LE_set_ext_adv_para ((f_gap_LE_set_ext_adv_para)(gap_LE_set_ext_adv_para)) - -// uint8_t gap_LE_set_ext_adv_data(uint8_t Advertising_Handle,uint16_t Data_Length,uint8_t* data); -typedef uint8_t (*f_gap_LE_set_ext_adv_data)(uint8_t Advertising_Handle,uint16_t Data_Length,uint8_t* data); -// WARNING: this API is not available in this release -#define gap_LE_set_ext_adv_data ((f_gap_LE_set_ext_adv_data)(gap_LE_set_ext_adv_data)) - -// uint8_t gap_LE_set_period_adv_data(uint8_t Advertising_Handle,uint16_t data_len,uint8_t* data); -typedef uint8_t (*f_gap_LE_set_period_adv_data)(uint8_t Advertising_Handle,uint16_t data_len,uint8_t* data); -// WARNING: this API is not available in this release -#define gap_LE_set_period_adv_data ((f_gap_LE_set_period_adv_data)(gap_LE_set_period_adv_data)) - -// uint8_t gap_LE_set_period_adv_enable(uint8_t enable,uint8_t adv_handle); //return handler -typedef uint8_t (*f_gap_LE_set_period_adv_enable)(uint8_t enable,uint8_t adv_handle); //return handler -// WARNING: this API is not available in this release -#define gap_LE_set_period_adv_enable ((f_gap_LE_set_period_adv_enable)(gap_LE_set_period_adv_enable)) - -// uint8_t gap_LE_set_period_adv_para(uint8_t adv_handle,uint8_t Periodic_Advertising_Interval_Min,uint8_t Periodic_Advertising_Interval_Max,Periodic_Advertising_Properties_t Periodic_Advertising_Properties); -typedef uint8_t (*f_gap_LE_set_period_adv_para)(uint8_t adv_handle,uint8_t Periodic_Advertising_Interval_Min,uint8_t Periodic_Advertising_Interval_Max,Periodic_Advertising_Properties_t Periodic_Advertising_Properties); -// WARNING: this API is not available in this release -#define gap_LE_set_period_adv_para ((f_gap_LE_set_period_adv_para)(gap_LE_set_period_adv_para)) - -// uint8_t gap_LE_clr_advset(void); -typedef uint8_t (*f_gap_LE_clr_advset)(void); -// WARNING: this API is not available in this release -#define gap_LE_clr_advset ((f_gap_LE_clr_advset)(gap_LE_clr_advset)) - -// uint8_t gap_LE_remove_advset(uint8_t adv_handle); -typedef uint8_t (*f_gap_LE_remove_advset)(uint8_t adv_handle); -// WARNING: this API is not available in this release -#define gap_LE_remove_advset ((f_gap_LE_remove_advset)(gap_LE_remove_advset)) - -// uint8_t gap_LE_read_max_adv_data_len(void); -typedef uint8_t (*f_gap_LE_read_max_adv_data_len)(void); -// WARNING: this API is not available in this release -#define gap_LE_read_max_adv_data_len ((f_gap_LE_read_max_adv_data_len)(gap_LE_read_max_adv_data_len)) - -// uint8_t gap_LE_period_adv_create_sync(uint8_t Filter_Policy,uint8_t Advertising_SID,uint8_t Advertiser_Address_Type,bd_addr_t Advertiser_Address,uint16_t Skip,uint16_t Sync_Timeout,uint8_t reseved); -typedef uint8_t (*f_gap_LE_period_adv_create_sync)(uint8_t Filter_Policy,uint8_t Advertising_SID,uint8_t Advertiser_Address_Type,bd_addr_t Advertiser_Address,uint16_t Skip,uint16_t Sync_Timeout,uint8_t reseved); -// WARNING: this API is not available in this release -#define gap_LE_period_adv_create_sync ((f_gap_LE_period_adv_create_sync)(gap_LE_period_adv_create_sync)) - -// uint8_t gap_LE_period_adv_create_sync_cancel(void); -typedef uint8_t (*f_gap_LE_period_adv_create_sync_cancel)(void); -// WARNING: this API is not available in this release -#define gap_LE_period_adv_create_sync_cancel ((f_gap_LE_period_adv_create_sync_cancel)(gap_LE_period_adv_create_sync_cancel)) - -// uint8_t gap_LE_period_adv_term_sync(uint16_t sync_handle); -typedef uint8_t (*f_gap_LE_period_adv_term_sync)(uint16_t sync_handle); -// WARNING: this API is not available in this release -#define gap_LE_period_adv_term_sync ((f_gap_LE_period_adv_term_sync)(gap_LE_period_adv_term_sync)) - -// uint8_t gap_LE_ADD_DEV_TO_PERIOD_list(uint8_t address_type,bd_addr_t address,uint8_t SID); -typedef uint8_t (*f_gap_LE_ADD_DEV_TO_PERIOD_list)(uint8_t address_type,bd_addr_t address,uint8_t SID); -// WARNING: this API is not available in this release -#define gap_LE_ADD_DEV_TO_PERIOD_list ((f_gap_LE_ADD_DEV_TO_PERIOD_list)(gap_LE_ADD_DEV_TO_PERIOD_list)) - -// uint8_t gap_LE_clr_period_adv_list(void); -typedef uint8_t (*f_gap_LE_clr_period_adv_list)(void); -// WARNING: this API is not available in this release -#define gap_LE_clr_period_adv_list ((f_gap_LE_clr_period_adv_list)(gap_LE_clr_period_adv_list)) - -// uint8_t gap_LE_read_period_adv_list_size(void); -typedef uint8_t (*f_gap_LE_read_period_adv_list_size)(void); -// WARNING: this API is not available in this release -#define gap_LE_read_period_adv_list_size ((f_gap_LE_read_period_adv_list_size)(gap_LE_read_period_adv_list_size)) - -// uint8_t gap_LE_ext_create_connection(uint8_t Initiator_Filter_Policy,bd_addr_type_t Own_Address_Type,bd_addr_type_t Peer_Address_Type,bd_addr_t Peer_Address,phy_bittype_t Initiating_PHYs, -// /*uint16_t scan_int,uint16_t scan_win,uint16_t conn_int_min,uint16_t conn_int_max,uint16_t conn_latency, uint16_t supp_tmo, uint16_t min_ce_len, uint16_t max_ce_len,*/...); -typedef uint8_t (*f_gap_LE_ext_create_connection)(uint8_t Initiator_Filter_Policy,bd_addr_type_t Own_Address_Type,bd_addr_type_t Peer_Address_Type,bd_addr_t Peer_Address,phy_bittype_t Initiating_PHYs, - /*uint16_t scan_int,uint16_t scan_win,uint16_t conn_int_min,uint16_t conn_int_max,uint16_t conn_latency, uint16_t supp_tmo, uint16_t min_ce_len, uint16_t max_ce_len,*/...); -// WARNING: this API is not available in this release -#define gap_LE_ext_create_connection ((f_gap_LE_ext_create_connection)(gap_LE_ext_create_connection)) - -// uint8_t gap_LE_set_host_channel_classification(uint32_t channel_low, uint8_t channel_high); -typedef uint8_t (*f_gap_LE_set_host_channel_classification)(uint32_t channel_low, uint8_t channel_high); -// WARNING: this API is not available in this release -#define gap_LE_set_host_channel_classification ((f_gap_LE_set_host_channel_classification)(gap_LE_set_host_channel_classification)) - - -#endif - - -/** - * @brief Sets update period for random address - * @param period_ms in ms - */ -// void gap_random_address_set_update_period(int period_ms); -typedef void (*f_gap_random_address_set_update_period)(int period_ms); -#define gap_random_address_set_update_period ((f_gap_random_address_set_update_period)(0x00012dd1)) - - - -/** - * @brief Request an update of the connection parameter for a given LE connection - * @param handle - * @param conn_interval_min (unit: 1.25ms) - * @param conn_interval_max (unit: 1.25ms) - * @param conn_latency - * @param supervision_timeout (unit: 10ms) - * @returns 0 if ok - */ -// int gap_request_connection_parameter_update(hci_con_handle_t con_handle, uint16_t conn_interval_min, -// uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout); -typedef int (*f_gap_request_connection_parameter_update)(hci_con_handle_t con_handle, uint16_t conn_interval_min, - uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout); -// WARNING: this API is not available in this release -#define gap_request_connection_parameter_update ((f_gap_request_connection_parameter_update)(gap_request_connection_parameter_update)) - - -/** - * @brief Updates the connection parameters for a given LE connection - * @param handle - * @param conn_interval_min (unit: 1.25ms) - * @param conn_interval_max (unit: 1.25ms) - * @param conn_latency - * @param supervision_timeout (unit: 10ms) - * @returns 0 if ok - */ -// int gap_update_connection_parameters(hci_con_handle_t con_handle, uint16_t conn_interval_min, -// uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout); -typedef int (*f_gap_update_connection_parameters)(hci_con_handle_t con_handle, uint16_t conn_interval_min, - uint16_t conn_interval_max, uint16_t conn_latency, uint16_t supervision_timeout); -#define gap_update_connection_parameters ((f_gap_update_connection_parameters)(0x000131dd)) - - -/** - * @brief Set accepted connection parameter range - * @param range - */ -// void gap_get_connection_parameter_range(le_connection_parameter_range_t * range); -typedef void (*f_gap_get_connection_parameter_range)(le_connection_parameter_range_t * range); -#define gap_get_connection_parameter_range ((f_gap_get_connection_parameter_range)(0x00012acd)) - - -/** - * @brief Get accepted connection parameter range - * @param range - */ -// void gap_set_connection_parameter_range(le_connection_parameter_range_t * range); -typedef void (*f_gap_set_connection_parameter_range)(le_connection_parameter_range_t * range); -#define gap_set_connection_parameter_range ((f_gap_set_connection_parameter_range)(0x00013025)) - - - -//HCI func interface - -/** - * @brief Add event packet handler. - */ -// void hci_add_event_handler(btstack_packet_callback_registration_t * callback_handler); -typedef void (*f_hci_add_event_handler)(btstack_packet_callback_registration_t * callback_handler); -#define hci_add_event_handler ((f_hci_add_event_handler)(0x00017b5d)) - - -/** - * @brief Registers a packet handler for ACL data. Used by L2CAP - */ -// void hci_register_acl_packet_handler(btstack_packet_handler_t handler); -typedef void (*f_hci_register_acl_packet_handler)(btstack_packet_handler_t handler); -#define hci_register_acl_packet_handler ((f_hci_register_acl_packet_handler)(0x00018c75)) - - -/** - * @brief Requests the change of BTstack power mode. - */ -// int hci_power_control(HCI_POWER_MODE mode); -typedef int (*f_hci_power_control)(HCI_POWER_MODE mode); -#define hci_power_control ((f_hci_power_control)(0x00018acd)) - - -#if defined __cplusplus -} -#endif - -#endif diff --git a/bundles/mesh/inc/gatt_client.h b/bundles/mesh/inc/gatt_client.h deleted file mode 100644 index 5723f5d79..000000000 --- a/bundles/mesh/inc/gatt_client.h +++ /dev/null @@ -1,421 +0,0 @@ -/** @file - * @brief generic access profile - * Copyright Message - * - * INGCHIPS confidential and proprietary. - * COPYRIGHT (c) 2018 by INGCHIPS - * - * All rights are reserved. Reproduction in whole or in part is - * prohibited without the written consent of the copyright owner. - * - * -*/ -// ---------------------------------------------------------------------------- - -#ifndef _GATT_CLIENT_H -#define _GATT_CLIENT_H - -#include -#include "bluetooth.h" -#include "bt_types.h" -#include "btstack_util.h" -#include "btstack_event.h" -#include "btstack_linked_list.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Bluetooth - * @defgroup Bluetooth_gatt_client - * @ingroup bluetooth_stack - * @{ - */ - -#define UUID128_LEN (16) - -#pragma pack(push, 1) - -typedef struct -{ - uint16_t handle; - uint8_t value[0]; // length is given in `value_size` -} gatt_event_value_packet_t; - -typedef struct -{ - uint16_t handle; - uint16_t offset; - uint8_t value[0]; // length is given in `value_size` -} gatt_event_long_value_packet_t; - -typedef struct -{ - hci_con_handle_t handle; - uint8_t status; -} gatt_event_query_complete_t; - -typedef struct -{ - uint16_t start_group_handle; - uint16_t end_group_handle; - uint8_t uuid128[UUID128_LEN]; -} gatt_client_service_t; - -typedef struct -{ - hci_con_handle_t handle; - gatt_client_service_t service; -} gatt_event_service_query_result_t; - -typedef struct { - uint16_t start_handle; - uint16_t value_handle; - uint16_t end_handle; - uint16_t properties; - uint8_t uuid128[UUID128_LEN]; -} gatt_client_characteristic_t; - -typedef struct -{ - hci_con_handle_t handle; - gatt_client_characteristic_t characteristic; -} gatt_event_characteristic_query_result_t; - -typedef struct { - uint16_t handle; - uint8_t uuid128[UUID128_LEN]; -} gatt_client_characteristic_descriptor_t; - -typedef struct -{ - hci_con_handle_t handle; - gatt_client_characteristic_descriptor_t descriptor; -} gatt_event_characteristic_descriptor_query_result_t; - -typedef struct -{ - hci_con_handle_t handle; - uint16_t include_handle; - gatt_client_service_t service; -} gatt_event_included_service_query_result_t; - -typedef struct { - hci_con_handle_t handle; - gatt_client_characteristic_descriptor_t descriptor; -} gatt_event_all_characteristic_descriptors_query_result_t; - -#pragma pack(pop) - -/** - * @brief Discovers all primary services. For each found service, an le_service_event_t with type set to GATT_EVENT_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t, with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -uint8_t gatt_client_discover_primary_services(user_packet_handler_t callback, hci_con_handle_t con_handle); - -/** - * @brief Discovers a specific primary service given its UUID. This service may exist multiple times. For each found service, an le_service_event_t with type set to GATT_EVENT_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t, with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -uint8_t gatt_client_discover_primary_services_by_uuid16(user_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t uuid16); -uint8_t gatt_client_discover_primary_services_by_uuid128(user_packet_handler_t callback, hci_con_handle_t con_handle, const uint8_t * uuid128); - - -/** - * @brief Finds included services within the specified service. For each found included service, an le_service_event_t with type set to GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. Information about included service type (primary/secondary) can be retrieved either by sending an ATT find information request for the returned start group handle (returning the handle and the UUID for primary or secondary service) or by comparing the service to the list of all primary services. - */ -uint8_t gatt_client_find_included_services_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, - const uint16_t start_group_handle, const uint16_t end_group_handle); - - -/** - * @brief The following function are used to discover all characteristics within the specified service or handle range - */ -uint8_t gatt_client_discover_characteristics_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, - const uint16_t start_group_handle, const uint16_t end_group_handle); - -/** - * @brief The following two functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid16(btstack_packet_handler_t callback, - const hci_con_handle_t con_handle, const uint16_t start_handle, const uint16_t end_handle, const uint16_t uuid16); -uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid128(btstack_packet_handler_t callback, - const hci_con_handle_t con_handle, const uint16_t start_handle, const uint16_t end_handle, - const uint8_t * uuid128); - -/** - * @brief Discovers attribute handle and UUID of a characteristic descriptor within the specified characteristic. For each found descriptor, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -uint8_t gatt_client_discover_characteristic_descriptors(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); - -/** - * @brief Reads the characteristic value using the characteristic's value handle. If the characteristic value is found, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -uint8_t gatt_client_read_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); - -/** - * @brief Reads the characteric value of all characteristics with the uuid. For each found, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -uint8_t gatt_client_read_value_of_characteristics_by_uuid16(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint16_t uuid16); -uint8_t gatt_client_read_value_of_characteristics_by_uuid128(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint8_t * uuid128); - -/** - * @brief Reads the long characteristic value using the characteristic's value handle. The value will be returned in several blobs. For each blob, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT and updated value offset will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, mark the end of read. - */ -uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); -uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset); - -/* - * @brief Read multiple characteristic values - * @param number handles - * @param list_of_handles list of handles - */ -uint8_t gatt_client_read_multiple_characteristic_values(btstack_packet_handler_t callback, hci_con_handle_t con_handle, int num_value_handles, uint16_t * value_handles); - -/** - * @brief Writes the characteristic value using the characteristic's value handle without an acknowledgment that the write was successfully performed. - */ -uint8_t gatt_client_write_value_of_characteristic_without_response(hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); - -/** - * @brief Writes the authenticated characteristic value using the characteristic's value handle without an acknowledgment that the write was successfully performed. - */ -uint8_t gatt_client_signed_write_without_response(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t handle, uint16_t message_len, uint8_t * message); - -/** - * @brief Writes the characteristic value using the characteristic's value handle. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of write. The write is successfully performed, if the event's status field is set to 0. - */ -uint8_t gatt_client_write_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -uint8_t gatt_client_write_long_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -uint8_t gatt_client_write_long_value_of_characteristic_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset, uint16_t length, uint8_t * data); - -/** - * @brief Writes of the long characteristic value using the characteristic's value handle. It uses server response to validate that the write was correctly received. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE marks the end of write. The write is successfully performed, if the event's status field is set to 0. - */ -uint8_t gatt_client_reliable_write_long_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); - -/** - * @brief Reads the characteristic descriptor using its handle. If the characteristic descriptor is found, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -uint8_t gatt_client_read_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); - -/** - * @brief Reads the long characteristic descriptor using its handle. It will be returned in several blobs. For each blob, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); -uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset); - -/** - * @brief Writes the characteristic descriptor using its handle. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of write. The write is successfully performed, if the event's status field is set to 0. - */ -uint8_t gatt_client_write_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset, uint16_t length, uint8_t * data); - -/** - * @brief Writes the client characteristic configuration of the specified characteristic. It is used to subscribe for notifications or indications of the characteristic value. For notifications or indications specify: GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION resp. GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION as configuration value. - */ -uint8_t gatt_client_write_client_characteristic_configuration(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t * characteristic, uint16_t configuration); - - -/** - * @brief -> gatt complete event - */ -uint8_t gatt_client_prepare_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint16_t length, uint8_t * data); - -/** - * @brief -> gatt complete event - */ -uint8_t gatt_client_execute_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle); - -/** - * @brief -> gatt complete event - */ -uint8_t gatt_client_cancel_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle); - -typedef struct gatt_client_notification { - btstack_linked_item_t item; - btstack_packet_handler_t callback; - uint16_t attribute_handle; -} gatt_client_notification_t; - -/** - * @brief MTU is available after the first query has completed. If status is equal to 0, it returns the real value, otherwise the default value of 23. - */ -uint8_t gatt_client_get_mtu(hci_con_handle_t con_handle, uint16_t * mtu); - -/** - * @brief Returns if the GATT client is ready to receive a query. It is used with daemon. - */ -int gatt_client_is_ready(hci_con_handle_t con_handle); - -/** - * @brief Register for notifications and indications of a characteristic enabled by gatt_client_write_client_characteristic_configuration - * @param notification struct used to store registration - * @param packet_handler - * @param con_handle - * @param characteristic - */ -void gatt_client_listen_for_characteristic_value_updates(gatt_client_notification_t * notification, btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle, uint16_t value_handle); - -/** - * @brief Register for general events - * @param handler - */ -void gatt_client_register_handler(btstack_packet_handler_t handler); - -// only used for testing -void gatt_client_pts_suppress_mtu_exchange(void); - -/** - * @brief Parse event GATT_EVENT_QUERY_COMPLETE - * @param event packet - * @return parsed result - */ -static __INLINE const gatt_event_query_complete_t * gatt_event_query_complete_parse(const uint8_t * event){ - return decode_event_offset(event, gatt_event_query_complete_t, 2); -} - -/** - * @brief Parse event GATT_EVENT_SERVICE_QUERY_RESULT - * @param event packet - * @return parsed result - */ -static __INLINE const gatt_event_service_query_result_t * gatt_event_service_query_result_parse(const uint8_t * event){ - return decode_event_offset(event, gatt_event_service_query_result_t, 2); -} - -/** - * @brief Parse event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT - * @param event packet - * @return handle - * @note: parsed result - */ -static __INLINE const gatt_event_characteristic_query_result_t * gatt_event_characteristic_query_result_parse(const uint8_t * event){ - return decode_event_offset(event, gatt_event_characteristic_query_result_t, 2); -} - -/** - * @brief Parse event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT - * @param event packet - * @return handle - * @note: parsed result - */ -static __INLINE const gatt_event_included_service_query_result_t * gatt_event_included_service_query_result_parse(const uint8_t * event){ - return decode_event_offset(event, gatt_event_included_service_query_result_t, 2); -} - -/** - * @brief Parse event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT - * @param event packet - * @return handle - * @note: parsed result - */ -static __INLINE const gatt_event_all_characteristic_descriptors_query_result_t * gatt_event_all_characteristic_descriptors_query_result_parse(const uint8_t * event){ - return decode_event_offset(event, gatt_event_all_characteristic_descriptors_query_result_t, 2); -} - -/** - * @brief Get value from event GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT - * @param[in] event packet - * @param[in] event_size - * @param[out] value_size - * @return gatt_event_value_packet_t * - */ -static __INLINE const gatt_event_long_value_packet_t * gatt_event_long_characteristic_value_query_result_parse(const uint8_t *event_packet, uint16_t event_size, uint16_t *value_size) -{ - *value_size = event_size - 1 - (uint16_t)sizeof(gatt_event_long_value_packet_t); - return decode_event_offset(event_packet, gatt_event_long_value_packet_t, 1); -} - -/** - * @brief Get value from event GATT_EVENT_NOTIFICATION - * @param[in] event packet - * @param[in] event_size - * @param[out] value_size - * @return gatt_event_value_packet_t * - */ -static __INLINE const gatt_event_value_packet_t * gatt_event_notification_parse(const uint8_t *event_packet, uint16_t event_size, uint16_t *value_size) -{ - *value_size = event_size - 1 - (uint16_t)sizeof(gatt_event_value_packet_t); - return decode_event_offset(event_packet, gatt_event_value_packet_t, 1); -} - -/** - * @brief Get value from event GATT_EVENT_INDICATION - * @param[in] event packet - * @param[in] event_size - * @param[out] value_size - * @return gatt_event_notification_t * - */ -static __INLINE const gatt_event_value_packet_t * gatt_event_indication_parse(const uint8_t *event_packet, uint16_t event_size, uint16_t *value_size) -{ - *value_size = event_size - 1 - (uint16_t)sizeof(gatt_event_value_packet_t); - return decode_event_offset(event_packet, gatt_event_value_packet_t, 1); -} - -/** - * @brief Get value from event GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT - * @param[in] event packet - * @param[in] event_size - * @param[out] value_size - * @return gatt_event_notification_t * - */ -static __INLINE const gatt_event_value_packet_t * gatt_event_characteristic_value_query_result_parse(const uint8_t *event_packet, uint16_t event_size, uint16_t *value_size) -{ - *value_size = event_size - 1 - (uint16_t)sizeof(gatt_event_value_packet_t); - return decode_event_offset(event_packet, gatt_event_value_packet_t, 1); -} - -/** - * @brief Get value from event GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT - * @param[in] event packet - * @param[in] event_size - * @param[out] value_size - * @return gatt_event_notification_t * - */ -static __INLINE const gatt_event_value_packet_t * gatt_event_characteristic_descriptor_query_result_parse(const uint8_t *event_packet, uint16_t event_size, uint16_t *value_size) -{ - *value_size = event_size - 1 - (uint16_t)sizeof(gatt_event_value_packet_t); - return decode_event_offset(event_packet, gatt_event_value_packet_t, 1); -} - -/** - * @brief Get value from event GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT - * @param[in] event packet - * @param[in] event_size - * @param[out] value_size - * @return gatt_event_value_packet_t * - */ -static __INLINE const gatt_event_long_value_packet_t * gatt_event_long_characteristic_descriptor_query_result_parse(const uint8_t *event_packet, uint16_t event_size, uint16_t *value_size) -{ - *value_size = event_size - 1 - (uint16_t)sizeof(gatt_event_long_value_packet_t); - return decode_event_offset(event_packet, gatt_event_long_value_packet_t, 1); -} - -/** - * @brief Get field handle from event GATT_EVENT_MTU - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_mtu_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field MTU from event GATT_EVENT_MTU - * @param event packet - * @return MTU - * @note: btstack_type 2 - */ -static __INLINE uint16_t gatt_event_mtu_get_mtu(const uint8_t * event){ - return little_endian_read_16(event, 4); -} - -/** - * @} -*/ -#ifdef __cplusplus -} -#endif - -#endif diff --git a/bundles/mesh/inc/gatt_external.h b/bundles/mesh/inc/gatt_external.h deleted file mode 100644 index dbb88382a..000000000 --- a/bundles/mesh/inc/gatt_external.h +++ /dev/null @@ -1,403 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// ---------------------------------------------------------------------------- -// Design Information -// ---------------------------------------------------------------------------- -// -// File : gatt_external.h -// -// Author : YiyunDeng -// -// Organisation : INGCHIPS -// -// Date : 2019-03-01 -// -// Revision : v0.1 -// -// Project : ING91800 -// -// Description : -// -// ---------------------------------------------------------------------------- -// Revision History -// ---------------------------------------------------------------------------- -// -// Date Author Revision Change Description -// ========== =============== ========= ======================================= -// 2019/03/01 Dengyiyun v0.1 Creat -// -// ---------------------------------------------------------------------------- - -#ifndef __GATT_EXTERNAL_H -#define __GATT_EXTERNAL_H - -#include -#include "bt_types.h" -#include "ble_uuid.h" -/* API_START */ - -typedef struct { - uint16_t handle; - uint16_t uuid16; - uint8_t uuid128[16]; -} gatt_client_characteristic_descriptor_t; - -// ATT Client Read Callback for Dynamic Data -// - if buffer == NULL, don't copy data, just return size of value -// - if buffer != NULL, copy data and return number bytes copied -// @param con_handle of hci le connection -// @param attribute_handle to be read -// @param offset defines start of attribute value -// @param buffer -// @param buffer_size -typedef uint16_t (*att_read_callback_t)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size); - -// ATT Client Write Callback for Dynamic Data -// @param con_handle of hci le connection -// @param attribute_handle to be written -// @param transaction - ATT_TRANSACTION_MODE_NONE for regular writes, ATT_TRANSACTION_MODE_ACTIVE for prepared writes and ATT_TRANSACTION_MODE_EXECUTE -// @param offset into the value - used for queued writes and long attributes -// @param buffer -// @param buffer_size -// @param signature used for signed write commmands -// @returns 0 if write was ok, ATT_ERROR_PREPARE_QUEUE_FULL if no space in queue, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer -typedef int (*att_write_callback_t)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size); - -/* API_START */ -/* - * @brief setup ATT server - * @param db attribute database created by compile-gatt.ph - * @param read_callback, see att_db.h, can be NULL - * @param write_callback, see attl.h, can be NULL - */ -// void att_server_init(uint8_t const * db, att_read_callback_t read_callback, att_write_callback_t write_callback); -typedef void (*f_att_server_init)(uint8_t const * db, att_read_callback_t read_callback, att_write_callback_t write_callback); -#define att_server_init ((f_att_server_init)(0x00007ef1)) - - -/* - * @brief register packet handler for ATT server events: - * - ATT_EVENT_MTU_EXCHANGE_COMPLETE - * - ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE - * @param handler - */ -// void att_server_register_packet_handler(btstack_packet_handler_t handler); -typedef void (*f_att_server_register_packet_handler)(btstack_packet_handler_t handler); -#define att_server_register_packet_handler ((f_att_server_register_packet_handler)(0x00008031)) - - -/* - * @brief tests if a notification or indication can be send right now - * @param con_handle - * @return 1, if packet can be sent - */ -// int att_server_can_send_packet_now(hci_con_handle_t con_handle); -typedef int (*f_att_server_can_send_packet_now)(hci_con_handle_t con_handle); -#define att_server_can_send_packet_now ((f_att_server_can_send_packet_now)(0x00007e11)) - - -/** - * @brief Request emission of ATT_EVENT_CAN_SEND_NOW as soon as possible - * @note ATT_EVENT_CAN_SEND_NOW might be emitted during call to this function - * so packet handler should be ready to handle it - * @param con_handle - */ -// void att_server_request_can_send_now_event(hci_con_handle_t con_handle); -typedef void (*f_att_server_request_can_send_now_event)(hci_con_handle_t con_handle); -#define att_server_request_can_send_now_event ((f_att_server_request_can_send_now_event)(0x0000803d)) - - -/* - * @brief notify client about attribute value change - * @param con_handle - * @param attribute_handle - * @param value - * @param value_len - * @return 0 if ok, error otherwise - */ -// int att_server_notify(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); -typedef int (*f_att_server_notify)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); -#define att_server_notify ((f_att_server_notify)(0x00007f41)) - - -/* - * @brief indicate value change to client. client is supposed to reply with an indication_response - * @param con_handle - * @param attribute_handle - * @param value - * @param value_len - * @return 0 if ok, error otherwise - */ -// int att_server_indicate(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); -typedef int (*f_att_server_indicate)(hci_con_handle_t con_handle, uint16_t attribute_handle, uint8_t *value, uint16_t value_len); -#define att_server_indicate ((f_att_server_indicate)(0x00007e79)) - - -/* - * @brief emit a general event to att handler - * @param event - * @param length - * @return void - */ -// void att_emit_general_event(uint8_t *event, uint16_t length); -typedef void (*f_att_emit_general_event)(uint8_t *event, uint16_t length); -#define att_emit_general_event ((f_att_emit_general_event)(0x000075b5)) - - -/** - * @brief Discovers all primary services. For each found service, an le_service_event_t with type set to GATT_EVENT_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t, with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -// uint8_t gatt_client_discover_primary_services(user_packet_handler_t callback, hci_con_handle_t con_handle); -typedef uint8_t (*f_gatt_client_discover_primary_services)(user_packet_handler_t callback, hci_con_handle_t con_handle); -#define gatt_client_discover_primary_services ((f_gatt_client_discover_primary_services)(0x000138f9)) - - -/** - * @brief Discovers a specific primary service given its UUID. This service may exist multiple times. For each found service, an le_service_event_t with type set to GATT_EVENT_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t, with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -// uint8_t gatt_client_discover_primary_services_by_uuid16(user_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t uuid16); -typedef uint8_t (*f_gatt_client_discover_primary_services_by_uuid16)(user_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t uuid16); -#define gatt_client_discover_primary_services_by_uuid16 ((f_gatt_client_discover_primary_services_by_uuid16)(0x0001396f)) - -// uint8_t gatt_client_discover_primary_services_by_uuid128(user_packet_handler_t callback, hci_con_handle_t con_handle, const uint8_t * uuid128); -typedef uint8_t (*f_gatt_client_discover_primary_services_by_uuid128)(user_packet_handler_t callback, hci_con_handle_t con_handle, const uint8_t * uuid128); -#define gatt_client_discover_primary_services_by_uuid128 ((f_gatt_client_discover_primary_services_by_uuid128)(0x0001392b)) - -// uint8_t gatt_client_discover_characteristics_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); -typedef uint8_t (*f_gatt_client_discover_characteristics_for_service)(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); -#define gatt_client_discover_characteristics_for_service ((f_gatt_client_discover_characteristics_for_service)(0x000138a5)) - - -/** - * @brief Finds included services within the specified service. For each found included service, an le_service_event_t with type set to GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. Information about included service type (primary/secondary) can be retrieved either by sending an ATT find information request for the returned start group handle (returning the handle and the UUID for primary or secondary service) or by comparing the service to the list of all primary services. - */ -// uint8_t gatt_client_find_included_services_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); -typedef uint8_t (*f_gatt_client_find_included_services_for_service)(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); -#define gatt_client_find_included_services_for_service ((f_gatt_client_find_included_services_for_service)(0x000139d1)) - - - -/** - * @brief The following four functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -// uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid16(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint16_t uuid16); -typedef uint8_t (*f_gatt_client_discover_characteristics_for_handle_range_by_uuid16)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint16_t uuid16); -#define gatt_client_discover_characteristics_for_handle_range_by_uuid16 ((f_gatt_client_discover_characteristics_for_handle_range_by_uuid16)(0x00013855)) - -// uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid128(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint8_t * uuid); -typedef uint8_t (*f_gatt_client_discover_characteristics_for_handle_range_by_uuid128)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint8_t * uuid); -#define gatt_client_discover_characteristics_for_handle_range_by_uuid128 ((f_gatt_client_discover_characteristics_for_handle_range_by_uuid128)(0x00013805)) - -// uint8_t gatt_client_discover_characteristics_for_service_by_uuid16 (btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service, uint16_t uuid16); -typedef uint8_t (*f_gatt_client_discover_characteristics_for_service_by_uuid16) (btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service, uint16_t uuid16); -#define gatt_client_discover_characteristics_for_service_by_uuid16 ((f_gatt_client_discover_characteristics_for_service_by_uuid16)(0x000138eb)) - -// uint8_t gatt_client_discover_characteristics_for_service_by_uuid128(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service, uint8_t * uuid128); -typedef uint8_t (*f_gatt_client_discover_characteristics_for_service_by_uuid128)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service, uint8_t * uuid128); -#define gatt_client_discover_characteristics_for_service_by_uuid128 ((f_gatt_client_discover_characteristics_for_service_by_uuid128)(0x000138dd)) - - -/** - * @brief Discovers attribute handle and UUID of a characteristic descriptor within the specified characteristic. For each found descriptor, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. - */ -// uint8_t gatt_client_discover_characteristic_descriptors(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); -typedef uint8_t (*f_gatt_client_discover_characteristic_descriptors)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); -#define gatt_client_discover_characteristic_descriptors ((f_gatt_client_discover_characteristic_descriptors)(0x000137c3)) - - -/** - * @brief Reads the characteristic value using the characteristic's value handle. If the characteristic value is found, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -// uint8_t gatt_client_read_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); -typedef uint8_t (*f_gatt_client_read_value_of_characteristic)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); -#define gatt_client_read_value_of_characteristic ((f_gatt_client_read_value_of_characteristic)(0x00013bfd)) - -// uint8_t gatt_client_read_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); -typedef uint8_t (*f_gatt_client_read_value_of_characteristic_using_value_handle)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); -#define gatt_client_read_value_of_characteristic_using_value_handle ((f_gatt_client_read_value_of_characteristic_using_value_handle)(0x00013c03)) - - -/** - * @brief Reads the characteric value of all characteristics with the uuid. For each found, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -// uint8_t gatt_client_read_value_of_characteristics_by_uuid16(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint16_t uuid16); -typedef uint8_t (*f_gatt_client_read_value_of_characteristics_by_uuid16)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint16_t uuid16); -#define gatt_client_read_value_of_characteristics_by_uuid16 ((f_gatt_client_read_value_of_characteristics_by_uuid16)(0x00013c7d)) - -// uint8_t gatt_client_read_value_of_characteristics_by_uuid128(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint8_t * uuid128); -typedef uint8_t (*f_gatt_client_read_value_of_characteristics_by_uuid128)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t start_handle, uint16_t end_handle, uint8_t * uuid128); -#define gatt_client_read_value_of_characteristics_by_uuid128 ((f_gatt_client_read_value_of_characteristics_by_uuid128)(0x00013c31)) - - -/** - * @brief Reads the long characteristic value using the characteristic's value handle. The value will be returned in several blobs. For each blob, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT and updated value offset will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, mark the end of read. - */ -// uint8_t gatt_client_read_long_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); -typedef uint8_t (*f_gatt_client_read_long_value_of_characteristic)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); -#define gatt_client_read_long_value_of_characteristic ((f_gatt_client_read_long_value_of_characteristic)(0x00013b91)) - -// uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); -typedef uint8_t (*f_gatt_client_read_long_value_of_characteristic_using_value_handle)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); -#define gatt_client_read_long_value_of_characteristic_using_value_handle ((f_gatt_client_read_long_value_of_characteristic_using_value_handle)(0x00013b99)) - -// uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset); -typedef uint8_t (*f_gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset); -#define gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset ((f_gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset)(0x00013b9f)) - - -/* - * @brief Read multiple characteristic values - * @param number handles - * @param list_of_handles list of handles - */ -// uint8_t gatt_client_read_multiple_characteristic_values(btstack_packet_handler_t callback, hci_con_handle_t con_handle, int num_value_handles, uint16_t * value_handles); -typedef uint8_t (*f_gatt_client_read_multiple_characteristic_values)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, int num_value_handles, uint16_t * value_handles); -#define gatt_client_read_multiple_characteristic_values ((f_gatt_client_read_multiple_characteristic_values)(0x00013bcd)) - - -/** - * @brief Writes the characteristic value using the characteristic's value handle without an acknowledgment that the write was successfully performed. - */ -// uint8_t gatt_client_write_value_of_characteristic_without_response(hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_value_of_characteristic_without_response)(hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -#define gatt_client_write_value_of_characteristic_without_response ((f_gatt_client_write_value_of_characteristic_without_response)(0x000143a9)) - - -/** - * @brief Writes the authenticated characteristic value using the characteristic's value handle without an acknowledgment that the write was successfully performed. - */ -// uint8_t gatt_client_signed_write_without_response(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t handle, uint16_t message_len, uint8_t * message); -typedef uint8_t (*f_gatt_client_signed_write_without_response)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t handle, uint16_t message_len, uint8_t * message); -#define gatt_client_signed_write_without_response ((f_gatt_client_signed_write_without_response)(0x00014145)) - - -/** - * @brief Writes the characteristic value using the characteristic's value handle. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of write. The write is successfully performed, if the event's status field is set to 0. - */ -// uint8_t gatt_client_write_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_value_of_characteristic)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -#define gatt_client_write_value_of_characteristic ((f_gatt_client_write_value_of_characteristic)(0x00014373)) - -// uint8_t gatt_client_write_long_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_long_value_of_characteristic)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -#define gatt_client_write_long_value_of_characteristic ((f_gatt_client_write_long_value_of_characteristic)(0x00014327)) - -// uint8_t gatt_client_write_long_value_of_characteristic_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_long_value_of_characteristic_with_offset)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset, uint16_t length, uint8_t * data); -#define gatt_client_write_long_value_of_characteristic_with_offset ((f_gatt_client_write_long_value_of_characteristic_with_offset)(0x00014337)) - - -/** - * @brief Writes of the long characteristic value using the characteristic's value handle. It uses server response to validate that the write was correctly received. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE marks the end of write. The write is successfully performed, if the event's status field is set to 0. - */ -// uint8_t gatt_client_reliable_write_long_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_reliable_write_long_value_of_characteristic)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t length, uint8_t * data); -#define gatt_client_reliable_write_long_value_of_characteristic ((f_gatt_client_reliable_write_long_value_of_characteristic)(0x00013cc7)) - - -/** - * @brief Reads the characteristic descriptor using its handle. If the characteristic descriptor is found, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -// uint8_t gatt_client_read_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); -typedef uint8_t (*f_gatt_client_read_characteristic_descriptor)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); -#define gatt_client_read_characteristic_descriptor ((f_gatt_client_read_characteristic_descriptor)(0x00013b25)) - -// uint8_t gatt_client_read_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); -typedef uint8_t (*f_gatt_client_read_characteristic_descriptor_using_descriptor_handle)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); -#define gatt_client_read_characteristic_descriptor_using_descriptor_handle ((f_gatt_client_read_characteristic_descriptor_using_descriptor_handle)(0x00013b2b)) - - -/** - * @brief Reads the long characteristic descriptor using its handle. It will be returned in several blobs. For each blob, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. - */ -// uint8_t gatt_client_read_long_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); -typedef uint8_t (*f_gatt_client_read_long_characteristic_descriptor)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); -#define gatt_client_read_long_characteristic_descriptor ((f_gatt_client_read_long_characteristic_descriptor)(0x00013b55)) - -// uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); -typedef uint8_t (*f_gatt_client_read_long_characteristic_descriptor_using_descriptor_handle)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); -#define gatt_client_read_long_characteristic_descriptor_using_descriptor_handle ((f_gatt_client_read_long_characteristic_descriptor_using_descriptor_handle)(0x00013b5d)) - -// uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset); -typedef uint8_t (*f_gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset); -#define gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset ((f_gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset)(0x00013b63)) - - -/** - * @brief Writes the characteristic descriptor using its handle. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of write. The write is successfully performed, if the event's status field is set to 0. - */ -// uint8_t gatt_client_write_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_characteristic_descriptor)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); -#define gatt_client_write_characteristic_descriptor ((f_gatt_client_write_characteristic_descriptor)(0x00014221)) - -// uint8_t gatt_client_write_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_characteristic_descriptor_using_descriptor_handle)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -#define gatt_client_write_characteristic_descriptor_using_descriptor_handle ((f_gatt_client_write_characteristic_descriptor_using_descriptor_handle)(0x0001422f)) - -// uint8_t gatt_client_write_long_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_long_characteristic_descriptor)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); -#define gatt_client_write_long_characteristic_descriptor ((f_gatt_client_write_long_characteristic_descriptor)(0x000142c9)) - -// uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_long_characteristic_descriptor_using_descriptor_handle)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -#define gatt_client_write_long_characteristic_descriptor_using_descriptor_handle ((f_gatt_client_write_long_characteristic_descriptor_using_descriptor_handle)(0x000142db)) - -// uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset, uint16_t length, uint8_t * data); -#define gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset ((f_gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset)(0x000142eb)) - - -/** - * @brief Writes the client characteristic configuration of the specified characteristic. It is used to subscribe for notifications or indications of the characteristic value. For notifications or indications specify: GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION resp. GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION as configuration value. - */ -// uint8_t gatt_client_write_client_characteristic_configuration(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t * characteristic, uint16_t configuration); -typedef uint8_t (*f_gatt_client_write_client_characteristic_configuration)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t * characteristic, uint16_t configuration); -#define gatt_client_write_client_characteristic_configuration ((f_gatt_client_write_client_characteristic_configuration)(0x00014269)) - - - -/** - * @brief -> gatt complete event - */ -// uint8_t gatt_client_prepare_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint16_t length, uint8_t * data); -typedef uint8_t (*f_gatt_client_prepare_write)(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t offset, uint16_t length, uint8_t * data); -#define gatt_client_prepare_write ((f_gatt_client_prepare_write)(0x00013add)) - - -/** - * @brief -> gatt complete event - */ -// uint8_t gatt_client_execute_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle); -typedef uint8_t (*f_gatt_client_execute_write)(btstack_packet_handler_t callback, hci_con_handle_t con_handle); -#define gatt_client_execute_write ((f_gatt_client_execute_write)(0x000139ab)) - - -/** - * @brief -> gatt complete event - */ -// uint8_t gatt_client_cancel_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle); -typedef uint8_t (*f_gatt_client_cancel_write)(btstack_packet_handler_t callback, hci_con_handle_t con_handle); -#define gatt_client_cancel_write ((f_gatt_client_cancel_write)(0x000136f9)) - - -// int ble_gatts_find_svc(const ble_uuid_t *uuid, uint16_t *out_handle); -typedef int (*f_ble_gatts_find_svc)(const ble_uuid_t *uuid, uint16_t *out_handle); -#define ble_gatts_find_svc ((f_ble_gatts_find_svc)(0x00008a41)) - -// int ble_gatts_find_chr(uint16_t srv_handle, const ble_uuid_t *uuid,uint16_t *out_att_chr); -typedef int (*f_ble_gatts_find_chr)(uint16_t srv_handle, const ble_uuid_t *uuid,uint16_t *out_att_chr); -#define ble_gatts_find_chr ((f_ble_gatts_find_chr)(0x00008999)) - -// uint16_t ble_att_mtu(uint16_t conn_handle); -typedef uint16_t (*f_ble_att_mtu)(uint16_t conn_handle); -#define ble_att_mtu ((f_ble_att_mtu)(0x0000888d)) - -#endif diff --git a/bundles/mesh/inc/glue.h b/bundles/mesh/inc/glue.h deleted file mode 100644 index c2469c340..000000000 --- a/bundles/mesh/inc/glue.h +++ /dev/null @@ -1,1028 +0,0 @@ -/* - * 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. - */ - -#ifndef _MESH_GLUE_ -#define _MESH_GLUE_ - -#include -#include "gap.h" -#include "errno.h" - -#include "syscfg.h" - -#include "nimble_npl.h" - -#include "os_mbuf.h" -#include "queue.h" - -#include "ble.h" -#include "ble_hs_log.h" -// #include "ble_uuid.h" - -//#include "ble_sm_priv.h" -//#include "ble_hs_hci_priv.h" - - -#define BLE_GAP_EVENT_CONNECT 0 -#define BLE_GAP_EVENT_DISCONNECT 1 -/* Reserved 2 */ -#define BLE_GAP_EVENT_CONN_UPDATE 3 -#define BLE_GAP_EVENT_CONN_UPDATE_REQ 4 -#define BLE_GAP_EVENT_L2CAP_UPDATE_REQ 5 -#define BLE_GAP_EVENT_TERM_FAILURE 6 -#define BLE_GAP_EVENT_DISC 7 -#define BLE_GAP_EVENT_DISC_COMPLETE 8 -#define BLE_GAP_EVENT_ADV_COMPLETE 9 -#define BLE_GAP_EVENT_ENC_CHANGE 10 -#define BLE_GAP_EVENT_PASSKEY_ACTION 11 -#define BLE_GAP_EVENT_NOTIFY_RX 12 -#define BLE_GAP_EVENT_NOTIFY_TX 13 -#define BLE_GAP_EVENT_SUBSCRIBE 14 -#define BLE_GAP_EVENT_MTU 15 -#define BLE_GAP_EVENT_IDENTITY_RESOLVED 16 -#define BLE_GAP_EVENT_REPEAT_PAIRING 17 -#define BLE_GAP_EVENT_PHY_UPDATE_COMPLETE 18 -#define BLE_GAP_EVENT_EXT_DISC 19 -#define BLE_GAP_EVENT_PROXY 20 -#define BLE_MESH_APP_EVENT 21 -#define BLE_MESH_BEACON_STATE 22 -#define STACK_INIT_DONE 0xfe -#define ADV_TERM_CON 0xfc -#define u8_t uint8_t -#define s8_t int8_t -#define u16_t uint16_t -#define s16_t int16_t -#define u32_t uint32_t -#define u64_t uint64_t -#define s64_t int64_t -#define s32_t int32_t - -typedef struct { - uint8_t type; - uint8_t val[6]; -} ble_addr_t2; - -typedef struct advertising_report { - uint8_t type; - uint8_t event_type; - uint8_t address_type; - bd_addr_t address; - int8_t rssi; - uint8_t length; - const uint8_t * data; -} advertising_report_t; - -typedef struct ext_advertising_report { - uint8_t type; - uint16_t event_type; - bd_addr_type_t address_type; - bd_addr_t address; - uint8_t primary_phy; - uint8_t sec_phy; - uint8_t adv_sid; - int8_t tx_pwr; - int8_t rssi; - uint16_t PRD_ADV_INTER; - bd_addr_type_t direct_addr_type; - bd_addr_t Direct_Address; - uint8_t length; - const uint8_t * data; -} ext_advertising_report_t; - -typedef struct prd_advertising_report { - uint8_t type; - uint16_t Sync_Handle; - int8_t tx_pwr; - int8_t rssi; - uint8_t unused; - uint8_t status; - uint8_t length; - const uint8_t * data; -} prd_advertising_report_t; - -struct ble_gap_ext_adv_params { - unsigned int connectable:1; - unsigned int scannable:1; - unsigned int directed:1; - unsigned int high_duty_directed:1; - unsigned int legacy_pdu:1; - unsigned int anonymous:1; - unsigned int include_tx_power:1; - unsigned int scan_req_notif:1; - - uint32_t itvl_min; - uint32_t itvl_max; - uint8_t channel_map; - uint8_t own_addr_type; - ble_addr_t2 peer; - uint8_t filter_policy; - uint8_t primary_phy; - uint8_t secondary_phy; - int8_t tx_power; - uint8_t sid; -}; - -struct ble_gap_ext_disc_params { - uint16_t itvl; - uint16_t window; - uint8_t passive:1; -}; - -struct ble_gap_ext_disc_desc { - /*** Common fields. */ - uint8_t props; - uint8_t data_status; - uint8_t legacy_event_type; - ble_addr_t2 addr; - int8_t rssi; - uint8_t tx_power; - uint8_t sid; - uint8_t prim_phy; - uint8_t sec_phy; - uint8_t length_data; - uint8_t *data; - /*** - * LE direct advertising report fields; direct_addr is BLE_ADDR_ANY if - * direct address fields are not present. - */ - bd_addr_t direct_addr; -}; - -typedef enum { - GAP_CONNECTION_INVALID, - GAP_CONNECTION_ACL, - GAP_CONNECTION_LE -} gap_connection_type_t; - -typedef struct le_event_struct_head { - uint8_t event_code; - uint8_t total_len; -}le_event_struct_head_t; - -struct le_event_advset_Terminate{ - le_event_struct_head_t head; - uint8_t sub_event_code; - uint8_t status; - uint8_t adv_handle; - uint16_t conn_handle; - uint8_t num_events; -}; - -struct ble_gap_disc_params { - uint16_t itvl; - uint16_t window; - uint8_t filter_policy; - uint8_t limited:1; - uint8_t passive:1; - uint8_t filter_duplicates:1; -}; - -struct ble_gap_sec_state { - /** If connection is encrypted */ - unsigned encrypted:1; - - /** If connection is authenticated */ - unsigned authenticated:1; - - /** If connection is bonded (security information is stored) */ - unsigned bonded:1; - - /** Size of a key used for encryption */ - unsigned key_size:5; -}; - -struct ble_gap_disc_desc { - /*** Common fields. */ - uint8_t event_type; - uint8_t length_data; - bd_addr_t addr; - int8_t rssi; - uint8_t *data; - - /*** - * LE direct advertising report fields; direct_addr is BLE_ADDR_ANY if - * direct address fields are not present. - */ - bd_addr_t direct_addr; -}; - -/** @brief Connection descriptor */ -struct ble_gap_conn_desc { - /** Connection security state */ - struct ble_gap_sec_state sec_state; - - /** Local identity address */ - bd_addr_t our_id_addr; - - /** Peer identity address */ - bd_addr_t peer_id_addr; - - /** Connection handle */ - uint16_t conn_handle; - - /** Connection interval */ - uint16_t conn_itvl; - - /** Connection latency */ - uint16_t conn_latency; - - /** Connection supervision timeout */ - uint16_t supervision_timeout; - - /** Connection Role - * Possible values BLE_GAP_ROLE_SLAVE or BLE_GAP_ROLE_MASTER - */ - uint8_t role; - - /** Master clock accuracy */ - uint8_t master_clock_accuracy; -}; - -struct ble_gap_event -{ - /** - * Indicates the type of GAP event that occurred. This is one of the - * BLE_GAP_EVENT codes. - */ - uint8_t type; - - /** - * A discriminated union containing additional details concerning the GAP - * event. The 'type' field indicates which member of the union is valid. - */ - union { - /** - * Represents a connection attempt. Valid for the following event - * types: - * o BLE_GAP_EVENT_CONNECT - */ - struct { - /** - * The status of the connection attempt; - * o 0: the connection was successfully established. - * o BLE host error code: the connection attempt failed for - * the specified reason. - */ - int status; - - /** The handle of the relevant connection. */ - uint16_t conn_handle; - - /** The handle in the server database*/ - uint16_t attr_handle; - - /*pointer to the data of the upper data*/ - uint8_t* data; - - /*lenth of data*/ - uint8_t length; - } connect; - - /** - * Represents a terminated connection. Valid for the following event - * types: - * o BLE_GAP_EVENT_DISCONNECT - */ - struct { - /** - * A BLE host return code indicating the reason for the - * disconnect. - */ - int reason; - - /** Information about the connection prior to termination. */ - struct ble_gap_conn_desc conn; - } disconnect; - - /** - * Represents an advertising report received during a discovery - * procedure. Valid for the following event types: - * o BLE_GAP_EVENT_DISC - */ - struct ble_gap_disc_desc disc; - - - /** - * Represents an extended advertising report received during a discovery - * procedure. Valid for the following event types: - * o BLE_GAP_EVENT_EXT_DISC - */ - struct ble_gap_ext_disc_desc ext_disc; - - /** - * Represents a completed discovery procedure. Valid for the following - * event types: - * o BLE_GAP_EVENT_DISC_COMPLETE - */ - struct { - /** - * The reason the discovery procedure stopped. Typical reason - * codes are: - * o 0: Duration expired. - * o BLE_HS_EPREEMPTED: Host aborted procedure to configure a - * peer's identity. - */ - int reason; - } disc_complete; - - /** - * Represents a completed advertise procedure. Valid for the following - * event types: - * o BLE_GAP_EVENT_ADV_COMPLETE - */ - struct { - /** - * The reason the advertise procedure stopped. Typical reason - * codes are: - * o 0: Terminated due to connection. - * o BLE_HS_ETIMEOUT: Duration expired. - * o BLE_HS_EPREEMPTED: Host aborted procedure to configure a - * peer's identity. - */ - int reason; - - } adv_complete; - - /** - * Represents a failed attempt to terminate an established connection. - * Valid for the following event types: - * o BLE_GAP_EVENT_TERM_FAILURE - */ - struct { - /** - * A BLE host return code indicating the reason for the failure. - */ - int status; - - /** The handle of the relevant connection. */ - uint16_t conn_handle; - } term_failure; - /** - * Represents a state change in a peer's subscription status. In this - * comment, the term "update" is used to refer to either a notification - * or an indication. This event is triggered by any of the following - * occurrences: - * o Peer enables or disables updates via a CCCD write. - * o Connection is about to be terminated and the peer is - * subscribed to updates. - * o Peer is now subscribed to updates after its state was restored - * from persistence. This happens when bonding is restored. - * - * Valid for the following event types: - * o BLE_GAP_EVENT_SUBSCRIBE - */ - struct { - /** The handle of the relevant connection. */ - uint16_t conn_handle; - - /** The value handle of the relevant characteristic. */ - uint16_t attr_handle; - - /** One of the BLE_GAP_SUBSCRIBE_REASON codes. */ - uint8_t reason; - - /** Whether the peer was previously subscribed to notifications. */ - uint8_t prev_notify:1; - - /** Whether the peer is currently subscribed to notifications. */ - uint8_t cur_notify:1; - - /** Whether the peer was previously subscribed to indications. */ - uint8_t prev_indicate:1; - - /** Whether the peer is currently subscribed to indications. */ - uint8_t cur_indicate:1; - } subscribe; - struct{ - uint8_t * data; - uint8_t length; - }mesh_app; - - struct{ - uint8_t enable; - }beacon_state; - - }; -}; -struct ble_gap_adv_params { - /** Advertising mode. Can be one of following constants: - * - BLE_GAP_CONN_MODE_NON (non-connectable; 3.C.9.3.2). - * - BLE_GAP_CONN_MODE_DIR (directed-connectable; 3.C.9.3.3). - * - BLE_GAP_CONN_MODE_UND (undirected-connectable; 3.C.9.3.4). - */ - uint8_t conn_mode; - /** Discoverable mode. Can be one of following constants: - * - BLE_GAP_DISC_MODE_NON (non-discoverable; 3.C.9.2.2). - * - BLE_GAP_DISC_MODE_LTD (limited-discoverable; 3.C.9.2.3). - * - BLE_GAP_DISC_MODE_GEN (general-discoverable; 3.C.9.2.4). - */ - uint8_t disc_mode; - - /** Minimum advertising interval, if 0 stack use sane defaults */ - uint16_t itvl_min; - /** Maximum advertising interval, if 0 stack use sane defaults */ - uint16_t itvl_max; - /** Advertising channel map , if 0 stack use sane defaults */ - uint8_t channel_map; - - /** Advertising Filter policy */ - uint8_t filter_policy; - - /** If do High Duty cycle for Directed Advertising */ - uint8_t high_duty_cycle:1; -}; - -typedef int ble_gap_event_fn(struct ble_gap_event *event, void *arg); -struct ble_gap_mesh_state { - ble_gap_event_fn *cb; - void *cb_arg; -}; - -extern struct ble_gap_mesh_state ble_gap_mesh; - -#if MYNEWT_VAL(BLE_EXT_ADV) -#define BT_MESH_ADV_INST (MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES)) - - -/* Note that BLE_MULTI_ADV_INSTANCES contains number of additional instances. - * Instance 0 is always there - */ -#if MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES) < 1 -#error "Mesh needs at least BLE_MULTI_ADV_INSTANCES set to 1" -#endif -#define BT_MESH_ADV_GATT_INST (MYNEWT_VAL(BLE_MULTI_ADV_INSTANCES) - 1) - -#endif /* BLE_EXT_ADV */ - -#define MESH_PROXY_ADV_HANDLE 0x07 - -#define PB_ADV_HANDLE 0x06 - - -extern uint8_t MESH_PROXY_RANDOM_ADDR[16]; -extern uint8_t PB_ADV_RANDOM_ADDR[16]; -/** @brief Helper to declare elements of bt_data arrays - * - * This macro is mainly for creating an array of struct bt_data - * elements which is then passed to bt_le_adv_start(). - * - * @param _type Type of advertising data field - * @param _data Pointer to the data field payload - * @param _data_len Number of bytes behind the _data pointer - */ -#define BT_DATA(_type, _data, _data_len) \ - { \ - .type = (_type), \ - .data_len = (_data_len), \ - .data = (const u8_t *)(_data), \ - } - -/** @brief Helper to declare elements of bt_data arrays - * - * This macro is mainly for creating an array of struct bt_data - * elements which is then passed to bt_le_adv_start(). - * - * @param _type Type of advertising data field - * @param _bytes Variable number of single-byte parameters - */ -#define BT_DATA_BYTES(_type, _bytes...) \ - BT_DATA(_type, ((u8_t []) { _bytes }), \ - sizeof((u8_t []) { _bytes })) - -/* EIR/AD data type definitions */ -#define BT_DATA_FLAGS 0x01 /* AD flags */ -#define BT_DATA_UUID16_SOME 0x02 /* 16-bit UUID, more available */ -#define BT_DATA_UUID16_ALL 0x03 /* 16-bit UUID, all listed */ -#define BT_DATA_UUID32_SOME 0x04 /* 32-bit UUID, more available */ -#define BT_DATA_UUID32_ALL 0x05 /* 32-bit UUID, all listed */ -#define BT_DATA_UUID128_SOME 0x06 /* 128-bit UUID, more available */ -#define BT_DATA_UUID128_ALL 0x07 /* 128-bit UUID, all listed */ -#define BT_DATA_NAME_SHORTENED 0x08 /* Shortened name */ -#define BT_DATA_NAME_COMPLETE 0x09 /* Complete name */ -#define BT_DATA_TX_POWER 0x0a /* Tx Power */ -#define BT_DATA_SOLICIT16 0x14 /* Solicit UUIDs, 16-bit */ -#define BT_DATA_SOLICIT128 0x15 /* Solicit UUIDs, 128-bit */ -#define BT_DATA_SVC_DATA16 0x16 /* Service data, 16-bit UUID */ -#define BT_DATA_GAP_APPEARANCE 0x19 /* GAP appearance */ -#define BT_DATA_SOLICIT32 0x1f /* Solicit UUIDs, 32-bit */ -#define BT_DATA_SVC_DATA32 0x20 /* Service data, 32-bit UUID */ -#define BT_DATA_SVC_DATA128 0x21 /* Service data, 128-bit UUID */ -#define BT_DATA_URI 0x24 /* URI */ -#define BT_DATA_MESH_PROV 0x29 /* Mesh Provisioning PDU */ -#define BT_DATA_MESH_MESSAGE 0x2a /* Mesh Networking PDU */ -#define BT_DATA_MESH_BEACON 0x2b /* Mesh Beacon */ - -#define BT_DATA_MANUFACTURER_DATA 0xff /* Manufacturer Specific Data */ - -#define BT_LE_AD_LIMITED 0x01 /* Limited Discoverable */ -#define BT_LE_AD_GENERAL 0x02 /* General Discoverable */ -#define BT_LE_AD_NO_BREDR 0x04 /* BR/EDR not supported */ - -#define sys_put_be16(a,b) put_be16(b, a) -#define sys_put_le16(a,b) put_le16(b, a) -#define sys_put_be32(a,b) put_be32(b, a) -#define sys_get_be16(a) get_be16(a) -#define sys_get_le16(a) get_le16(a) -#define sys_get_be32(a) get_be32(a) -#define sys_cpu_to_be16(a) htobe16(a) -#define sys_cpu_to_be32(a) htobe32(a) -#define sys_be32_to_cpu(a) be32toh(a) -#define sys_be16_to_cpu(a) be16toh(a) -#define sys_le16_to_cpu(a) le16toh(a) - -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -#define CODE_UNREACHABLE __builtin_unreachable() -#define __ASSERT(code, str) \ - do { \ - if (!(code)) BT_ERR(str); \ - assert(code); \ - } while (0); - -#define __ASSERT_NO_MSG(test) __ASSERT(test, "") - -/* Mesh is designed to not use mbuf chains */ -#if BT_DBG_ENABLED -#define ASSERT_NOT_CHAIN(om) assert(SLIST_NEXT(om, om_next) == NULL) -#else -#define ASSERT_NOT_CHAIN(om) (void)(om) -#endif - -#define __packed __attribute__((__packed__)) - -#define MSEC_PER_SEC (1000) -#define K_MSEC(ms) (ms) -#define K_SECONDS(s) K_MSEC((s) * MSEC_PER_SEC) -#define K_MINUTES(m) K_SECONDS((m) * 60) -#define K_HOURS(h) K_MINUTES((h) * 60) - -#ifndef BIT -#define BIT(n) (1UL << (n)) -#endif - -#define BIT_MASK(n) (BIT(n) - 1) - -#define BT_GAP_ADV_FAST_INT_MIN_1 0x0030 /* 30 ms */ -#define BT_GAP_ADV_FAST_INT_MAX_1 0x0060 /* 60 ms */ -#define BT_GAP_ADV_FAST_INT_MIN_2 0x00a0 /* 100 ms */ -#define BT_GAP_ADV_FAST_INT_MAX_2 0x00f0 /* 150 ms */ -#define BT_GAP_ADV_SLOW_INT_MIN 0x0640 /* 1 s */ -#define BT_GAP_ADV_SLOW_INT_MAX 0x0780 /* 1.2 s */ - -#define BT_DBG(fmt, ...) \ - if (BT_DBG_ENABLED) { \ - BLE_HS_LOG(DEBUG, "%s: " fmt "\n", __func__, ## __VA_ARGS__); \ - } -#define BT_INFO(fmt, ...) \ - if (BT_INFO_ENABLED) { \ - BLE_HS_LOG(INFO, "%s: " fmt "\n", __func__, ## __VA_ARGS__); \ - } -#define BT_WARN(fmt, ...) \ - if (BT_WARN_ENABLED) { \ - BLE_HS_LOG(WARN, "%s: " fmt "\n", __func__, ## __VA_ARGS__); \ - } -#define BT_ERR(fmt, ...) BLE_HS_LOG(ERROR, "%s: " fmt "\n", __func__, ## __VA_ARGS__); -#define BT_GATT_ERR(_att_err) (-(_att_err)) - -typedef ble_addr_t bt_addr_le_t; - -#define k_fifo_init(queue) ble_npl_eventq_init(queue) -#define net_buf_simple_tailroom(buf) OS_MBUF_TRAILINGSPACE(buf) -#define net_buf_tailroom(buf) net_buf_simple_tailroom(buf) -#define net_buf_headroom(buf) ((buf)->om_data - &(buf)->om_databuf[buf->om_pkthdr_len]) -#define net_buf_simple_headroom(buf) net_buf_headroom(buf) -#define net_buf_simple_tail(buf) ((buf)->om_data + (buf)->om_len) - -struct net_buf_simple_state { - /** Offset of the data pointer from the beginning of the storage */ - u16_t offset; - /** Length of data */ - u16_t len; -}; - -static inline struct os_mbuf * NET_BUF_SIMPLE(uint16_t size) -{ - struct os_mbuf *buf; - - buf = os_msys_get(size, 0); - assert(buf); - - return buf; -} - -#define K_NO_WAIT (0) -#define K_FOREVER (-1) - -/* This is by purpose */ -static inline void net_buf_simple_init(struct os_mbuf *buf, - size_t reserve_head) -{ - /* This is called in Zephyr after init. - * Note in Mynewt case we don't care abour reserved head*/ - buf->om_data = &buf->om_databuf[buf->om_pkthdr_len] + reserve_head; - buf->om_len = 0; -} - -void net_buf_put(struct ble_npl_eventq *fifo, struct os_mbuf *buf); -void * net_buf_ref(struct os_mbuf *om); -void net_buf_unref(struct os_mbuf *om); -uint16_t net_buf_simple_pull_le16(struct os_mbuf *om); -uint16_t net_buf_simple_pull_be16(struct os_mbuf *om); -uint32_t net_buf_simple_pull_be32(struct os_mbuf *om); -uint32_t net_buf_simple_pull_le32(struct os_mbuf *om); -uint8_t net_buf_simple_pull_u8(struct os_mbuf *om); -void net_buf_simple_add_le16(struct os_mbuf *om, uint16_t val); -void net_buf_simple_add_be16(struct os_mbuf *om, uint16_t val); -void net_buf_simple_add_u8(struct os_mbuf *om, uint8_t val); -void net_buf_simple_add_be32(struct os_mbuf *om, uint32_t val); -void net_buf_simple_add_le32(struct os_mbuf *om, uint32_t val); -void net_buf_add_zeros(struct os_mbuf *om, uint8_t len); -void net_buf_simple_push_le16(struct os_mbuf *om, uint16_t val); -void net_buf_simple_push_be16(struct os_mbuf *om, uint16_t val); -void net_buf_simple_push_u8(struct os_mbuf *om, uint8_t val); -void *net_buf_simple_pull(struct os_mbuf *om, uint8_t len); -void *net_buf_simple_add(struct os_mbuf *om, uint8_t len); -bool k_fifo_is_empty(struct ble_npl_eventq *q); -void *net_buf_get(struct ble_npl_eventq *fifo,s32_t t); -uint8_t *net_buf_simple_push(struct os_mbuf *om, uint8_t len); -void net_buf_reserve(struct os_mbuf *om, size_t reserve); - -#define net_buf_add_mem(a,b,c) os_mbuf_append(a,b,c) -#define net_buf_simple_add_mem(a,b,c) os_mbuf_append(a,b,c) -#define net_buf_add_u8(a,b) net_buf_simple_add_u8(a,b) -#define net_buf_add(a,b) net_buf_simple_add(a,b) - -#define net_buf_clone(a, b) os_mbuf_dup(a) -#define net_buf_add_be32(a, b) net_buf_simple_add_be32(a, b) -#define net_buf_add_be16(a, b) net_buf_simple_add_be16(a, b) - -#define BT_GATT_CCC_NOTIFY BLE_GATT_CHR_PROP_NOTIFY -#define bt_gatt_attr ble_gatt_attr - -/** Description of different data types that can be encoded into - * advertising data. Used to form arrays that are passed to the - * bt_le_adv_start() function. - */ -struct bt_data { - u8_t type; - u8_t data_len; - const u8_t *data; -}; - -struct bt_pub_key_cb { - /** @brief Callback type for Public Key generation. - * - * Used to notify of the local public key or that the local key is not - * available (either because of a failure to read it or because it is - * being regenerated). - * - * @param key The local public key, or NULL in case of no key. - */ - void (*func)(const u8_t key[64]); - - struct bt_pub_key_cb *_next; -}; - -typedef void (*bt_dh_key_cb_t)(const u8_t key[32]); -int bt_dh_key_gen(const u8_t remote_pk[64], bt_dh_key_cb_t cb); -int bt_pub_key_gen(struct bt_pub_key_cb *new_cb); -uint8_t *bt_pub_key_get(void); -int bt_rand(void *buf, size_t len); -const char * bt_hex(const void *buf, size_t len); -int bt_encrypt_be(const uint8_t *key, const uint8_t *plaintext, uint8_t *enc_data); -// void bt_mesh_register_gatt(void); -// WARNING: ^^^ this API is not available in this release - -int bt_le_adv_start(const struct ble_gap_adv_params *param, - const struct bt_data *ad, size_t ad_len, - const struct bt_data *sd, size_t sd_len); -int bt_le_adv_stop(bool proxy); - -struct k_delayed_work { - struct ble_npl_callout work; -}; - -void k_work_init(struct ble_npl_callout *work, ble_npl_event_fn handler); -void k_delayed_work_init(struct k_delayed_work *w, ble_npl_event_fn *f); -void k_delayed_work_cancel(struct k_delayed_work *w); -void k_delayed_work_submit(struct k_delayed_work *w, uint32_t ms); -int64_t k_uptime_get(void); -u32_t k_uptime_get_32(void); -void k_sleep(int32_t duration); -void k_work_submit(struct ble_npl_callout *w); -void k_work_add_arg(struct ble_npl_callout *w, void *arg); -void k_delayed_work_add_arg(struct k_delayed_work *w, void *arg); -uint32_t k_delayed_work_remaining_get(struct k_delayed_work *w); - -static inline void net_buf_simple_save(struct os_mbuf *buf, - struct net_buf_simple_state *state) -{ - state->offset = net_buf_simple_headroom(buf); - state->len = buf->om_len; -} - -static inline void net_buf_simple_restore(struct os_mbuf *buf, - struct net_buf_simple_state *state) -{ - buf->om_data = &buf->om_databuf[buf->om_pkthdr_len] + state->offset; - buf->om_len = state->len; -} - -static inline void sys_memcpy_swap(u8_t *dst, const u8_t *src, size_t length) -{ - __ASSERT(((src < dst && (src + length) <= dst) || - (src > dst && (dst + length) <= src)), - "Source and destination buffers must not overlap"); - - src += length - 1; - - for (; length > 0; length--) { - *((u8_t *)dst++) = *((u8_t *)src--); - } -} - -#define popcount(x) __builtin_popcount(x) - -static inline unsigned int find_lsb_set(u32_t op) -{ - return __builtin_ffs(op); -} - -static inline unsigned int find_msb_set(u32_t op) -{ - if (!op) - return 0; - - return 32 - __builtin_clz(op); -} - -extern uint32_t MYNEWT_VAL_BLE_MESH_GATT_PROXY; -#define CONFIG_BT_MESH_FRIEND BLE_MESH_FRIEND - -#define CONFIG_BT_MESH_IV_UPDATE_TEST BLE_MESH_IV_UPDATE_TEST -#define CONFIG_BT_MESH_LOW_POWER BLE_MESH_LOW_POWER -#define CONFIG_BT_MESH_LPN_AUTO BLE_MESH_LPN_AUTO -#define CONFIG_BT_MESH_LPN_ESTABLISHMENT BLE_MESH_LPN_ESTABLISHMENT -#define CONFIG_BT_MESH_PB_ADV BLE_MESH_PB_ADV -#define CONFIG_BT_MESH_PB_GATT BLE_MESH_PB_GATT -#define CONFIG_BT_MESH_PROV BLE_MESH_PROV -#define CONFIG_BT_TESTING BLE_MESH_TESTING -#define CONFIG_BT_SETTINGS BLE_MESH_SETTINGS -#define CONFIG_SETTINGS BLE_MESH_SETTINGS -#define BT_SETTINGS BLE_MESH_SETTINGS - -/* Above flags are used with IS_ENABLED macro */ -#define IS_ENABLED(config) MYNEWT_VAL(config) - -#define CONFIG_BT_MESH_LPN_GROUPS MYNEWT_VAL(BLE_MESH_LPN_GROUPS) -#define CONFIG_BT_MESH_ADV_BUF_COUNT MYNEWT_VAL(BLE_MESH_ADV_BUF_COUNT) -#define CONFIG_BT_MESH_FRIEND_QUEUE_SIZE MYNEWT_VAL(BLE_MESH_FRIEND_QUEUE_SIZE) -#define CONFIG_BT_MESH_FRIEND_RECV_WIN MYNEWT_VAL(BLE_MESH_FRIEND_RECV_WIN) -#define CONFIG_BT_MESH_LPN_POLL_TIMEOUT MYNEWT_VAL(BLE_MESH_LPN_POLL_TIMEOUT) -#define CONFIG_BT_MESH_MODEL_GROUP_COUNT MYNEWT_VAL(BLE_MESH_MODEL_GROUP_COUNT) -#define CONFIG_BT_MESH_MODEL_KEY_COUNT MYNEWT_VAL(BLE_MESH_MODEL_KEY_COUNT) -#define CONFIG_BT_MESH_NODE_ID_TIMEOUT MYNEWT_VAL(BLE_MESH_NODE_ID_TIMEOUT) -#define CONFIG_BT_MAX_CONN MYNEWT_VAL(BLE_MAX_CONNECTIONS) -#define CONFIG_BT_MESH_SEQ_STORE_RATE MYNEWT_VAL(BLE_MESH_SEQ_STORE_RATE) -#define CONFIG_BT_MESH_RPL_STORE_TIMEOUT MYNEWT_VAL(BLE_MESH_RPL_STORE_TIMEOUT) -#define CONFIG_BT_MESH_APP_KEY_COUNT MYNEWT_VAL(BLE_MESH_APP_KEY_COUNT) -#define CONFIG_BT_MESH_SUBNET_COUNT MYNEWT_VAL(BLE_MESH_SUBNET_COUNT) -#define CONFIG_BT_MESH_STORE_TIMEOUT MYNEWT_VAL(BLE_MESH_STORE_TIMEOUT) -#define CONFIG_BT_MESH_IVU_DIVIDER MYNEWT_VAL(BLE_MESH_IVU_DIVIDER) -#define CONFIG_BT_DEVICE_NAME MYNEWT_VAL(BLE_MESH_DEVICE_NAME) -#define CONFIG_BT_MESH_TX_SEG_MAX MYNEWT_VAL(BLE_MESH_TX_SEG_MAX) - -#define printk printf - -#define CONTAINER_OF(ptr, type, field) \ - ((type *)(((char *)(ptr)) - offsetof(type, field))) - - -#define k_sem ble_npl_sem - -static inline void k_sem_init(struct k_sem *sem, unsigned int initial_count, - unsigned int limit) -{ - ble_npl_sem_init(sem, initial_count); -} - -static inline int k_sem_take(struct k_sem *sem, s32_t timeout) -{ - uint32_t ticks; - - ble_npl_time_ms_to_ticks(timeout, &ticks); - return - ble_npl_sem_pend(sem, ticks); - -} - -static inline void k_sem_give(struct k_sem *sem) -{ - ble_npl_sem_release(sem); //not used the sem mechanism -} - -/* Helpers to access the storage array, since we don't have access to its - * type at this point anymore. - */ - -#define BUF_SIZE(pool) (pool->omp_pool->mp_block_size) - -static inline int net_buf_id(struct os_mbuf *buf) -{ - struct os_mbuf_pool *pool = buf->om_omp; - u8_t *pool_start = (u8_t *)pool->omp_pool->mp_membuf_addr; - u8_t *buf_ptr = (u8_t *)buf; - - return (buf_ptr - pool_start) / BUF_SIZE(pool); -} - -/* XXX: We should not use os_mbuf_pkthdr chains to represent a list of - * packets, this is a hack. For now this is not an issue, because mesh - * does not use os_mbuf chains. We should change this in the future. - */ -STAILQ_HEAD(net_buf_slist_t, os_mbuf_pkthdr); - -void net_buf_slist_init(struct net_buf_slist_t *list); -bool net_buf_slist_is_empty(struct net_buf_slist_t *list); -struct os_mbuf *net_buf_slist_peek_head(struct net_buf_slist_t *list); -struct os_mbuf *net_buf_slist_peek_next(struct os_mbuf *buf); -struct os_mbuf *net_buf_slist_get(struct net_buf_slist_t *list); -void net_buf_slist_put(struct net_buf_slist_t *list, struct os_mbuf *buf); -void net_buf_slist_remove(struct net_buf_slist_t *list, struct os_mbuf *prev, - struct os_mbuf *cur); -void net_buf_slist_merge_slist(struct net_buf_slist_t *list, - struct net_buf_slist_t *list_to_append); -#define NET_BUF_SLIST_FOR_EACH_NODE(head, var) STAILQ_FOREACH(var, head, omp_next) - -#if MYNEWT_VAL(BLE_MESH_SETTINGS) - -#define settings_load conf_load -int settings_bytes_from_str(char *val_str, void *vp, int *len); -char *settings_str_from_bytes(void *vp, int vp_len, char *buf, int buf_len); - -#define snprintk snprintf -#define BT_SETTINGS_SIZE(in_size) (in_size+1) -#define settings_save_one save_binary_value - -#else - -static inline int -settings_load(void) -{ - return 0; -} - -#endif /* MYNEWT_VAL(MYNEWT_VAL_BLE_MESH_SETTINGS) */ - -int PB_ADV_config(void); -int le_adv_status_reset(bool proxy); -#define BUILD_ASSERT(cond) \ //modified by dengyiyun - -typedef struct ble_gap_event mesh_gap_event; - -/*below for MESH->HOST message invoke*/ -#define USER_MSG_ID_CCM_REQ (0x0f) -#define SCAN_RSP_DATA_SET 0x21 -#define EXT_SCAN 0x22 -#define EXT_ADV 0x23 -#define WHITELST_SET 0x24 -#define ADV_PARAM_SET 0x25 -#define SCAN_PARAM_SET 0x26 -#define RAND_ADDR_SET 0x27 -#define ADV_DATA_SET 0x28 - -typedef struct ccm_data -{ - uint8_t type; // 0: encrypt 1: decrypt - uint8_t mic_size; - uint16_t msg_len; - uint16_t aad_len; - uint32_t tag; // same value will be reported in event - uint8_t *key; - uint8_t *nonce; - uint8_t *msg; - uint8_t *aad; - uint8_t *out_msg; -}ccm_data_t; - - -typedef struct ext_scan -{ - uint8_t enable; - uint8_t filter_dup; - uint16_t dur; - uint16_t peri; -}ext_scan_t; - -typedef struct scan_param -{ - uint8_t addr_type; - uint8_t pol; - uint8_t num; - scan_phy_config_t config[2]; -}scan_param_t; - -typedef struct scan_rsp_data -{ - uint8_t adv_handle; - uint8_t length; - uint8_t* data; -}scan_rsp_data_t; - -typedef struct adv_param -{ - uint8_t adv_handle; - uint8_t prop; - uint32_t inter_min; - uint32_t inter_max; - uint8_t map; - uint8_t addr_type; - uint8_t peer_addr_type; - bd_addr_t peer_addr; - uint8_t filter; - uint8_t tx_power; - uint8_t adv_phy; - uint8_t max_skip; - uint8_t sec_phy; - uint8_t sid; - uint8_t notify; -}adv_param_t; - -typedef struct rand_addr -{ - uint8_t adv_handle; - bd_addr_t addr; -}rand_addr_t; - - -typedef struct adv_en -{ - uint8_t en; - uint8_t setsnum; - ext_adv_set_en_t adv_set_conf; -}adv_en_t; - -typedef struct adv_data -{ - uint8_t adv_handle; - uint8_t len; - uint8_t * data; -}adv_data_t; - -typedef struct whitelst -{ - uint8_t type; - bd_addr_t whitaddr; -}whitelst_t; - -typedef struct app_request -{ - struct bt_mesh_model *model; - uint16_t app_idx; - uint16_t dst; - u32_t opcode; - uint8_t msg[20]; - uint8_t len; - uint8_t bear; -}app_request_t; - -typedef enum trace_info{ - ADV_LAYER = BIT(0), - NET_LAYER = BIT(1), - TRANS_LAYER = BIT(2), - ACC_LAYER = BIT(3), - BEA_FEA = BIT(4), - FRND_FEA = BIT(5), - LPN_FEA = BIT(6), - MESH_FEA = BIT(7), - CRYPTO_FEA = BIT(8), - PROV_FEA = BIT(9), - PROXY_FEA = BIT(10), - SET_FEA = BIT(11), - CFG_FEA = BIT(12), - HEALTH_FEA = BIT(13), -}trace_info_t; - -enum TRACE_CLA{ - DEBUG_CLA = BIT(0), - INFO_CLA = BIT(1), - WARN_CLA = BIT(2), -}; - -//below used to setup the uart data output function from APP -typedef void (*mesh_at_out)(const char* buf, int len); -#endif diff --git a/bundles/mesh/inc/health_cli.h b/bundles/mesh/inc/health_cli.h deleted file mode 100644 index 8b890422e..000000000 --- a/bundles/mesh/inc/health_cli.h +++ /dev/null @@ -1,72 +0,0 @@ -/** @file - * @brief Bluetooth Mesh Health Client Model APIs. - */ - -/* - * Copyright (c) 2017 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef __BT_MESH_HEALTH_CLI_H -#define __BT_MESH_HEALTH_CLI_H - -/** - * @brief Bluetooth Mesh - * @defgroup bt_mesh_health_cli Bluetooth Mesh Health Client Model - * @ingroup bt_mesh - * @{ - */ - -/** Mesh Health Client Model Context */ -struct bt_mesh_health_cli { - struct bt_mesh_model *model; - - void (*current_status)(struct bt_mesh_health_cli *cli, u16_t addr, - u8_t test_id, u16_t cid, u8_t *faults, - size_t fault_count); - - struct k_sem op_sync; - u32_t op_pending; - void *op_param; -}; - -extern const struct bt_mesh_model_op bt_mesh_health_cli_op[]; - -#define BT_MESH_MODEL_HEALTH_CLI(cli_data) \ - BT_MESH_MODEL(BT_MESH_MODEL_ID_HEALTH_CLI, \ - bt_mesh_health_cli_op, NULL, cli_data) - -int bt_mesh_health_cli_set(struct bt_mesh_model *model); - -int bt_mesh_health_fault_get(u16_t net_idx, u16_t addr, u16_t app_idx, - u16_t cid, u8_t *test_id, u8_t *faults, - size_t *fault_count); - -int bt_mesh_health_fault_clear(u16_t net_idx, u16_t addr, u16_t app_idx, - u16_t cid, u8_t *test_id, u8_t *faults, - size_t *fault_count); - -int bt_mesh_health_fault_test(u16_t net_idx, u16_t addr, u16_t app_idx, - u16_t cid, u8_t test_id, u8_t *faults, - size_t *fault_count); - -int bt_mesh_health_period_get(u16_t net_idx, u16_t addr, u16_t app_idx, - u8_t *divisor); - -int bt_mesh_health_period_set(u16_t net_idx, u16_t addr, u16_t app_idx, - u8_t divisor, u8_t *updated_divisor); - -int bt_mesh_health_attention_get(u16_t net_idx, u16_t addr, u16_t app_idx, - u8_t *attention); - -int bt_mesh_health_attention_set(u16_t net_idx, u16_t addr, u16_t app_idx, - u8_t attention, u8_t *updated_attention); - -s32_t bt_mesh_health_cli_timeout_get(void); -void bt_mesh_health_cli_timeout_set(s32_t timeout); - -/** - * @} - */ - -#endif /* __BT_MESH_HEALTH_CLI_H */ diff --git a/bundles/mesh/inc/health_srv.h b/bundles/mesh/inc/health_srv.h deleted file mode 100644 index 96f69e1e0..000000000 --- a/bundles/mesh/inc/health_srv.h +++ /dev/null @@ -1,91 +0,0 @@ -/** @file - * @brief Bluetooth Mesh Health Server Model APIs. - */ - -/* - * Copyright (c) 2017 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef __BT_MESH_HEALTH_SRV_H -#define __BT_MESH_HEALTH_SRV_H - -/** - * @brief Mesh Bluetooth Mesh Health Server Model - * @defgroup bt_mesh_health_srv - * @ingroup bt_mesh - * @{ - */ - -struct bt_mesh_health_srv_cb { - /* Fetch current faults */ - int (*fault_get_cur)(struct bt_mesh_model *model, u8_t *test_id, - u16_t *company_id, u8_t *faults, - u8_t *fault_count); - - /* Fetch registered faults */ - int (*fault_get_reg)(struct bt_mesh_model *model, u16_t company_id, - u8_t *test_id, u8_t *faults, - u8_t *fault_count); - - /* Clear registered faults */ - int (*fault_clear)(struct bt_mesh_model *model, u16_t company_id); - - /* Run a specific test */ - int (*fault_test)(struct bt_mesh_model *model, u8_t test_id, - u16_t company_id); - - /* Attention on */ - void (*attn_on)(struct bt_mesh_model *model); - - /* Attention off */ - void (*attn_off)(struct bt_mesh_model *model); -}; - -/** @def BT_MESH_HEALTH_FAULT_MSG - * - * A helper to define a health fault message. - * - * @param max_faults Maximum number of faults the element can have. - * - * @return a New net_buf_simple of the needed size. - */ -#define BT_MESH_HEALTH_FAULT_MSG(max_faults) \ - NET_BUF_SIMPLE(1 + 3 + (max_faults)) - -/** Mesh Health Server Model Context */ -struct bt_mesh_health_srv { - struct bt_mesh_model *model; - - /* Optional callback struct */ - const struct bt_mesh_health_srv_cb *cb; - - /* Attention Timer state */ - struct k_delayed_work attn_timer; -}; - -int bt_mesh_fault_update(struct bt_mesh_elem *elem); - -extern const struct bt_mesh_model_op bt_mesh_health_srv_op[]; - -/** @def BT_MESH_MODEL_HEALTH_SRV - * - * Define a new health server model. Note that this API needs to be - * repeated for each element that the application wants to have a - * health server model on. Each instance also needs a unique - * bt_mesh_health_srv and bt_mesh_model_pub context. - * - * @param srv Pointer to a unique struct bt_mesh_health_srv. - * @param pub Pointer to a unique struct bt_mesh_model_pub. - * - * @return New mesh model instance. - */ -#define BT_MESH_MODEL_HEALTH_SRV(srv, pub) \ - BT_MESH_MODEL(BT_MESH_MODEL_ID_HEALTH_SRV, \ - bt_mesh_health_srv_op, pub, srv) - -/** - * @} - */ - -#endif /* __BT_MESH_HEALTH_SRV_H */ diff --git a/bundles/mesh/inc/kv_storage.h b/bundles/mesh/inc/kv_storage.h deleted file mode 100644 index 83c62ed53..000000000 --- a/bundles/mesh/inc/kv_storage.h +++ /dev/null @@ -1,173 +0,0 @@ -/** @file * -* @brief helper function to cache data into flash * -* @version 1.0.0. * -* @date 2019/10/10 * -* * -* Copyright (c) 2019 IngChips corp. * -* * -* * - *************************************************************************************************************/ - -#ifndef _KV_STORAGE_H -#define _KV_STORAGE_H - -#include - -/** - * @brief Bluetooth - * @defgroup Bluetooth_NVM - * @ingroup bluetooth_stack - * @{ - */ -/** - * @brief A simple key-value storage - * - * A key is just an integer and its associated value is an array of bytes. - * - * When modified, a timer is (re-)started. When this timer timed out, whole db is committed to nvm. - */ - - -/** - * @brief key-collision between different modules should be strictly avoided. - * Here is a pre-defined range for keys: - */ -#define KV_HOST_KEY_START 1 -#define KV_HOST_KEY_END 50 -#define KV_MESH_KEY_START 51 -#define KV_MESH_KEY_END 200 -#define KV_USER_KEY_START 201 -#define KV_USER_KEY_END 255 - - -/** - * @brief The whole data. - */ -struct kv_db; -typedef struct kv_db kv_db_t; - -typedef uint8_t kvkey_t; - -#define KV_VALUE_MAX_LEN (253) - -/** - * @brief return value for callbacks - */ -#define KV_OK 0 -#define KV_ERR_OUT_OF_MEM 1 -#define KV_ERR_KEY_NOT_EXISTS 2 -#define KV_ERR_ABORT 3 - -/** - * @brief callback function to save whole db into non-volatile memory (such as flash) - * @param[in] db the whole db - * @param[in] size total bytes that need to be saved - */ -typedef int (*f_kv_write_to_nvm)(const void *db, const int size); - -/** - * @brief callback function restore whole db from non-volatile memory (such as flash) - * @param[out] db the whole db - * @param[in] max_size max_size of bytes can be restored into db - * @return KV_OK or error code - * - * Note: (sizeof(db->size) + db->size) bytes need to be read from nvm. - * If max_size is not big enough, KV_ERR_OUT_OF_MEM should be returned. - */ -typedef int (*f_kv_read_from_nvm)(void *db, const int max_size); - -/** - * @brief visitor function for each k-v pair - * @param[in] key current key - * @param[in] data data for current key - * @param[in] len data length for current key - * @param[in] user_data user data - * @return KV_OK to continue visit other k-v pair, else to abor visiting - */ -typedef int (*f_kv_visitor)(const kvkey_t key, const uint8_t *data, const int16_t len, void *user_data); - -/** - * @brief intialize k-v storage - * @param[in] f_write callback function for save whole db into non-volatile memory - * @param[in] f_read callback function restore whole db from non-volatile memory - */ -void kv_init(f_kv_write_to_nvm f_write, - f_kv_read_from_nvm f_read); - -/** - * @brief remove all k-v parirs - */ -void kv_remove_all(void); - -/** - * @brief remove a k-v pair - */ -void kv_remove(const kvkey_t key); - -/** - * @brief put a k-v pair into the db - * @param[in] key the key - * @param[in] data data for the key - * @param[in] len data length for the key - * - * Note: if key does not exist, k-v pair is created; if already exists, value is updated. - */ -int kv_put(const kvkey_t key, const uint8_t *data, int16_t len); - -/** - * @brief get the value associated with a key - * @param[in] key the key - * @param[out] len data length for the key (can be set to NULL) - * @return value for the key - * - * Note: if key does not exist, NULL is returned & len is set to 0. - */ -uint8_t *kv_get(const kvkey_t key, int16_t *len); - -/** - * @brief notify that value of a key (got from `kv_get`) has been modified. - * - * Note: whole db will be commited to nvm later. - */ -void kv_value_modified(void); - -/** - * @brief commited whole db to nvm immediately - */ -void kv_commit(void); - -/** - * @brief traverse each k-v pair - * @param[in] visitor visitor function - * @param[in] user_data user data passing to visitor - * - * Note: data should not be modified in visitor - */ -void kv_visit(f_kv_visitor visitor, void *user_data); - -/** - * @brief append more data to the end of an existing value - * @param[in] key the key - * @param[in] more_data data to be appended for the key - * @param[in] len data length to be appended for the key - * @return KV_OK if successful else error code - */ -// int kv_value_append(const kvkey_t key, const uint8_t *more_data, const int16_t len); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief truncate an existing value - * @param[in] key the key - * @param[in] new_len new length of data for the key - * @return KV_OK if successful else error code - */ -// int kv_value_trunc(const kvkey_t key, const int16_t new_len); -// WARNING: ^^^ this API is not available in this release - - -/* -* @} -*/ - -#endif diff --git a/bundles/mesh/inc/l2cap.h b/bundles/mesh/inc/l2cap.h deleted file mode 100644 index 311185471..000000000 --- a/bundles/mesh/inc/l2cap.h +++ /dev/null @@ -1,181 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -#ifndef __L2CAP_H -#define __L2CAP_H - -#include "bluetooth.h" -#include "bt_types.h" -#include "gap.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void l2cap_register_fixed_channel(btstack_packet_handler_t packet_handler, uint16_t channel_id); -int l2cap_can_send_fixed_channel_packet_now(hci_con_handle_t con_handle, uint16_t channel_id); -void l2cap_request_can_send_fix_channel_now_event(hci_con_handle_t con_handle, uint16_t channel_id); -int l2cap_send_connectionless(hci_con_handle_t con_handle, uint16_t cid, - const uint8_t *data1, uint16_t data1_len, - const uint8_t *data2, uint16_t data2_len); -int l2cap_send_connectionless3(hci_con_handle_t con_handle, uint16_t cid, - const uint8_t *data1, uint16_t data1_len, - const uint8_t *data2, uint16_t data2_len, - const uint8_t *data3, uint16_t data3_len); - -// int l2cap_le_send_flow_control_credit(hci_con_handle_t con_handle,uint8_t id ,uint16_t cid,uint16_t credits); -// WARNING: ^^^ this API is not available in this release - - -// PTS Testing -// int l2cap_send_echo_request(hci_con_handle_t con_handle, uint8_t *data, uint16_t len); -// WARNING: ^^^ this API is not available in this release - -// void l2cap_require_security_level_2_for_outgoing_sdp(void); -// WARNING: ^^^ this API is not available in this release - - -// Used by RFCOMM - similar to l2cap_can-send_packet_now but does not check if outgoing buffer is reserved -// int l2cap_can_send_prepared_packet_now(uint16_t local_cid); -// WARNING: ^^^ this API is not available in this release - - -/* API_START */ - -/** - * @brief Set up L2CAP and register L2CAP with HCI layer. - */ -void l2cap_init(void); - -/** - * @brief Registers packet handler for LE Connection Parameter Update events - */ -// void l2cap_register_packet_handler(btstack_packet_handler_t handler); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Get max MTU for Classic connections based on btstack configuration - */ -// uint16_t l2cap_max_mtu(void); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Get max MTU for LE connections based on btstack configuration - */ -uint16_t l2cap_max_le_mtu(void); - -/** - * @brief Creates L2CAP channel to the PSM of a remote device with baseband address. A new baseband connection will be initiated if necessary. - * @param packet_handler - * @param address - * @param psm - * @param mtu - * @param local_cid - * @param status - */ -// uint8_t l2cap_create_channel(btstack_packet_handler_t packet_handler, bd_addr_t address, uint16_t psm, uint16_t mtu, uint16_t * out_local_cid); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Disconnects L2CAP channel with given identifier. - */ -// void l2cap_disconnect(uint16_t local_cid, uint8_t reason); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Queries the maximal transfer unit (MTU) for L2CAP channel with given identifier. - */ -// uint16_t l2cap_get_remote_mtu_for_local_cid(uint16_t local_cid); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Sends L2CAP data packet to the channel with given identifier. - */ -// int l2cap_send(uint16_t local_cid, uint8_t *data, uint16_t len); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Registers L2CAP service with given PSM and MTU, and assigns a packet handler. - */ -// uint8_t l2cap_register_service(btstack_packet_handler_t packet_handler, uint16_t psm, uint16_t mtu, gap_security_level_t security_level); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Unregisters L2CAP service with given PSM. On embedded systems, use NULL for connection parameter. - */ -// void l2cap_unregister_service(uint16_t psm); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Accepts incoming L2CAP connection. - */ -// void l2cap_accept_connection(uint16_t local_cid); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Deny incoming L2CAP connection. - */ -// void l2cap_decline_connection(uint16_t local_cid, uint8_t reason); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Check if outgoing buffer is available and that there's space on the Bluetooth module - */ -// int l2cap_can_send_packet_now(uint16_t local_cid); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Request emission of L2CAP_EVENT_CAN_SEND_NOW as soon as possible - * @note L2CAP_EVENT_CAN_SEND_NOW might be emitted during call to this function - * so packet handler should be ready to handle it - * @param local_cid - */ -// void l2cap_request_can_send_now_event(uint16_t local_cid); -// WARNING: ^^^ this API is not available in this release - - - -#ifdef CONNECTION_PARAMETER_DYNAMICALLY_ADJUST -uint8_t l2cap_update_MTU_on_LL_link(l2cap_channel_t * channel); -#endif - -/* API_END */ - -#ifdef __cplusplus -} -#endif -/*to define the error result of the connection response*/ -#ifdef L2CAP_CREDIT_BASED_FLOW_CONTROL_MODE -#define L2CAP_CONNECTION_REFUSED_LEPSM_NOT_SUPPORTED 0x0002 -#define L2CAP_CONNECTION_REFUSED_RESERVED 0x0003 -#define L2CAP_CONNECTION_REFUSED_NO_RESOURCE_AVAILABLE 0x0004 -#define L2CAP_CONNECTION_REFUSED_INSUFFICIENT_AUTHEN 0x0005 -#define L2CAP_CONNECTION_REFUSED_INSUFFICIENT_AUTHOR 0x0006 -#define L2CAP_CONNECTION_REFUSED_INSUFFICIENT_ENCRYPT_KEY_SIZE 0x0007 -#define L2CAP_CONNECTION_REFUSED_INSUFFICIENT_ENCRYPT 0x0008 -#define L2CAP_CONNECTION_REFUSED_INVALID_SCID 0x0009 -#define L2CAP_CONNECTION_REFUSED_SCID_ALREADY_ALLOCATED 0x000A -#endif - -#endif // __L2CAP_H diff --git a/bundles/mesh/inc/l2cap_signaling.h b/bundles/mesh/inc/l2cap_signaling.h deleted file mode 100644 index ac7ba045e..000000000 --- a/bundles/mesh/inc/l2cap_signaling.h +++ /dev/null @@ -1,58 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -#ifndef __L2CAP_SIGNALING_H -#define __L2CAP_SIGNALING_H - -#include -#include -#include "bluetooth.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - COMMAND_REJECT = 1, - CONNECTION_REQUEST, - CONNECTION_RESPONSE, - CONFIGURE_REQUEST, - CONFIGURE_RESPONSE, - DISCONNECTION_REQUEST, - DISCONNECTION_RESPONSE, - ECHO_REQUEST, - ECHO_RESPONSE, - INFORMATION_REQUEST, - INFORMATION_RESPONSE, - /* 0x0c - 0x11 used for AMP */ - CONNECTION_PARAMETER_UPDATE_REQUEST = 0x12, - CONNECTION_PARAMETER_UPDATE_RESPONSE, - LE_CREDIT_BASED_CONNECTION_REQUEST, - LE_CREDIT_BASED_CONNECTION_RESPONSE, - LE_FLOW_CONTROL_CREDIT, - COMMAND_REJECT_LE = 0x1F // internal to BTstack -} L2CAP_SIGNALING_COMMANDS; - -uint8_t l2cap_send_signaling_le(hci_con_handle_t handle, L2CAP_SIGNALING_COMMANDS cmd, uint8_t identifier, va_list argptr); -// uint8_t l2cap_next_sig_id(void); -// WARNING: ^^^ this API is not available in this release - -// uint16_t l2cap_next_local_cid(void); -// WARNING: ^^^ this API is not available in this release - - -#ifdef __cplusplus -} -#endif - -#endif // __L2CAP_SIGNALING_H diff --git a/bundles/mesh/inc/log.h b/bundles/mesh/inc/log.h deleted file mode 100644 index 2d3c22e1c..000000000 --- a/bundles/mesh/inc/log.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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. - */ - -#ifndef __LOG_H__ -#define __LOG_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -static inline void -log_dummy(void *log, ...) -{ - (void)log; -} - -#define LOG_DEBUG(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__) -#define LOG_INFO(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__) -#define LOG_WARN(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__) -#define LOG_ERROR(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__) -#define LOG_CRITICAL(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__) - -#ifdef __cplusplus -} -#endif - -#endif /* __LOG_H__ */ diff --git a/bundles/mesh/inc/main.h b/bundles/mesh/inc/main.h deleted file mode 100644 index 9c835d473..000000000 --- a/bundles/mesh/inc/main.h +++ /dev/null @@ -1,375 +0,0 @@ -/** @file - * @brief Bluetooth Mesh Profile APIs. - */ - -/* - * Copyright (c) 2017 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef __BT_MESH_MAIN_H -#define __BT_MESH_MAIN_H - -/** - * @brief Bluetooth Mesh Provisioning - * @defgroup bt_mesh_prov Bluetooth Mesh Provisioning - * @ingroup bt_mesh - * @{ - */ - -typedef enum { - BT_MESH_NO_OUTPUT = 0, - BT_MESH_BLINK = BIT(0), - BT_MESH_BEEP = BIT(1), - BT_MESH_VIBRATE = BIT(2), - BT_MESH_DISPLAY_NUMBER = BIT(3), - BT_MESH_DISPLAY_STRING = BIT(4), -} bt_mesh_output_action_t; - -typedef enum { - BT_MESH_NO_INPUT = 0, - BT_MESH_PUSH = BIT(0), - BT_MESH_TWIST = BIT(1), - BT_MESH_ENTER_NUMBER = BIT(2), - BT_MESH_ENTER_STRING = BIT(3), -} bt_mesh_input_action_t; - -typedef enum { - BT_MESH_PROV_ADV = BIT(0), - BT_MESH_PROV_GATT = BIT(1), -} bt_mesh_prov_bearer_t; - -typedef enum { - BT_MESH_PROV_OOB_OTHER = BIT(0), - BT_MESH_PROV_OOB_URI = BIT(1), - BT_MESH_PROV_OOB_2D_CODE = BIT(2), - BT_MESH_PROV_OOB_BAR_CODE = BIT(3), - BT_MESH_PROV_OOB_NFC = BIT(4), - BT_MESH_PROV_OOB_NUMBER = BIT(5), - BT_MESH_PROV_OOB_STRING = BIT(6), - /* 7 - 10 are reserved */ - BT_MESH_PROV_OOB_ON_BOX = BIT(11), - BT_MESH_PROV_OOB_IN_BOX = BIT(12), - BT_MESH_PROV_OOB_ON_PAPER = BIT(13), - BT_MESH_PROV_OOB_IN_MANUAL = BIT(14), - BT_MESH_PROV_OOB_ON_DEV = BIT(15), -} bt_mesh_prov_oob_info_t; - -/** Provisioning properties & capabilities. */ -struct bt_mesh_prov { - /** The UUID that's used when advertising as unprovisioned */ - const u8_t *uuid; - - /** Optional URI. This will be advertised separately from the - * unprovisioned beacon, however the unprovisioned beacon will - * contain a hash of it so the two can be associated by the - * provisioner. - */ - const char *uri; - - /** Out of Band information field. */ - bt_mesh_prov_oob_info_t oob_info; - - /** Static OOB value */ - const u8_t *static_val; - /** Static OOB value length */ - u8_t static_val_len; - - /** Maximum size of Output OOB supported */ - u8_t output_size; - /** Supported Output OOB Actions */ - u16_t output_actions; - - /* Maximum size of Input OOB supported */ - u8_t input_size; - /** Supported Input OOB Actions */ - u16_t input_actions; - - /** @brief Output of a number is requested. - * - * This callback notifies the application that it should - * output the given number using the given action. - * - * @param act Action for outputting the number. - * @param num Number to be outputted. - * - * @return Zero on success or negative error code otherwise - */ - int (*output_number)(bt_mesh_output_action_t act, u32_t num); - - /** @brief Output of a string is requested. - * - * This callback notifies the application that it should - * display the given string to the user. - * - * @param str String to be displayed. - * - * @return Zero on success or negative error code otherwise - */ - int (*output_string)(const char *str); - - /** @brief Input is requested. - * - * This callback notifies the application that it should - * request input from the user using the given action. The - * requested input will either be a string or a number, and - * the application needs to consequently call the - * bt_mesh_input_string() or bt_mesh_input_number() functions - * once the data has been acquired from the user. - * - * @param act Action for inputting data. - * @param num Maximum size of the inputted data. - * - * @return Zero on success or negative error code otherwise - */ - int (*input)(bt_mesh_input_action_t act, u8_t size); - - /** @brief Provisioning link has been opened. - * - * This callback notifies the application that a provisioning - * link has been opened on the given provisioning bearer. - * - * @param bearer Provisioning bearer. - */ - void (*link_open)(bt_mesh_prov_bearer_t bearer); - - /** @brief Provisioning link has been closed. - * - * This callback notifies the application that a provisioning - * link has been closed on the given provisioning bearer. - * - * @param bearer Provisioning bearer. - */ - void (*link_close)(bt_mesh_prov_bearer_t bearer); - - /** @brief Provisioning is complete. - * - * This callback notifies the application that provisioning has - * been successfully completed, and that the local node has been - * assigned the specified NetKeyIndex and primary element address. - * - * @param net_idx NetKeyIndex given during provisioning. - * @param addr Primary element address. - */ - void (*complete)(u16_t net_idx, u16_t addr); - - /** @brief Node has been reset. - * - * This callback notifies the application that the local node - * has been reset and needs to be reprovisioned. The node will - * not automatically advertise as unprovisioned, rather the - * bt_mesh_prov_enable() API needs to be called to enable - * unprovisioned advertising on one or more provisioning bearers. - */ - void (*reset)(void); -}; - -/** @brief Provide provisioning input OOB string. - * - * This is intended to be called after the bt_mesh_prov input callback - * has been called with BT_MESH_ENTER_STRING as the action. - * - * @param str String. - * - * @return Zero on success or (negative) error code otherwise. - */ -int bt_mesh_input_string(const char *str); - -/** @brief Provide provisioning input OOB number. - * - * This is intended to be called after the bt_mesh_prov input callback - * has been called with BT_MESH_ENTER_NUMBER as the action. - * - * @param num Number. - * - * @return Zero on success or (negative) error code otherwise. - */ -int bt_mesh_input_number(u32_t num); - -/** @brief Enable specific provisioning bearers - * - * Enable one or more provisioning bearers. - * - * @param bearers Bit-wise or of provisioning bearers. - * - * @return Zero on success or (negative) error code otherwise. - */ -int bt_mesh_prov_enable(bt_mesh_prov_bearer_t bearers); - -/** @brief Disable specific provisioning bearers - * - * Disable one or more provisioning bearers. - * - * @param bearers Bit-wise or of provisioning bearers. - * - * @return Zero on success or (negative) error code otherwise. - */ -int bt_mesh_prov_disable(bt_mesh_prov_bearer_t bearers); - -/** - * @} - */ - -/** - * @brief Bluetooth Mesh - * @defgroup bt_mesh Bluetooth Mesh - * @ingroup bluetooth - * @{ - */ - -/* Primary Network Key index */ -#define BT_MESH_NET_PRIMARY 0x000 - -#define BT_MESH_RELAY_DISABLED 0x00 -#define BT_MESH_RELAY_ENABLED 0x01 -#define BT_MESH_RELAY_NOT_SUPPORTED 0x02 - -#define BT_MESH_BEACON_DISABLED 0x00 -#define BT_MESH_BEACON_ENABLED 0x01 - -#define BT_MESH_GATT_PROXY_DISABLED 0x00 -#define BT_MESH_GATT_PROXY_ENABLED 0x01 -#define BT_MESH_GATT_PROXY_NOT_SUPPORTED 0x02 - -#define BT_MESH_FRIEND_DISABLED 0x00 -#define BT_MESH_FRIEND_ENABLED 0x01 -#define BT_MESH_FRIEND_NOT_SUPPORTED 0x02 - -#define BT_MESH_NODE_IDENTITY_STOPPED 0x00 -#define BT_MESH_NODE_IDENTITY_RUNNING 0x01 -#define BT_MESH_NODE_IDENTITY_NOT_SUPPORTED 0x02 - -/* Features */ -#define BT_MESH_FEAT_RELAY BIT(0) -#define BT_MESH_FEAT_PROXY BIT(1) -#define BT_MESH_FEAT_FRIEND BIT(2) -#define BT_MESH_FEAT_LOW_POWER BIT(3) -#define BT_MESH_FEAT_SUPPORTED (BT_MESH_FEAT_RELAY | \ - BT_MESH_FEAT_PROXY | \ - BT_MESH_FEAT_FRIEND | \ - BT_MESH_FEAT_LOW_POWER) - -/** @brief Initialize Mesh support - * - * After calling this API, the node will not automatically advertise as - * unprovisioned, rather the bt_mesh_prov_enable() API needs to be called - * to enable unprovisioned advertising on one or more provisioning bearers. - * - * @param own_addr_type Node address type - * @param prov Node provisioning information. - * @param comp Node Composition. - * - * @return Zero on success or (negative) error code otherwise. - */ -int bt_mesh_init(u8_t own_addr_type, - const struct bt_mesh_prov *prov, - const struct bt_mesh_comp *comp); - -/** @brief Reset the state of the local Mesh node. - * - * Resets the state of the node, which means that it needs to be - * reprovisioned to become an active node in a Mesh network again. - * - * After calling this API, the node will not automatically advertise as - * unprovisioned, rather the bt_mesh_prov_enable() API needs to be called - * to enable unprovisioned advertising on one or more provisioning bearers. - * - */ -void bt_mesh_reset(void); - -/** @brief Provision the local Mesh Node. - * - * This API should normally not be used directly by the application. The - * only exception is for testing purposes where manual provisioning is - * desired without an actual external provisioner. - * - * @param net_key Network Key - * @param net_idx Network Key Index - * @param flags Provisioning Flags - * @param iv_index IV Index - * @param addr Primary element address - * @param dev_key Device Key - * - * @return Zero on success or (negative) error code otherwise. - */ -int bt_mesh_provision(const u8_t net_key[16], u16_t net_idx, - u8_t flags, u32_t iv_index, u16_t addr, - const u8_t dev_key[16]); - -/** @brief Check if the local node has been provisioned. - * - * This API can be used to check if the local node has been provisioned - * or not. It can e.g. be helpful to determine if there was a stored - * network in flash, i.e. if the network was restored after calling - * settings_load(). - * - * @return True if the node is provisioned. False otherwise. - */ -bool bt_mesh_is_provisioned(void); - -/** @brief Toggle the IV Update test mode - * - * This API is only available if the IV Update test mode has been enabled - * in Kconfig. It is needed for passing most of the IV Update qualification - * test cases. - * - * @param enable true to enable IV Update test mode, false to disable it. - */ -// void bt_mesh_iv_update_test(bool enable); -// WARNING: ^^^ this API is not available in this release - - -/** @brief Toggle the IV Update state - * - * This API is only available if the IV Update test mode has been enabled - * in Kconfig. It is needed for passing most of the IV Update qualification - * test cases. - * - * @return true if IV Update In Progress state was entered, false otherwise. - */ -// bool bt_mesh_iv_update(void); -// WARNING: ^^^ this API is not available in this release - - -/** @brief Toggle the Low Power feature of the local device - * - * Enables or disables the Low Power feature of the local device. This is - * exposed as a run-time feature, since the device might want to change - * this e.g. based on being plugged into a stable power source or running - * from a battery power source. - * - * @param enable true to enable LPN functionality, false to disable it. - * - * @return Zero on success or (negative) error code otherwise. - */ -// int bt_mesh_lpn_set(bool enable); -// WARNING: ^^^ this API is not available in this release - - -/** @brief Send out a Friend Poll message. - * - * Send a Friend Poll message to the Friend of this node. If there is no - * established Friendship the function will return an error. - * - * @return Zero on success or (negative) error code otherwise. - */ -// int bt_mesh_lpn_poll(void); -// WARNING: ^^^ this API is not available in this release - - -/** @brief Register a callback for Friendship changes. - * - * Registers a callback that will be called whenever Friendship gets - * established or is lost. - * - * @param cb Function to call when the Friendship status changes. - */ -// void bt_mesh_lpn_set_cb(void (*cb)(u16_t friend_addr, bool established)); -// WARNING: ^^^ this API is not available in this release - - -/** - * @} - */ - -#endif /* __BT_MESH_MAIN_H */ diff --git a/bundles/mesh/inc/mesh_api.h b/bundles/mesh/inc/mesh_api.h deleted file mode 100644 index 0c339f51a..000000000 --- a/bundles/mesh/inc/mesh_api.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _MESH_API_H -#define _MESH_API_H - -#include - -#include "glue.h" -#include "access.h" -#include "nimble_npl.h" -#include "nimble_npl_os.h" -#include "timers.h" -#include "btstack_event.h" -#define NODE_FEATURE_RELAY 1 -#define NODE_FEATURE_PROXY 2 -#define NODE_FEATURE_LP 4 -#define NODE_FEATURE_FRIEND 8 - -#define NODE_USE_BLE_5_ADV 0x80 - -/** @brief Set up mesh features, provision, and composition - * - * @param features (not implemented yet) - * @param a_prov provision configuration - * @param a_comp composition - */ -void mesh_setup(uint8_t features, const struct bt_mesh_prov *a_prov, - const struct bt_mesh_comp *a_comp); - -#define MESH_MODEL_OP_CLIENT 0 -#define MESH_MODEL_OP_SERVER 1 - -/** @brief set device name for PB_GATT - * - * @param name device name - */ -void mesh_set_dev_name(const char *name); - -typedef enum -{ - MESH_PLT_PB_ADV = 1, - MESH_PLT_PB_GATT = 2 -} mesh_platform_t; - -/** @brief platform config - * - * @param platform see mesh_platform_t - * @param addr random address for advertising - * @param param additional specific data for mesh provisioning vendors (Tianmao, etc) - */ -void mesh_platform_config(mesh_platform_t platform, uint8_t *addr, uint8_t *param); - -#endif diff --git a/bundles/mesh/inc/modlog.h b/bundles/mesh/inc/modlog.h deleted file mode 100644 index 90a61c131..000000000 --- a/bundles/mesh/inc/modlog.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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. - */ - -#ifndef H_MODLOG_ -#define H_MODLOG_ - -#include "log.h" - -#define MODLOG_MODULE_DFLT 255 - -static inline void -modlog_dummy(const char *msg, ...) -{ - printf(msg); -} - -#define MODLOG_DEBUG(ml_mod_, ml_msg_, ...) \ - modlog_dummy((ml_msg_), ##__VA_ARGS__) - -#define MODLOG_INFO(ml_mod_, ml_msg_, ...) \ - modlog_dummy((ml_msg_), ##__VA_ARGS__) - -#define MODLOG_WARN(ml_mod_, ml_msg_, ...) \ - modlog_dummy((ml_msg_), ##__VA_ARGS__) - -#define MODLOG_ERROR(ml_mod_, ml_msg_, ...) \ - modlog_dummy((ml_msg_), ##__VA_ARGS__) - -#define MODLOG_CRITICAL(ml_mod_, ml_msg_, ...) \ - modlog_dummy((ml_msg_), ##__VA_ARGS__) - -#define MODLOG(ml_lvl_, ml_mod_, ...) \ - MODLOG_ ## ml_lvl_((ml_mod_), __VA_ARGS__) - -#define MODLOG_DFLT(ml_lvl_, ...) \ - MODLOG(ml_lvl_, LOG_MODULE_DEFAULT, __VA_ARGS__) - -#endif diff --git a/bundles/mesh/inc/os/FreeRTOS.h b/bundles/mesh/inc/os/FreeRTOS.h deleted file mode 100644 index 8facdea82..000000000 --- a/bundles/mesh/inc/os/FreeRTOS.h +++ /dev/null @@ -1,1189 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef INC_FREERTOS_H -#define INC_FREERTOS_H - -/* - * Include the generic headers required for the FreeRTOS port being used. - */ -#include - -/* - * If stdint.h cannot be located then: - * + If using GCC ensure the -nostdint options is *not* being used. - * + Ensure the project's include path includes the directory in which your - * compiler stores stdint.h. - * + Set any compiler options necessary for it to support C99, as technically - * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any - * other way). - * + The FreeRTOS download includes a simple stdint.h definition that can be - * used in cases where none is provided by the compiler. The files only - * contains the typedefs required to build FreeRTOS. Read the instructions - * in FreeRTOS/source/stdint.readme for more information. - */ -#include /* READ COMMENT ABOVE. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Application specific configuration options. */ -#include "FreeRTOSConfig.h" - -/* Basic FreeRTOS definitions. */ -#include "projdefs.h" - -/* Definitions specific to the port being used. */ -#include "portable.h" - -/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ -#ifndef configUSE_NEWLIB_REENTRANT - #define configUSE_NEWLIB_REENTRANT 0 -#endif - -/* Required if struct _reent is used. */ -#if ( configUSE_NEWLIB_REENTRANT == 1 ) - #include -#endif -/* - * Check all the required application specific macros have been defined. - * These macros are application specific and (as downloaded) are defined - * within FreeRTOSConfig.h. - */ - -#ifndef configMINIMAL_STACK_SIZE - #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. -#endif - -#ifndef configMAX_PRIORITIES - #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#if configMAX_PRIORITIES < 1 - #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. -#endif - -#ifndef configUSE_PREEMPTION - #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_IDLE_HOOK - #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_TICK_HOOK - #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_16_BIT_TICKS - #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. -#endif - -#ifndef configUSE_CO_ROUTINES - #define configUSE_CO_ROUTINES 0 -#endif - -#ifndef INCLUDE_vTaskPrioritySet - #define INCLUDE_vTaskPrioritySet 0 -#endif - -#ifndef INCLUDE_uxTaskPriorityGet - #define INCLUDE_uxTaskPriorityGet 0 -#endif - -#ifndef INCLUDE_vTaskDelete - #define INCLUDE_vTaskDelete 0 -#endif - -#ifndef INCLUDE_vTaskSuspend - #define INCLUDE_vTaskSuspend 0 -#endif - -#ifndef INCLUDE_vTaskDelayUntil - #define INCLUDE_vTaskDelayUntil 0 -#endif - -#ifndef INCLUDE_vTaskDelay - #define INCLUDE_vTaskDelay 0 -#endif - -#ifndef INCLUDE_xTaskGetIdleTaskHandle - #define INCLUDE_xTaskGetIdleTaskHandle 0 -#endif - -#ifndef INCLUDE_xTaskAbortDelay - #define INCLUDE_xTaskAbortDelay 0 -#endif - -#ifndef INCLUDE_xQueueGetMutexHolder - #define INCLUDE_xQueueGetMutexHolder 0 -#endif - -#ifndef INCLUDE_xSemaphoreGetMutexHolder - #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder -#endif - -#ifndef INCLUDE_xTaskGetHandle - #define INCLUDE_xTaskGetHandle 0 -#endif - -#ifndef INCLUDE_uxTaskGetStackHighWaterMark - #define INCLUDE_uxTaskGetStackHighWaterMark 0 -#endif - -#ifndef INCLUDE_eTaskGetState - #define INCLUDE_eTaskGetState 0 -#endif - -#ifndef INCLUDE_xTaskResumeFromISR - #define INCLUDE_xTaskResumeFromISR 1 -#endif - -#ifndef INCLUDE_xTimerPendFunctionCall - #define INCLUDE_xTimerPendFunctionCall 0 -#endif - -#ifndef INCLUDE_xTaskGetSchedulerState - #define INCLUDE_xTaskGetSchedulerState 0 -#endif -//add by RAY -#ifndef INCLUDE_xTaskGetCurrentTaskHandle - #define INCLUDE_xTaskGetCurrentTaskHandle 1 -#endif - -#if configUSE_CO_ROUTINES != 0 - #ifndef configMAX_CO_ROUTINE_PRIORITIES - #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. - #endif -#endif - -#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK - #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 -#endif - -#ifndef configUSE_APPLICATION_TASK_TAG - #define configUSE_APPLICATION_TASK_TAG 0 -#endif - -#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS - #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 -#endif - -#ifndef configUSE_RECURSIVE_MUTEXES - #define configUSE_RECURSIVE_MUTEXES 1 -#endif - -#ifndef configUSE_MUTEXES - #define configUSE_MUTEXES 1 -#endif - -#ifndef configUSE_TIMERS - #define configUSE_TIMERS 1 -#endif - -#ifndef configUSE_COUNTING_SEMAPHORES - #define configUSE_COUNTING_SEMAPHORES 1 -#endif - -#ifndef configUSE_ALTERNATIVE_API - #define configUSE_ALTERNATIVE_API 0 -#endif - -#ifndef portCRITICAL_NESTING_IN_TCB - #define portCRITICAL_NESTING_IN_TCB 0 -#endif - -#ifndef configMAX_TASK_NAME_LEN - #define configMAX_TASK_NAME_LEN 16 -#endif - -#ifndef configIDLE_SHOULD_YIELD - #define configIDLE_SHOULD_YIELD 1 -#endif - -#if configMAX_TASK_NAME_LEN < 1 - #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h -#endif - -#ifndef configASSERT - #define configASSERT( x ) - #define configASSERT_DEFINED 0 -#else - #define configASSERT_DEFINED 1 -#endif - -/* The timers module relies on xTaskGetSchedulerState(). */ -#if configUSE_TIMERS == 1 - - #ifndef configTIMER_TASK_PRIORITY - //#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. - #define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) - #endif /* configTIMER_TASK_PRIORITY */ - - #ifndef configTIMER_QUEUE_LENGTH - //#error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. - #define configTIMER_QUEUE_LENGTH 10 - #endif /* configTIMER_QUEUE_LENGTH */ - - #ifndef configTIMER_TASK_STACK_DEPTH - //#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. - #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE - #endif /* configTIMER_TASK_STACK_DEPTH */ - -#endif /* configUSE_TIMERS */ - -#ifndef portSET_INTERRUPT_MASK_FROM_ISR - #define portSET_INTERRUPT_MASK_FROM_ISR() 0 -#endif - -#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR - #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue -#endif - -#ifndef portCLEAN_UP_TCB - #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB -#endif - -#ifndef portPRE_TASK_DELETE_HOOK - #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) -#endif - -#ifndef portSETUP_TCB - #define portSETUP_TCB( pxTCB ) ( void ) pxTCB -#endif - -#ifndef configQUEUE_REGISTRY_SIZE - #define configQUEUE_REGISTRY_SIZE 0U -#endif - -#if ( configQUEUE_REGISTRY_SIZE < 1 ) - #define vQueueAddToRegistry( xQueue, pcName ) - #define vQueueUnregisterQueue( xQueue ) - #define pcQueueGetName( xQueue ) -#endif - -#ifndef portPOINTER_SIZE_TYPE - #define portPOINTER_SIZE_TYPE uint32_t -#endif - -/* Remove any unused trace macros. */ -#ifndef traceSTART - /* Used to perform any necessary initialisation - for example, open a file - into which trace is to be written. */ - #define traceSTART() -#endif - -#ifndef traceEND - /* Use to close a trace, for example close a file into which trace has been - written. */ - #define traceEND() -#endif - -#ifndef traceTASK_SWITCHED_IN - /* Called after a task has been selected to run. pxCurrentTCB holds a pointer - to the task control block of the selected task. */ - #define traceTASK_SWITCHED_IN() -#endif - -#ifndef traceINCREASE_TICK_COUNT - /* Called before stepping the tick count after waking from tickless idle - sleep. */ - #define traceINCREASE_TICK_COUNT( x ) -#endif - -#ifndef traceLOW_POWER_IDLE_BEGIN - /* Called immediately before entering tickless idle. */ - #define traceLOW_POWER_IDLE_BEGIN() -#endif - -#ifndef traceLOW_POWER_IDLE_END - /* Called when returning to the Idle task after a tickless idle. */ - #define traceLOW_POWER_IDLE_END() -#endif - -#ifndef traceTASK_SWITCHED_OUT - /* Called before a task has been selected to run. pxCurrentTCB holds a pointer - to the task control block of the task being switched out. */ - #define traceTASK_SWITCHED_OUT() -#endif - -#ifndef traceTASK_PRIORITY_INHERIT - /* Called when a task attempts to take a mutex that is already held by a - lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task - that holds the mutex. uxInheritedPriority is the priority the mutex holder - will inherit (the priority of the task that is attempting to obtain the - muted. */ - #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) -#endif - -#ifndef traceTASK_PRIORITY_DISINHERIT - /* Called when a task releases a mutex, the holding of which had resulted in - the task inheriting the priority of a higher priority task. - pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the - mutex. uxOriginalPriority is the task's configured (base) priority. */ - #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) -#endif - -#ifndef traceBLOCKING_ON_QUEUE_RECEIVE - /* Task is about to block because it cannot read from a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the read was attempted. pxCurrentTCB points to the TCB of the - task that attempted the read. */ - #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) -#endif - -#ifndef traceBLOCKING_ON_QUEUE_PEEK - /* Task is about to block because it cannot read from a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the read was attempted. pxCurrentTCB points to the TCB of the - task that attempted the read. */ - #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) -#endif - -#ifndef traceBLOCKING_ON_QUEUE_SEND - /* Task is about to block because it cannot write to a - queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore - upon which the write was attempted. pxCurrentTCB points to the TCB of the - task that attempted the write. */ - #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) -#endif - -#ifndef configCHECK_FOR_STACK_OVERFLOW - #define configCHECK_FOR_STACK_OVERFLOW 0 -#endif - -#ifndef configRECORD_STACK_HIGH_ADDRESS - #define configRECORD_STACK_HIGH_ADDRESS 0 -#endif - -#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H - #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 -#endif - -/* The following event macros are embedded in the kernel API calls. */ - -#ifndef traceMOVED_TASK_TO_READY_STATE - #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) -#endif - -#ifndef tracePOST_MOVED_TASK_TO_READY_STATE - #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) -#endif - -#ifndef traceQUEUE_CREATE - #define traceQUEUE_CREATE( pxNewQueue ) -#endif - -#ifndef traceQUEUE_CREATE_FAILED - #define traceQUEUE_CREATE_FAILED( ucQueueType ) -#endif - -#ifndef traceCREATE_MUTEX - #define traceCREATE_MUTEX( pxNewQueue ) -#endif - -#ifndef traceCREATE_MUTEX_FAILED - #define traceCREATE_MUTEX_FAILED() -#endif - -#ifndef traceGIVE_MUTEX_RECURSIVE - #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) -#endif - -#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED - #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) -#endif - -#ifndef traceTAKE_MUTEX_RECURSIVE - #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) -#endif - -#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED - #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) -#endif - -#ifndef traceCREATE_COUNTING_SEMAPHORE - #define traceCREATE_COUNTING_SEMAPHORE() -#endif - -#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED - #define traceCREATE_COUNTING_SEMAPHORE_FAILED() -#endif - -#ifndef traceQUEUE_SEND - #define traceQUEUE_SEND( pxQueue ) -#endif - -#ifndef traceQUEUE_SEND_FAILED - #define traceQUEUE_SEND_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE - #define traceQUEUE_RECEIVE( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK - #define traceQUEUE_PEEK( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK_FAILED - #define traceQUEUE_PEEK_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK_FROM_ISR - #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE_FAILED - #define traceQUEUE_RECEIVE_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_SEND_FROM_ISR - #define traceQUEUE_SEND_FROM_ISR( pxQueue ) -#endif - -#ifndef traceQUEUE_SEND_FROM_ISR_FAILED - #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE_FROM_ISR - #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) -#endif - -#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED - #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED - #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) -#endif - -#ifndef traceQUEUE_DELETE - #define traceQUEUE_DELETE( pxQueue ) -#endif - -#ifndef traceTASK_CREATE - #define traceTASK_CREATE( pxNewTCB ) -#endif - -#ifndef traceTASK_CREATE_FAILED - #define traceTASK_CREATE_FAILED() -#endif - -#ifndef traceTASK_DELETE - #define traceTASK_DELETE( pxTaskToDelete ) -#endif - -#ifndef traceTASK_DELAY_UNTIL - #define traceTASK_DELAY_UNTIL( x ) -#endif - -#ifndef traceTASK_DELAY - #define traceTASK_DELAY() -#endif - -#ifndef traceTASK_PRIORITY_SET - #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) -#endif - -#ifndef traceTASK_SUSPEND - #define traceTASK_SUSPEND( pxTaskToSuspend ) -#endif - -#ifndef traceTASK_RESUME - #define traceTASK_RESUME( pxTaskToResume ) -#endif - -#ifndef traceTASK_RESUME_FROM_ISR - #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) -#endif - -#ifndef traceTASK_INCREMENT_TICK - #define traceTASK_INCREMENT_TICK( xTickCount ) -#endif - -#ifndef traceTIMER_CREATE - #define traceTIMER_CREATE( pxNewTimer ) -#endif - -#ifndef traceTIMER_CREATE_FAILED - #define traceTIMER_CREATE_FAILED() -#endif - -#ifndef traceTIMER_COMMAND_SEND - #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) -#endif - -#ifndef traceTIMER_EXPIRED - #define traceTIMER_EXPIRED( pxTimer ) -#endif - -#ifndef traceTIMER_COMMAND_RECEIVED - #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) -#endif - -#ifndef traceMALLOC - #define traceMALLOC( pvAddress, uiSize ) -#endif - -#ifndef traceFREE - #define traceFREE( pvAddress, uiSize ) -#endif - -#ifndef traceEVENT_GROUP_CREATE - #define traceEVENT_GROUP_CREATE( xEventGroup ) -#endif - -#ifndef traceEVENT_GROUP_CREATE_FAILED - #define traceEVENT_GROUP_CREATE_FAILED() -#endif - -#ifndef traceEVENT_GROUP_SYNC_BLOCK - #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) -#endif - -#ifndef traceEVENT_GROUP_SYNC_END - #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred -#endif - -#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK - #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) -#endif - -#ifndef traceEVENT_GROUP_WAIT_BITS_END - #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred -#endif - -#ifndef traceEVENT_GROUP_CLEAR_BITS - #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) -#endif - -#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR - #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) -#endif - -#ifndef traceEVENT_GROUP_SET_BITS - #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) -#endif - -#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR - #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) -#endif - -#ifndef traceEVENT_GROUP_DELETE - #define traceEVENT_GROUP_DELETE( xEventGroup ) -#endif - -#ifndef tracePEND_FUNC_CALL - #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) -#endif - -#ifndef tracePEND_FUNC_CALL_FROM_ISR - #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) -#endif - -#ifndef traceQUEUE_REGISTRY_ADD - #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) -#endif - -#ifndef traceTASK_NOTIFY_TAKE_BLOCK - #define traceTASK_NOTIFY_TAKE_BLOCK() -#endif - -#ifndef traceTASK_NOTIFY_TAKE - #define traceTASK_NOTIFY_TAKE() -#endif - -#ifndef traceTASK_NOTIFY_WAIT_BLOCK - #define traceTASK_NOTIFY_WAIT_BLOCK() -#endif - -#ifndef traceTASK_NOTIFY_WAIT - #define traceTASK_NOTIFY_WAIT() -#endif - -#ifndef traceTASK_NOTIFY - #define traceTASK_NOTIFY() -#endif - -#ifndef traceTASK_NOTIFY_FROM_ISR - #define traceTASK_NOTIFY_FROM_ISR() -#endif - -#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR - #define traceTASK_NOTIFY_GIVE_FROM_ISR() -#endif - -#ifndef traceSTREAM_BUFFER_CREATE_FAILED - #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED - #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_CREATE - #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_DELETE - #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_RESET - #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) -#endif - -#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND - #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_SEND - #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) -#endif - -#ifndef traceSTREAM_BUFFER_SEND_FAILED - #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR - #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) -#endif - -#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE - #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_RECEIVE - #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) -#endif - -#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED - #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) -#endif - -#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR - #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) -#endif - -#ifndef configGENERATE_RUN_TIME_STATS - #define configGENERATE_RUN_TIME_STATS 0 -#endif - -#if ( configGENERATE_RUN_TIME_STATS == 1 ) - - #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS - #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. - #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ - - #ifndef portGET_RUN_TIME_COUNTER_VALUE - #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE - #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. - #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ - #endif /* portGET_RUN_TIME_COUNTER_VALUE */ - -#endif /* configGENERATE_RUN_TIME_STATS */ - -#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS - #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() -#endif - -#ifndef configUSE_MALLOC_FAILED_HOOK - #define configUSE_MALLOC_FAILED_HOOK 0 -#endif - -#ifndef portPRIVILEGE_BIT - #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) -#endif - -#ifndef portYIELD_WITHIN_API - #define portYIELD_WITHIN_API portYIELD -#endif - -#ifndef portSUPPRESS_TICKS_AND_SLEEP - #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) -#endif - -#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP - #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 -#endif - -#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 - #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 -#endif - -#ifndef configUSE_TICKLESS_IDLE - #define configUSE_TICKLESS_IDLE 0 -#endif - -#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING - #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) -#endif - -#ifndef configPRE_SLEEP_PROCESSING - #define configPRE_SLEEP_PROCESSING( x ) -#endif - -#ifndef configPOST_SLEEP_PROCESSING - #define configPOST_SLEEP_PROCESSING( x ) -#endif - -#ifndef configUSE_QUEUE_SETS - #define configUSE_QUEUE_SETS 1 -#endif - -#ifndef portTASK_USES_FLOATING_POINT - #define portTASK_USES_FLOATING_POINT() -#endif - -#ifndef portTASK_CALLS_SECURE_FUNCTIONS - #define portTASK_CALLS_SECURE_FUNCTIONS() -#endif - -#ifndef configUSE_TIME_SLICING - #define configUSE_TIME_SLICING 1 -#endif - -#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS - #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 -#endif - -#ifndef configUSE_STATS_FORMATTING_FUNCTIONS - #define configUSE_STATS_FORMATTING_FUNCTIONS 0 -#endif - -#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID - #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() -#endif - -#ifndef configUSE_TRACE_FACILITY - #define configUSE_TRACE_FACILITY 0 -#endif - -#ifndef mtCOVERAGE_TEST_MARKER - #define mtCOVERAGE_TEST_MARKER() -#endif - -#ifndef mtCOVERAGE_TEST_DELAY - #define mtCOVERAGE_TEST_DELAY() -#endif - -#ifndef portASSERT_IF_IN_ISR - #define portASSERT_IF_IN_ISR() -#endif - -#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 -#endif - -#ifndef configAPPLICATION_ALLOCATED_HEAP - #define configAPPLICATION_ALLOCATED_HEAP 0 -#endif - -#ifndef configUSE_TASK_NOTIFICATIONS - #define configUSE_TASK_NOTIFICATIONS 1 -#endif - -#ifndef configUSE_POSIX_ERRNO - #define configUSE_POSIX_ERRNO 0 -#endif - -#ifndef portTICK_TYPE_IS_ATOMIC - #define portTICK_TYPE_IS_ATOMIC 0 -#endif - -#ifndef configSUPPORT_STATIC_ALLOCATION - /* Defaults to 0 for backward compatibility. */ - #define configSUPPORT_STATIC_ALLOCATION 0 -#endif - -#ifndef configSUPPORT_DYNAMIC_ALLOCATION - /* Defaults to 1 for backward compatibility. */ - #define configSUPPORT_DYNAMIC_ALLOCATION 1 -#endif - -#ifndef configSTACK_DEPTH_TYPE - /* Defaults to uint16_t for backward compatibility, but can be overridden - in FreeRTOSConfig.h if uint16_t is too restrictive. */ - #define configSTACK_DEPTH_TYPE uint16_t -#endif - -#ifndef configMESSAGE_BUFFER_LENGTH_TYPE - /* Defaults to size_t for backward compatibility, but can be overridden - in FreeRTOSConfig.h if lengths will always be less than the number of bytes - in a size_t. */ - #define configMESSAGE_BUFFER_LENGTH_TYPE size_t -#endif - -/* Sanity check the configuration. */ -#if( configUSE_TICKLESS_IDLE != 0 ) - #if( INCLUDE_vTaskSuspend != 1 ) - #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 - #endif /* INCLUDE_vTaskSuspend */ -#endif /* configUSE_TICKLESS_IDLE */ - -#if( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) - #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. -#endif - -#if( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) - #error configUSE_MUTEXES must be set to 1 to use recursive mutexes -#endif - -#ifndef configINITIAL_TICK_COUNT - #define configINITIAL_TICK_COUNT 0 -#endif - -#if( portTICK_TYPE_IS_ATOMIC == 0 ) - /* Either variables of tick type cannot be read atomically, or - portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when - the tick count is returned to the standard critical section macros. */ - #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() - #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() - #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() - #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) -#else - /* The tick type can be read atomically, so critical sections used when the - tick count is returned can be defined away. */ - #define portTICK_TYPE_ENTER_CRITICAL() - #define portTICK_TYPE_EXIT_CRITICAL() - #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 - #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x -#endif - -/* Definitions to allow backward compatibility with FreeRTOS versions prior to -V8 if desired. */ -#ifndef configENABLE_BACKWARD_COMPATIBILITY - #define configENABLE_BACKWARD_COMPATIBILITY 1 -#endif - -#ifndef configPRINTF - /* configPRINTF() was not defined, so define it away to nothing. To use - configPRINTF() then define it as follows (where MyPrintFunction() is - provided by the application writer): - - void MyPrintFunction(const char *pcFormat, ... ); - #define configPRINTF( X ) MyPrintFunction X - - Then call like a standard printf() function, but placing brackets around - all parameters so they are passed as a single parameter. For example: - configPRINTF( ("Value = %d", MyVariable) ); */ - #define configPRINTF( X ) -#endif - -#ifndef configMAX - /* The application writer has not provided their own MAX macro, so define - the following generic implementation. */ - #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) -#endif - -#ifndef configMIN - /* The application writer has not provided their own MAX macro, so define - the following generic implementation. */ - #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) -#endif - -#if configENABLE_BACKWARD_COMPATIBILITY == 1 - #define eTaskStateGet eTaskGetState - #define portTickType TickType_t - #define xTaskHandle TaskHandle_t - #define xQueueHandle QueueHandle_t - #define xSemaphoreHandle SemaphoreHandle_t - #define xQueueSetHandle QueueSetHandle_t - #define xQueueSetMemberHandle QueueSetMemberHandle_t - #define xTimeOutType TimeOut_t - #define xMemoryRegion MemoryRegion_t - #define xTaskParameters TaskParameters_t - #define xTaskStatusType TaskStatus_t - #define xTimerHandle TimerHandle_t - #define xCoRoutineHandle CoRoutineHandle_t - #define pdTASK_HOOK_CODE TaskHookFunction_t - #define portTICK_RATE_MS portTICK_PERIOD_MS - #define pcTaskGetTaskName pcTaskGetName - #define pcTimerGetTimerName pcTimerGetName - #define pcQueueGetQueueName pcQueueGetName - #define vTaskGetTaskInfo vTaskGetInfo - - /* Backward compatibility within the scheduler code only - these definitions - are not really required but are included for completeness. */ - #define tmrTIMER_CALLBACK TimerCallbackFunction_t - #define pdTASK_CODE TaskFunction_t - #define xListItem ListItem_t - #define xList List_t - - /* For libraries that break the list data hiding, and access list structure - members directly (which is not supposed to be done). */ - #define pxContainer pvContainer -#endif /* configENABLE_BACKWARD_COMPATIBILITY */ - -#if( configUSE_ALTERNATIVE_API != 0 ) - #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 -#endif - -/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even -if floating point hardware is otherwise supported by the FreeRTOS port in use. -This constant is not supported by all FreeRTOS ports that include floating -point support. */ -#ifndef configUSE_TASK_FPU_SUPPORT - #define configUSE_TASK_FPU_SUPPORT 1 -#endif - -/* - * In line with software engineering best practice, FreeRTOS implements a strict - * data hiding policy, so the real structures used by FreeRTOS to maintain the - * state of tasks, queues, semaphores, etc. are not accessible to the application - * code. However, if the application writer wants to statically allocate such - * an object then the size of the object needs to be know. Dummy structures - * that are guaranteed to have the same size and alignment requirements of the - * real objects are used for this purpose. The dummy list and list item - * structures below are used for inclusion in such a dummy structure. - */ -struct xSTATIC_LIST_ITEM -{ - TickType_t xDummy1; - void *pvDummy2[ 4 ]; -}; -typedef struct xSTATIC_LIST_ITEM StaticListItem_t; - -/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ -struct xSTATIC_MINI_LIST_ITEM -{ - TickType_t xDummy1; - void *pvDummy2[ 2 ]; -}; -typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; - -/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ -typedef struct xSTATIC_LIST -{ - UBaseType_t uxDummy1; - void *pvDummy2; - StaticMiniListItem_t xDummy3; -} StaticList_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the Task structure used internally by - * FreeRTOS is not accessible to application code. However, if the application - * writer wants to statically allocate the memory required to create a task then - * the size of the task object needs to be know. The StaticTask_t structure - * below is provided for this purpose. Its sizes and alignment requirements are - * guaranteed to match those of the genuine structure, no matter which - * architecture is being used, and no matter how the values in FreeRTOSConfig.h - * are set. Its contents are somewhat obfuscated in the hope users will - * recognise that it would be unwise to make direct use of the structure members. - */ -typedef struct xSTATIC_TCB -{ - void *pxDummy1; - #if ( portUSING_MPU_WRAPPERS == 1 ) - xMPU_SETTINGS xDummy2; - #endif - StaticListItem_t xDummy3[ 2 ]; - UBaseType_t uxDummy5; - void *pxDummy6; - uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; - #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) - void *pxDummy8; - #endif - #if ( portCRITICAL_NESTING_IN_TCB == 1 ) - UBaseType_t uxDummy9; - #endif - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy10[ 2 ]; - #endif - #if ( configUSE_MUTEXES == 1 ) - UBaseType_t uxDummy12[ 2 ]; - #endif - #if ( configUSE_APPLICATION_TASK_TAG == 1 ) - void *pxDummy14; - #endif - #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - void *pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; - #endif - #if ( configGENERATE_RUN_TIME_STATS == 1 ) - uint32_t ulDummy16; - #endif - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - struct _reent xDummy17; - #endif - #if ( configUSE_TASK_NOTIFICATIONS == 1 ) - uint32_t ulDummy18; - uint8_t ucDummy19; - #endif - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t uxDummy20; - #endif - - #if( INCLUDE_xTaskAbortDelay == 1 ) - uint8_t ucDummy21; - #endif - #if ( configUSE_POSIX_ERRNO == 1 ) - int iDummy22; - #endif -} StaticTask_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the Queue structure used internally by - * FreeRTOS is not accessible to application code. However, if the application - * writer wants to statically allocate the memory required to create a queue - * then the size of the queue object needs to be know. The StaticQueue_t - * structure below is provided for this purpose. Its sizes and alignment - * requirements are guaranteed to match those of the genuine structure, no - * matter which architecture is being used, and no matter how the values in - * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope - * users will recognise that it would be unwise to make direct use of the - * structure members. - */ -typedef struct xSTATIC_QUEUE -{ - void *pvDummy1[ 3 ]; - - union - { - void *pvDummy2; - UBaseType_t uxDummy2; - } u; - - StaticList_t xDummy3[ 2 ]; - UBaseType_t uxDummy4[ 3 ]; - uint8_t ucDummy5[ 2 ]; - - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucDummy6; - #endif - - #if ( configUSE_QUEUE_SETS == 1 ) - void *pvDummy7; - #endif - - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy8; - uint8_t ucDummy9; - #endif - -} StaticQueue_t; -typedef StaticQueue_t StaticSemaphore_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the event group structure used - * internally by FreeRTOS is not accessible to application code. However, if - * the application writer wants to statically allocate the memory required to - * create an event group then the size of the event group object needs to be - * know. The StaticEventGroup_t structure below is provided for this purpose. - * Its sizes and alignment requirements are guaranteed to match those of the - * genuine structure, no matter which architecture is being used, and no matter - * how the values in FreeRTOSConfig.h are set. Its contents are somewhat - * obfuscated in the hope users will recognise that it would be unwise to make - * direct use of the structure members. - */ -typedef struct xSTATIC_EVENT_GROUP -{ - TickType_t xDummy1; - StaticList_t xDummy2; - - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy3; - #endif - - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucDummy4; - #endif - -} StaticEventGroup_t; - -/* - * In line with software engineering best practice, especially when supplying a - * library that is likely to change in future versions, FreeRTOS implements a - * strict data hiding policy. This means the software timer structure used - * internally by FreeRTOS is not accessible to application code. However, if - * the application writer wants to statically allocate the memory required to - * create a software timer then the size of the queue object needs to be know. - * The StaticTimer_t structure below is provided for this purpose. Its sizes - * and alignment requirements are guaranteed to match those of the genuine - * structure, no matter which architecture is being used, and no matter how the - * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in - * the hope users will recognise that it would be unwise to make direct use of - * the structure members. - */ -typedef struct xSTATIC_TIMER -{ - void *pvDummy1; - StaticListItem_t xDummy2; - TickType_t xDummy3; - UBaseType_t uxDummy4; - void *pvDummy5; - TaskFunction_t pvDummy6; - #if( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy7; - #endif - - #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) - uint8_t ucDummy8; - #endif - -} StaticTimer_t; - -/* -* In line with software engineering best practice, especially when supplying a -* library that is likely to change in future versions, FreeRTOS implements a -* strict data hiding policy. This means the stream buffer structure used -* internally by FreeRTOS is not accessible to application code. However, if -* the application writer wants to statically allocate the memory required to -* create a stream buffer then the size of the stream buffer object needs to be -* know. The StaticStreamBuffer_t structure below is provided for this purpose. -* Its size and alignment requirements are guaranteed to match those of the -* genuine structure, no matter which architecture is being used, and no matter -* how the values in FreeRTOSConfig.h are set. Its contents are somewhat -* obfuscated in the hope users will recognise that it would be unwise to make -* direct use of the structure members. -*/ -typedef struct xSTATIC_STREAM_BUFFER -{ - size_t uxDummy1[ 4 ]; - void * pvDummy2[ 3 ]; - uint8_t ucDummy3; - #if ( configUSE_TRACE_FACILITY == 1 ) - UBaseType_t uxDummy4; - #endif -} StaticStreamBuffer_t; - -/* Message buffers are built on stream buffers. */ -typedef StaticStreamBuffer_t StaticMessageBuffer_t; - -#ifdef __cplusplus -} -#endif - -#endif /* INC_FREERTOS_H */ - diff --git a/bundles/mesh/inc/os/FreeRTOSConfig.h b/bundles/mesh/inc/os/FreeRTOSConfig.h deleted file mode 100644 index 90be50442..000000000 --- a/bundles/mesh/inc/os/FreeRTOSConfig.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd. - All rights reserved - - VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. - - This file is part of the FreeRTOS distribution. - - FreeRTOS is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License (version 2) as published by the - Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. - - *************************************************************************** - >>! NOTE: The modification to the GPL is included to allow you to !<< - >>! distribute a combined work that includes FreeRTOS without being !<< - >>! obliged to provide the source code for proprietary components !<< - >>! outside of the FreeRTOS kernel. !<< - *************************************************************************** - - FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. Full license text is available on the following - link: http://www.freertos.org/a00114.html - - *************************************************************************** - * * - * FreeRTOS provides completely free yet professionally developed, * - * robust, strictly quality controlled, supported, and cross * - * platform software that is more than just the market leader, it * - * is the industry's de facto standard. * - * * - * Help yourself get started quickly while simultaneously helping * - * to support the FreeRTOS project by purchasing a FreeRTOS * - * tutorial book, reference manual, or both: * - * http://www.FreeRTOS.org/Documentation * - * * - *************************************************************************** - - http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading - the FAQ page "My application does not run, what could be wrong?". Have you - defined configASSERT()? - - http://www.FreeRTOS.org/support - In return for receiving this top quality - embedded software for free we request you assist our global community by - participating in the support forum. - - http://www.FreeRTOS.org/training - Investing in training allows your team to - be as productive as possible as early as possible. Now you can receive - FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers - Ltd, and the world's leading authority on the world's leading RTOS. - - http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, - including FreeRTOS+Trace - an indispensable productivity tool, a DOS - compatible FAT file system, and our tiny thread aware UDP/IP stack. - - http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. - Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. - - http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High - Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS - licenses offer ticketed support, indemnification and commercial middleware. - - http://www.SafeRTOS.com - High Integrity Systems also provide a safety - engineered and independently SIL3 certified version for use in safety and - mission critical applications that require provable dependability. - - 1 tab == 4 spaces! -*/ - -#ifndef FREERTOS_CONFIG_H -#define FREERTOS_CONFIG_H - -#include "ingsoc.h" - - -/*----------------------------------------------------------- - * Application specific definitions. - * - * These definitions should be adjusted for your particular hardware and - * application requirements. - * - * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE - * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. - * - * See http://www.freertos.org/a00110.html. - *----------------------------------------------------------*/ - -#define configUSE_PREEMPTION 1 -#define configUSE_IDLE_HOOK 0 -#define configUSE_TICK_HOOK 0 -#ifdef POWER_SAVING -#define configUSE_TICKLESS_IDLE 1 -#endif -#ifdef TARGET_FPGA_V2 -#define configSYSTICK_CLOCK_HZ 32768 -#else -#define configSYSTICK_CLOCK_HZ 625000 -#endif -#define configCPU_CLOCK_HZ ( ( unsigned long ) 32000000 ) -#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) -#define configMAX_PRIORITIES ( 15 ) -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 15 * 1024 ) ) -#define configMAX_TASK_NAME_LEN ( 16 ) -#define configUSE_TRACE_FACILITY 0 -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 1 -#define configUSE_QUEUE_SETS 1 - -/* Co-routine definitions. */ -#define configUSE_CO_ROUTINES 0 -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) - -/* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */ - -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskCleanUpResources 0 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 - - -/* Cortex-M specific definitions. */ -#define configPRIO_BITS __NVIC_PRIO_BITS - - -/* The lowest interrupt priority that can be used in a call to a "set priority" -function. */ -#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1 << configPRIO_BITS) - 1) -/* The highest interrupt priority that can be used by any interrupt service -routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL -INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER -PRIORITY THAN THIS! (higher priorities are lower numeric values. */ -#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x01 -/* 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) ) -/* !!!! 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) ) - -/* Normal assert() semantics without relying on the provision of an assert.h -header file. */ -#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } - -/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS -standard names. */ -#define vPortSVCHandler SVC_Handler -#define xPortPendSVHandler PendSV_Handler -#define xPortSysTickHandler SysTick_Handler - -#ifdef POWER_SAVING - -#define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING(xExpectedIdleTime) \ - do { extern TickType_t sysPreSuppressTicksAndSleepProcessing(TickType_t expectedTicks); \ - xExpectedIdleTime = sysPreSuppressTicksAndSleepProcessing(xExpectedIdleTime); \ - } while (0) - -#define configPRE_SLEEP_PROCESSING(xModifiableIdleTime) \ - do { extern void sysPreSleepProcessing(TickType_t idleTime); \ - sysPreSleepProcessing(xModifiableIdleTime); \ - } while (0) - -#define configPOST_SLEEP_PROCESSING( xExpectedIdleTime ) \ - do { extern void sysPostSleepProcessing(TickType_t idleTime); \ - sysPostSleepProcessing(xModifiableIdleTime); \ - } while (0) -#else -#define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING(xExpectedIdleTime) \ - do { \ - xExpectedIdleTime = 0; \ - } while (0) -#endif - -#endif /* FREERTOS_CONFIG_H */ - diff --git a/bundles/mesh/inc/os/deprecated_definitions.h b/bundles/mesh/inc/os/deprecated_definitions.h deleted file mode 100644 index c74784736..000000000 --- a/bundles/mesh/inc/os/deprecated_definitions.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef DEPRECATED_DEFINITIONS_H -#define DEPRECATED_DEFINITIONS_H - - -/* Each FreeRTOS port has a unique portmacro.h header file. Originally a -pre-processor definition was used to ensure the pre-processor found the correct -portmacro.h file for the port being used. That scheme was deprecated in favour -of setting the compiler's include path such that it found the correct -portmacro.h file - removing the need for the constant and allowing the -portmacro.h file to be located anywhere in relation to the port being used. The -definitions below remain in the code for backward compatibility only. New -projects should not use them. */ - -#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT - #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT - #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef GCC_MEGA_AVR - #include "../portable/GCC/ATMega323/portmacro.h" -#endif - -#ifdef IAR_MEGA_AVR - #include "../portable/IAR/ATMega323/portmacro.h" -#endif - -#ifdef MPLAB_PIC24_PORT - #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" -#endif - -#ifdef MPLAB_DSPIC_PORT - #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" -#endif - -#ifdef MPLAB_PIC18F_PORT - #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" -#endif - -#ifdef MPLAB_PIC32MX_PORT - #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" -#endif - -#ifdef _FEDPICC - #include "libFreeRTOS/Include/portmacro.h" -#endif - -#ifdef SDCC_CYGNAL - #include "../../Source/portable/SDCC/Cygnal/portmacro.h" -#endif - -#ifdef GCC_ARM7 - #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" -#endif - -#ifdef GCC_ARM7_ECLIPSE - #include "portmacro.h" -#endif - -#ifdef ROWLEY_LPC23xx - #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" -#endif - -#ifdef IAR_MSP430 - #include "..\..\Source\portable\IAR\MSP430\portmacro.h" -#endif - -#ifdef GCC_MSP430 - #include "../../Source/portable/GCC/MSP430F449/portmacro.h" -#endif - -#ifdef ROWLEY_MSP430 - #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" -#endif - -#ifdef ARM7_LPC21xx_KEIL_RVDS - #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" -#endif - -#ifdef SAM7_GCC - #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" -#endif - -#ifdef SAM7_IAR - #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" -#endif - -#ifdef SAM9XE_IAR - #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" -#endif - -#ifdef LPC2000_IAR - #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" -#endif - -#ifdef STR71X_IAR - #include "..\..\Source\portable\IAR\STR71x\portmacro.h" -#endif - -#ifdef STR75X_IAR - #include "..\..\Source\portable\IAR\STR75x\portmacro.h" -#endif - -#ifdef STR75X_GCC - #include "..\..\Source\portable\GCC\STR75x\portmacro.h" -#endif - -#ifdef STR91X_IAR - #include "..\..\Source\portable\IAR\STR91x\portmacro.h" -#endif - -#ifdef GCC_H8S - #include "../../Source/portable/GCC/H8S2329/portmacro.h" -#endif - -#ifdef GCC_AT91FR40008 - #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" -#endif - -#ifdef RVDS_ARMCM3_LM3S102 - #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3_LM3S102 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef GCC_ARMCM3 - #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARM_CM3 - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef IAR_ARMCM3_LM - #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" -#endif - -#ifdef HCS12_CODE_WARRIOR - #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" -#endif - -#ifdef MICROBLAZE_GCC - #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" -#endif - -#ifdef TERN_EE - #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" -#endif - -#ifdef GCC_HCS12 - #include "../../Source/portable/GCC/HCS12/portmacro.h" -#endif - -#ifdef GCC_MCF5235 - #include "../../Source/portable/GCC/MCF5235/portmacro.h" -#endif - -#ifdef COLDFIRE_V2_GCC - #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" -#endif - -#ifdef COLDFIRE_V2_CODEWARRIOR - #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" -#endif - -#ifdef GCC_PPC405 - #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" -#endif - -#ifdef GCC_PPC440 - #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" -#endif - -#ifdef _16FX_SOFTUNE - #include "..\..\Source\portable\Softune\MB96340\portmacro.h" -#endif - -#ifdef BCC_INDUSTRIAL_PC_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef BCC_FLASH_LITE_186_PORT - /* A short file name has to be used in place of the normal - FreeRTOSConfig.h when using the Borland compiler. */ - #include "frconfig.h" - #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" - typedef void ( __interrupt __far *pxISR )(); -#endif - -#ifdef __GNUC__ - #ifdef __AVR32_AVR32A__ - #include "portmacro.h" - #endif -#endif - -#ifdef __ICCAVR32__ - #ifdef __CORE__ - #if __CORE__ == __AVR32A__ - #include "portmacro.h" - #endif - #endif -#endif - -#ifdef __91467D - #include "portmacro.h" -#endif - -#ifdef __96340 - #include "portmacro.h" -#endif - - -#ifdef __IAR_V850ES_Fx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx3__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx3_L__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Jx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_V850ES_Hx2__ - #include "../../Source/portable/IAR/V850ES/portmacro.h" -#endif - -#ifdef __IAR_78K0R_Kx3__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" -#endif - -#ifdef __IAR_78K0R_Kx3L__ - #include "../../Source/portable/IAR/78K0R/portmacro.h" -#endif - -#endif /* DEPRECATED_DEFINITIONS_H */ - diff --git a/bundles/mesh/inc/os/event_groups.h b/bundles/mesh/inc/os/event_groups.h deleted file mode 100644 index 990b95bf9..000000000 --- a/bundles/mesh/inc/os/event_groups.h +++ /dev/null @@ -1,777 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef EVENT_GROUPS_H -#define EVENT_GROUPS_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" -#endif - -/* FreeRTOS includes. */ -#include "timers.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * An event group is a collection of bits to which an application can assign a - * meaning. For example, an application may create an event group to convey - * the status of various CAN bus related events in which bit 0 might mean "A CAN - * message has been received and is ready for processing", bit 1 might mean "The - * application has queued a message that is ready for sending onto the CAN - * network", and bit 2 might mean "It is time to send a SYNC message onto the - * CAN network" etc. A task can then test the bit values to see which events - * are active, and optionally enter the Blocked state to wait for a specified - * bit or a group of specified bits to be active. To continue the CAN bus - * example, a CAN controlling task can enter the Blocked state (and therefore - * not consume any processing time) until either bit 0, bit 1 or bit 2 are - * active, at which time the bit that was actually active would inform the task - * which action it had to take (process a received message, send a message, or - * send a SYNC). - * - * The event groups implementation contains intelligence to avoid race - * conditions that would otherwise occur were an application to use a simple - * variable for the same purpose. This is particularly important with respect - * to when a bit within an event group is to be cleared, and when bits have to - * be set and then tested atomically - as is the case where event groups are - * used to create a synchronisation point between multiple tasks (a - * 'rendezvous'). - * - * \defgroup EventGroup - */ - - - -/** - * event_groups.h - * - * Type by which event groups are referenced. For example, a call to - * xEventGroupCreate() returns an EventGroupHandle_t variable that can then - * be used as a parameter to other event group functions. - * - * \defgroup EventGroupHandle_t EventGroupHandle_t - * \ingroup EventGroup - */ -struct EventGroupDef_t; -typedef struct EventGroupDef_t * EventGroupHandle_t; - -/* - * The type that holds event bits always matches TickType_t - therefore the - * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, - * 32 bits if set to 0. - * - * \defgroup EventBits_t EventBits_t - * \ingroup EventGroup - */ -typedef TickType_t EventBits_t; - -/** - * event_groups.h - *
    - EventGroupHandle_t xEventGroupCreate( void );
    - 
    - * - * Create a new event group. - * - * Internally, within the FreeRTOS implementation, event groups use a [small] - * block of memory, in which the event group's structure is stored. If an event - * groups is created using xEventGropuCreate() then the required memory is - * automatically dynamically allocated inside the xEventGroupCreate() function. - * (see http://www.freertos.org/a00111.html). If an event group is created - * using xEventGropuCreateStatic() then the application writer must instead - * provide the memory that will get used by the event group. - * xEventGroupCreateStatic() therefore allows an event group to be created - * without using any dynamic memory allocation. - * - * Although event groups are not related to ticks, for internal implementation - * reasons the number of bits available for use in an event group is dependent - * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If - * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit - * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has - * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store - * event bits within an event group. - * - * @return If the event group was created then a handle to the event group is - * returned. If there was insufficient FreeRTOS heap available to create the - * event group then NULL is returned. See http://www.freertos.org/a00111.html - * - * Example usage: -
    -	// Declare a variable to hold the created event group.
    -	EventGroupHandle_t xCreatedEventGroup;
    -
    -	// Attempt to create the event group.
    -	xCreatedEventGroup = xEventGroupCreate();
    -
    -	// Was the event group created successfully?
    -	if( xCreatedEventGroup == NULL )
    -	{
    -		// The event group was not created because there was insufficient
    -		// FreeRTOS heap available.
    -	}
    -	else
    -	{
    -		// The event group was created.
    -	}
    -   
    - * \defgroup xEventGroupCreate xEventGroupCreate - * \ingroup EventGroup - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) -// EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -#endif - -/** - * event_groups.h - *
    - EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
    - 
    - * - * Create a new event group. - * - * Internally, within the FreeRTOS implementation, event groups use a [small] - * block of memory, in which the event group's structure is stored. If an event - * groups is created using xEventGropuCreate() then the required memory is - * automatically dynamically allocated inside the xEventGroupCreate() function. - * (see http://www.freertos.org/a00111.html). If an event group is created - * using xEventGropuCreateStatic() then the application writer must instead - * provide the memory that will get used by the event group. - * xEventGroupCreateStatic() therefore allows an event group to be created - * without using any dynamic memory allocation. - * - * Although event groups are not related to ticks, for internal implementation - * reasons the number of bits available for use in an event group is dependent - * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If - * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit - * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has - * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store - * event bits within an event group. - * - * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type - * StaticEventGroup_t, which will be then be used to hold the event group's data - * structures, removing the need for the memory to be allocated dynamically. - * - * @return If the event group was created then a handle to the event group is - * returned. If pxEventGroupBuffer was NULL then NULL is returned. - * - * Example usage: -
    -	// StaticEventGroup_t is a publicly accessible structure that has the same
    -	// size and alignment requirements as the real event group structure.  It is
    -	// provided as a mechanism for applications to know the size of the event
    -	// group (which is dependent on the architecture and configuration file
    -	// settings) without breaking the strict data hiding policy by exposing the
    -	// real event group internals.  This StaticEventGroup_t variable is passed
    -	// into the xSemaphoreCreateEventGroupStatic() function and is used to store
    -	// the event group's data structures
    -	StaticEventGroup_t xEventGroupBuffer;
    -
    -	// Create the event group without dynamically allocating any memory.
    -	xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
    -   
    - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) -// EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -#endif - -/** - * event_groups.h - *
    -	EventBits_t xEventGroupWaitBits( 	EventGroupHandle_t xEventGroup,
    -										const EventBits_t uxBitsToWaitFor,
    -										const BaseType_t xClearOnExit,
    -										const BaseType_t xWaitForAllBits,
    -										const TickType_t xTicksToWait );
    - 
    - * - * [Potentially] block to wait for one or more bits to be set within a - * previously created event group. - * - * This function cannot be called from an interrupt. - * - * @param xEventGroup The event group in which the bits are being tested. The - * event group must have previously been created using a call to - * xEventGroupCreate(). - * - * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test - * inside the event group. For example, to wait for bit 0 and/or bit 2 set - * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set - * uxBitsToWaitFor to 0x07. Etc. - * - * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within - * uxBitsToWaitFor that are set within the event group will be cleared before - * xEventGroupWaitBits() returns if the wait condition was met (if the function - * returns for a reason other than a timeout). If xClearOnExit is set to - * pdFALSE then the bits set in the event group are not altered when the call to - * xEventGroupWaitBits() returns. - * - * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then - * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor - * are set or the specified block time expires. If xWaitForAllBits is set to - * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set - * in uxBitsToWaitFor is set or the specified block time expires. The block - * time is specified by the xTicksToWait parameter. - * - * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait - * for one/all (depending on the xWaitForAllBits value) of the bits specified by - * uxBitsToWaitFor to become set. - * - * @return The value of the event group at the time either the bits being waited - * for became set, or the block time expired. Test the return value to know - * which bits were set. If xEventGroupWaitBits() returned because its timeout - * expired then not all the bits being waited for will be set. If - * xEventGroupWaitBits() returned because the bits it was waiting for were set - * then the returned value is the event group value before any bits were - * automatically cleared in the case that xClearOnExit parameter was set to - * pdTRUE. - * - * Example usage: -
    -   #define BIT_0	( 1 << 0 )
    -   #define BIT_4	( 1 << 4 )
    -
    -   void aFunction( EventGroupHandle_t xEventGroup )
    -   {
    -   EventBits_t uxBits;
    -   const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
    -
    -		// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
    -		// the event group.  Clear the bits before exiting.
    -		uxBits = xEventGroupWaitBits(
    -					xEventGroup,	// The event group being tested.
    -					BIT_0 | BIT_4,	// The bits within the event group to wait for.
    -					pdTRUE,			// BIT_0 and BIT_4 should be cleared before returning.
    -					pdFALSE,		// Don't wait for both bits, either bit will do.
    -					xTicksToWait );	// Wait a maximum of 100ms for either bit to be set.
    -
    -		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    -		{
    -			// xEventGroupWaitBits() returned because both bits were set.
    -		}
    -		else if( ( uxBits & BIT_0 ) != 0 )
    -		{
    -			// xEventGroupWaitBits() returned because just BIT_0 was set.
    -		}
    -		else if( ( uxBits & BIT_4 ) != 0 )
    -		{
    -			// xEventGroupWaitBits() returned because just BIT_4 was set.
    -		}
    -		else
    -		{
    -			// xEventGroupWaitBits() returned because xTicksToWait ticks passed
    -			// without either BIT_0 or BIT_4 becoming set.
    -		}
    -   }
    -   
    - * \defgroup xEventGroupWaitBits xEventGroupWaitBits - * \ingroup EventGroup - */ -// EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * event_groups.h - *
    -	EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
    - 
    - * - * Clear bits within an event group. This function cannot be called from an - * interrupt. - * - * @param xEventGroup The event group in which the bits are to be cleared. - * - * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear - * in the event group. For example, to clear bit 3 only, set uxBitsToClear to - * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. - * - * @return The value of the event group before the specified bits were cleared. - * - * Example usage: -
    -   #define BIT_0	( 1 << 0 )
    -   #define BIT_4	( 1 << 4 )
    -
    -   void aFunction( EventGroupHandle_t xEventGroup )
    -   {
    -   EventBits_t uxBits;
    -
    -		// Clear bit 0 and bit 4 in xEventGroup.
    -		uxBits = xEventGroupClearBits(
    -								xEventGroup,	// The event group being updated.
    -								BIT_0 | BIT_4 );// The bits being cleared.
    -
    -		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    -		{
    -			// Both bit 0 and bit 4 were set before xEventGroupClearBits() was
    -			// called.  Both will now be clear (not set).
    -		}
    -		else if( ( uxBits & BIT_0 ) != 0 )
    -		{
    -			// Bit 0 was set before xEventGroupClearBits() was called.  It will
    -			// now be clear.
    -		}
    -		else if( ( uxBits & BIT_4 ) != 0 )
    -		{
    -			// Bit 4 was set before xEventGroupClearBits() was called.  It will
    -			// now be clear.
    -		}
    -		else
    -		{
    -			// Neither bit 0 nor bit 4 were set in the first place.
    -		}
    -   }
    -   
    - * \defgroup xEventGroupClearBits xEventGroupClearBits - * \ingroup EventGroup - */ -// EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * event_groups.h - *
    -	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    - 
    - * - * A version of xEventGroupClearBits() that can be called from an interrupt. - * - * Setting bits in an event group is not a deterministic operation because there - * are an unknown number of tasks that may be waiting for the bit or bits being - * set. FreeRTOS does not allow nondeterministic operations to be performed - * while interrupts are disabled, so protects event groups that are accessed - * from tasks by suspending the scheduler rather than disabling interrupts. As - * a result event groups cannot be accessed directly from an interrupt service - * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the - * timer task to have the clear operation performed in the context of the timer - * task. - * - * @param xEventGroup The event group in which the bits are to be cleared. - * - * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. - * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 - * and bit 0 set uxBitsToClear to 0x09. - * - * @return If the request to execute the function was posted successfully then - * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned - * if the timer service queue was full. - * - * Example usage: -
    -   #define BIT_0	( 1 << 0 )
    -   #define BIT_4	( 1 << 4 )
    -
    -   // An event group which it is assumed has already been created by a call to
    -   // xEventGroupCreate().
    -   EventGroupHandle_t xEventGroup;
    -
    -   void anInterruptHandler( void )
    -   {
    -		// Clear bit 0 and bit 4 in xEventGroup.
    -		xResult = xEventGroupClearBitsFromISR(
    -							xEventGroup,	 // The event group being updated.
    -							BIT_0 | BIT_4 ); // The bits being set.
    -
    -		if( xResult == pdPASS )
    -		{
    -			// The message was posted successfully.
    -		}
    -  }
    -   
    - * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR - * \ingroup EventGroup - */ -#if( configUSE_TRACE_FACILITY == 1 ) - BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; -#else - #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) -#endif - -/** - * event_groups.h - *
    -	EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    - 
    - * - * Set bits within an event group. - * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() - * is a version that can be called from an interrupt. - * - * Setting bits in an event group will automatically unblock tasks that are - * blocked waiting for the bits. - * - * @param xEventGroup The event group in which the bits are to be set. - * - * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. - * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 - * and bit 0 set uxBitsToSet to 0x09. - * - * @return The value of the event group at the time the call to - * xEventGroupSetBits() returns. There are two reasons why the returned value - * might have the bits specified by the uxBitsToSet parameter cleared. First, - * if setting a bit results in a task that was waiting for the bit leaving the - * blocked state then it is possible the bit will be cleared automatically - * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any - * unblocked (or otherwise Ready state) task that has a priority above that of - * the task that called xEventGroupSetBits() will execute and may change the - * event group value before the call to xEventGroupSetBits() returns. - * - * Example usage: -
    -   #define BIT_0	( 1 << 0 )
    -   #define BIT_4	( 1 << 4 )
    -
    -   void aFunction( EventGroupHandle_t xEventGroup )
    -   {
    -   EventBits_t uxBits;
    -
    -		// Set bit 0 and bit 4 in xEventGroup.
    -		uxBits = xEventGroupSetBits(
    -							xEventGroup,	// The event group being updated.
    -							BIT_0 | BIT_4 );// The bits being set.
    -
    -		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    -		{
    -			// Both bit 0 and bit 4 remained set when the function returned.
    -		}
    -		else if( ( uxBits & BIT_0 ) != 0 )
    -		{
    -			// Bit 0 remained set when the function returned, but bit 4 was
    -			// cleared.  It might be that bit 4 was cleared automatically as a
    -			// task that was waiting for bit 4 was removed from the Blocked
    -			// state.
    -		}
    -		else if( ( uxBits & BIT_4 ) != 0 )
    -		{
    -			// Bit 4 remained set when the function returned, but bit 0 was
    -			// cleared.  It might be that bit 0 was cleared automatically as a
    -			// task that was waiting for bit 0 was removed from the Blocked
    -			// state.
    -		}
    -		else
    -		{
    -			// Neither bit 0 nor bit 4 remained set.  It might be that a task
    -			// was waiting for both of the bits to be set, and the bits were
    -			// cleared as the task left the Blocked state.
    -		}
    -   }
    -   
    - * \defgroup xEventGroupSetBits xEventGroupSetBits - * \ingroup EventGroup - */ -// EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * event_groups.h - *
    -	BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
    - 
    - * - * A version of xEventGroupSetBits() that can be called from an interrupt. - * - * Setting bits in an event group is not a deterministic operation because there - * are an unknown number of tasks that may be waiting for the bit or bits being - * set. FreeRTOS does not allow nondeterministic operations to be performed in - * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() - * sends a message to the timer task to have the set operation performed in the - * context of the timer task - where a scheduler lock is used in place of a - * critical section. - * - * @param xEventGroup The event group in which the bits are to be set. - * - * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. - * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 - * and bit 0 set uxBitsToSet to 0x09. - * - * @param pxHigherPriorityTaskWoken As mentioned above, calling this function - * will result in a message being sent to the timer daemon task. If the - * priority of the timer daemon task is higher than the priority of the - * currently running task (the task the interrupt interrupted) then - * *pxHigherPriorityTaskWoken will be set to pdTRUE by - * xEventGroupSetBitsFromISR(), indicating that a context switch should be - * requested before the interrupt exits. For that reason - * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the - * example code below. - * - * @return If the request to execute the function was posted successfully then - * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned - * if the timer service queue was full. - * - * Example usage: -
    -   #define BIT_0	( 1 << 0 )
    -   #define BIT_4	( 1 << 4 )
    -
    -   // An event group which it is assumed has already been created by a call to
    -   // xEventGroupCreate().
    -   EventGroupHandle_t xEventGroup;
    -
    -   void anInterruptHandler( void )
    -   {
    -   BaseType_t xHigherPriorityTaskWoken, xResult;
    -
    -		// xHigherPriorityTaskWoken must be initialised to pdFALSE.
    -		xHigherPriorityTaskWoken = pdFALSE;
    -
    -		// Set bit 0 and bit 4 in xEventGroup.
    -		xResult = xEventGroupSetBitsFromISR(
    -							xEventGroup,	// The event group being updated.
    -							BIT_0 | BIT_4   // The bits being set.
    -							&xHigherPriorityTaskWoken );
    -
    -		// Was the message posted successfully?
    -		if( xResult == pdPASS )
    -		{
    -			// If xHigherPriorityTaskWoken is now set to pdTRUE then a context
    -			// switch should be requested.  The macro used is port specific and
    -			// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
    -			// refer to the documentation page for the port being used.
    -			portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    -		}
    -  }
    -   
    - * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR - * \ingroup EventGroup - */ -#if( configUSE_TRACE_FACILITY == 1 ) - BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; -#else - #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) -#endif - -/** - * event_groups.h - *
    -	EventBits_t xEventGroupSync(	EventGroupHandle_t xEventGroup,
    -									const EventBits_t uxBitsToSet,
    -									const EventBits_t uxBitsToWaitFor,
    -									TickType_t xTicksToWait );
    - 
    - * - * Atomically set bits within an event group, then wait for a combination of - * bits to be set within the same event group. This functionality is typically - * used to synchronise multiple tasks, where each task has to wait for the other - * tasks to reach a synchronisation point before proceeding. - * - * This function cannot be used from an interrupt. - * - * The function will return before its block time expires if the bits specified - * by the uxBitsToWait parameter are set, or become set within that time. In - * this case all the bits specified by uxBitsToWait will be automatically - * cleared before the function returns. - * - * @param xEventGroup The event group in which the bits are being tested. The - * event group must have previously been created using a call to - * xEventGroupCreate(). - * - * @param uxBitsToSet The bits to set in the event group before determining - * if, and possibly waiting for, all the bits specified by the uxBitsToWait - * parameter are set. - * - * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test - * inside the event group. For example, to wait for bit 0 and bit 2 set - * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set - * uxBitsToWaitFor to 0x07. Etc. - * - * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait - * for all of the bits specified by uxBitsToWaitFor to become set. - * - * @return The value of the event group at the time either the bits being waited - * for became set, or the block time expired. Test the return value to know - * which bits were set. If xEventGroupSync() returned because its timeout - * expired then not all the bits being waited for will be set. If - * xEventGroupSync() returned because all the bits it was waiting for were - * set then the returned value is the event group value before any bits were - * automatically cleared. - * - * Example usage: -
    - // Bits used by the three tasks.
    - #define TASK_0_BIT		( 1 << 0 )
    - #define TASK_1_BIT		( 1 << 1 )
    - #define TASK_2_BIT		( 1 << 2 )
    -
    - #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
    -
    - // Use an event group to synchronise three tasks.  It is assumed this event
    - // group has already been created elsewhere.
    - EventGroupHandle_t xEventBits;
    -
    - void vTask0( void *pvParameters )
    - {
    - EventBits_t uxReturn;
    - TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
    -
    -	 for( ;; )
    -	 {
    -		// Perform task functionality here.
    -
    -		// Set bit 0 in the event flag to note this task has reached the
    -		// sync point.  The other two tasks will set the other two bits defined
    -		// by ALL_SYNC_BITS.  All three tasks have reached the synchronisation
    -		// point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms
    -		// for this to happen.
    -		uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
    -
    -		if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
    -		{
    -			// All three tasks reached the synchronisation point before the call
    -			// to xEventGroupSync() timed out.
    -		}
    -	}
    - }
    -
    - void vTask1( void *pvParameters )
    - {
    -	 for( ;; )
    -	 {
    -		// Perform task functionality here.
    -
    -		// Set bit 1 in the event flag to note this task has reached the
    -		// synchronisation point.  The other two tasks will set the other two
    -		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
    -		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
    -		// indefinitely for this to happen.
    -		xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
    -
    -		// xEventGroupSync() was called with an indefinite block time, so
    -		// this task will only reach here if the syncrhonisation was made by all
    -		// three tasks, so there is no need to test the return value.
    -	 }
    - }
    -
    - void vTask2( void *pvParameters )
    - {
    -	 for( ;; )
    -	 {
    -		// Perform task functionality here.
    -
    -		// Set bit 2 in the event flag to note this task has reached the
    -		// synchronisation point.  The other two tasks will set the other two
    -		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
    -		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
    -		// indefinitely for this to happen.
    -		xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
    -
    -		// xEventGroupSync() was called with an indefinite block time, so
    -		// this task will only reach here if the syncrhonisation was made by all
    -		// three tasks, so there is no need to test the return value.
    -	}
    - }
    -
    - 
    - * \defgroup xEventGroupSync xEventGroupSync - * \ingroup EventGroup - */ -// EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - - -/** - * event_groups.h - *
    -	EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
    - 
    - * - * Returns the current value of the bits in an event group. This function - * cannot be used from an interrupt. - * - * @param xEventGroup The event group being queried. - * - * @return The event group bits at the time xEventGroupGetBits() was called. - * - * \defgroup xEventGroupGetBits xEventGroupGetBits - * \ingroup EventGroup - */ -#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) - -/** - * event_groups.h - *
    -	EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
    - 
    - * - * A version of xEventGroupGetBits() that can be called from an ISR. - * - * @param xEventGroup The event group being queried. - * - * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. - * - * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR - * \ingroup EventGroup - */ -// EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * event_groups.h - *
    -	void xEventGroupDelete( EventGroupHandle_t xEventGroup );
    - 
    - * - * Delete an event group that was previously created by a call to - * xEventGroupCreate(). Tasks that are blocked on the event group will be - * unblocked and obtain 0 as the event group's value. - * - * @param xEventGroup The event group being deleted. - */ -// void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* For internal use only. */ -// void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - - -#if (configUSE_TRACE_FACILITY == 1) - UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; - void vEventGroupSetNumber( void* xEventGroup, UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* EVENT_GROUPS_H */ - - diff --git a/bundles/mesh/inc/os/list.h b/bundles/mesh/inc/os/list.h deleted file mode 100644 index 43e0ffffb..000000000 --- a/bundles/mesh/inc/os/list.h +++ /dev/null @@ -1,412 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/* - * This is the list implementation used by the scheduler. While it is tailored - * heavily for the schedulers needs, it is also available for use by - * application code. - * - * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a - * numeric value (xItemValue). Most of the time the lists are sorted in - * descending item value order. - * - * Lists are created already containing one list item. The value of this - * item is the maximum possible that can be stored, it is therefore always at - * the end of the list and acts as a marker. The list member pxHead always - * points to this marker - even though it is at the tail of the list. This - * is because the tail contains a wrap back pointer to the true head of - * the list. - * - * In addition to it's value, each list item contains a pointer to the next - * item in the list (pxNext), a pointer to the list it is in (pxContainer) - * and a pointer to back to the object that contains it. These later two - * pointers are included for efficiency of list manipulation. There is - * effectively a two way link between the object containing the list item and - * the list item itself. - * - * - * \page ListIntroduction List Implementation - * \ingroup FreeRTOSIntro - */ - -#ifndef INC_FREERTOS_H - #error FreeRTOS.h must be included before list.h -#endif - -#ifndef LIST_H -#define LIST_H - -/* - * The list structure members are modified from within interrupts, and therefore - * by rights should be declared volatile. However, they are only modified in a - * functionally atomic way (within critical sections of with the scheduler - * suspended) and are either passed by reference into a function or indexed via - * a volatile variable. Therefore, in all use cases tested so far, the volatile - * qualifier can be omitted in order to provide a moderate performance - * improvement without adversely affecting functional behaviour. The assembly - * instructions generated by the IAR, ARM and GCC compilers when the respective - * compiler's options were set for maximum optimisation has been inspected and - * deemed to be as intended. That said, as compiler technology advances, and - * especially if aggressive cross module optimisation is used (a use case that - * has not been exercised to any great extend) then it is feasible that the - * volatile qualifier will be needed for correct optimisation. It is expected - * that a compiler removing essential code because, without the volatile - * qualifier on the list structure members and with aggressive cross module - * optimisation, the compiler deemed the code unnecessary will result in - * complete and obvious failure of the scheduler. If this is ever experienced - * then the volatile qualifier can be inserted in the relevant places within the - * list structures by simply defining configLIST_VOLATILE to volatile in - * FreeRTOSConfig.h (as per the example at the bottom of this comment block). - * If configLIST_VOLATILE is not defined then the preprocessor directives below - * will simply #define configLIST_VOLATILE away completely. - * - * To use volatile list structure members then add the following line to - * FreeRTOSConfig.h (without the quotes): - * "#define configLIST_VOLATILE volatile" - */ -#ifndef configLIST_VOLATILE - #define configLIST_VOLATILE -#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Macros that can be used to place known values within the list structures, -then check that the known values do not get corrupted during the execution of -the application. These may catch the list data structures being overwritten in -memory. They will not catch data errors caused by incorrect configuration or -use of FreeRTOS.*/ -#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) - /* Define the macros to do nothing. */ - #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE - #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE - #define listFIRST_LIST_INTEGRITY_CHECK_VALUE - #define listSECOND_LIST_INTEGRITY_CHECK_VALUE - #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) - #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) - #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) - #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) - #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) - #define listTEST_LIST_INTEGRITY( pxList ) -#else - /* Define macros that add new members into the list structures. */ - #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; - #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; - #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; - #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; - - /* Define macros that set the new structure members to known values. */ - #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE - #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE - #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE - #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE - - /* Define macros that will assert if one of the structure members does not - contain its expected value. */ - #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) - #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) -#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ - - -/* - * Definition of the only type of object that a list can contain. - */ -struct xLIST; -struct xLIST_ITEM -{ - listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ - struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ - struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ - void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ - struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */ - listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ -}; -typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ - -struct xMINI_LIST_ITEM -{ - listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - configLIST_VOLATILE TickType_t xItemValue; - struct xLIST_ITEM * configLIST_VOLATILE pxNext; - struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; -}; -typedef struct xMINI_LIST_ITEM MiniListItem_t; - -/* - * Definition of the type of queue used by the scheduler. - */ -typedef struct xLIST -{ - listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ - volatile UBaseType_t uxNumberOfItems; - ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ - MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ - listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ -} List_t; - -/* - * Access macro to set the owner of a list item. The owner of a list item - * is the object (usually a TCB) that contains the list item. - * - * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER - * \ingroup LinkedList - */ -#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) - -/* - * Access macro to get the owner of a list item. The owner of a list item - * is the object (usually a TCB) that contains the list item. - * - * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER - * \ingroup LinkedList - */ -#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) - -/* - * Access macro to set the value of the list item. In most cases the value is - * used to sort the list in descending order. - * - * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) - -/* - * Access macro to retrieve the value of the list item. The value can - * represent anything - for example the priority of a task, or the time at - * which a task should be unblocked. - * - * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) - -/* - * Access macro to retrieve the value of the list item at the head of a given - * list. - * - * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE - * \ingroup LinkedList - */ -#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) - -/* - * Return the list item at the head of the list. - * - * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY - * \ingroup LinkedList - */ -#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) - -/* - * Return the list item at the head of the list. - * - * \page listGET_NEXT listGET_NEXT - * \ingroup LinkedList - */ -#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) - -/* - * Return the list item that marks the end of the list - * - * \page listGET_END_MARKER listGET_END_MARKER - * \ingroup LinkedList - */ -#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) - -/* - * Access macro to determine if a list contains any items. The macro will - * only have the value true if the list is empty. - * - * \page listLIST_IS_EMPTY listLIST_IS_EMPTY - * \ingroup LinkedList - */ -#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) - -/* - * Access macro to return the number of items in the list. - */ -#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) - -/* - * Access function to obtain the owner of the next entry in a list. - * - * The list member pxIndex is used to walk through a list. Calling - * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list - * and returns that entry's pxOwner parameter. Using multiple calls to this - * function it is therefore possible to move through every item contained in - * a list. - * - * The pxOwner parameter of a list item is a pointer to the object that owns - * the list item. In the scheduler this is normally a task control block. - * The pxOwner parameter effectively creates a two way link between the list - * item and its owner. - * - * @param pxTCB pxTCB is set to the address of the owner of the next list item. - * @param pxList The list from which the next item owner is to be returned. - * - * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY - * \ingroup LinkedList - */ -#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ -{ \ -List_t * const pxConstList = ( pxList ); \ - /* Increment the index to the next item and return the item, ensuring */ \ - /* we don't return the marker used at the end of the list. */ \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ - { \ - ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ - } \ - ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ -} - - -/* - * Access function to obtain the owner of the first entry in a list. Lists - * are normally sorted in ascending item value order. - * - * This function returns the pxOwner member of the first item in the list. - * The pxOwner parameter of a list item is a pointer to the object that owns - * the list item. In the scheduler this is normally a task control block. - * The pxOwner parameter effectively creates a two way link between the list - * item and its owner. - * - * @param pxList The list from which the owner of the head item is to be - * returned. - * - * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY - * \ingroup LinkedList - */ -#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) - -/* - * Check to see if a list item is within a list. The list item maintains a - * "container" pointer that points to the list it is in. All this macro does - * is check to see if the container and the list match. - * - * @param pxList The list we want to know if the list item is within. - * @param pxListItem The list item we want to know if is in the list. - * @return pdTRUE if the list item is in the list, otherwise pdFALSE. - */ -#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) - -/* - * Return the list a list item is contained within (referenced from). - * - * @param pxListItem The list item being queried. - * @return A pointer to the List_t object that references the pxListItem - */ -#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) - -/* - * This provides a crude means of knowing if a list has been initialised, as - * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() - * function. - */ -#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) - -/* - * Must be called before a list is used! This initialises all the members - * of the list structure and inserts the xListEnd item into the list as a - * marker to the back of the list. - * - * @param pxList Pointer to the list being initialised. - * - * \page vListInitialise vListInitialise - * \ingroup LinkedList - */ -void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; - -/* - * Must be called before a list item is used. This sets the list container to - * null so the item does not think that it is already contained in a list. - * - * @param pxItem Pointer to the list item being initialised. - * - * \page vListInitialiseItem vListInitialiseItem - * \ingroup LinkedList - */ -void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; - -/* - * Insert a list item into a list. The item will be inserted into the list in - * a position determined by its item value (descending item value order). - * - * @param pxList The list into which the item is to be inserted. - * - * @param pxNewListItem The item that is to be placed in the list. - * - * \page vListInsert vListInsert - * \ingroup LinkedList - */ -void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; - -/* - * Insert a list item into a list. The item will be inserted in a position - * such that it will be the last item within the list returned by multiple - * calls to listGET_OWNER_OF_NEXT_ENTRY. - * - * The list member pxIndex is used to walk through a list. Calling - * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. - * Placing an item in a list using vListInsertEnd effectively places the item - * in the list position pointed to by pxIndex. This means that every other - * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before - * the pxIndex parameter again points to the item being inserted. - * - * @param pxList The list into which the item is to be inserted. - * - * @param pxNewListItem The list item to be inserted into the list. - * - * \page vListInsertEnd vListInsertEnd - * \ingroup LinkedList - */ -void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; - -/* - * Remove an item from a list. The list item has a pointer to the list that - * it is in, so only the list item need be passed into the function. - * - * @param uxListRemove The item to be removed. The item will remove itself from - * the list pointed to by it's pxContainer parameter. - * - * @return The number of items that remain in the list after the list item has - * been removed. - * - * \page uxListRemove uxListRemove - * \ingroup LinkedList - */ -UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/bundles/mesh/inc/os/mpu_wrappers.h b/bundles/mesh/inc/os/mpu_wrappers.h deleted file mode 100644 index f7a53c5e5..000000000 --- a/bundles/mesh/inc/os/mpu_wrappers.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef MPU_WRAPPERS_H -#define MPU_WRAPPERS_H - -/* This file redefines API functions to be called through a wrapper macro, but -only for ports that are using the MPU. */ -#ifdef portUSING_MPU_WRAPPERS - - /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is - included from queue.c or task.c to prevent it from having an effect within - those files. */ - #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE - - /* - * Map standard (non MPU) API functions to equivalents that start - * "MPU_". This will cause the application code to call the MPU_ - * version, which wraps the non-MPU version with privilege promoting - * then demoting code, so the kernel code always runs will full - * privileges. - */ - - /* Map standard tasks.h API functions to the MPU equivalents. */ - #define xTaskCreate MPU_xTaskCreate - #define xTaskCreateStatic MPU_xTaskCreateStatic - #define xTaskCreateRestricted MPU_xTaskCreateRestricted - #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions - #define vTaskDelete MPU_vTaskDelete - #define vTaskDelay MPU_vTaskDelay - #define vTaskDelayUntil MPU_vTaskDelayUntil - #define xTaskAbortDelay MPU_xTaskAbortDelay - #define uxTaskPriorityGet MPU_uxTaskPriorityGet - #define eTaskGetState MPU_eTaskGetState - #define vTaskGetInfo MPU_vTaskGetInfo - #define vTaskPrioritySet MPU_vTaskPrioritySet - #define vTaskSuspend MPU_vTaskSuspend - #define vTaskResume MPU_vTaskResume - #define vTaskSuspendAll MPU_vTaskSuspendAll - #define xTaskResumeAll MPU_xTaskResumeAll - #define xTaskGetTickCount MPU_xTaskGetTickCount - #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks - #define pcTaskGetName MPU_pcTaskGetName - #define xTaskGetHandle MPU_xTaskGetHandle - #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark - #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag - #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag - #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer - #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer - #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook - #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle - #define uxTaskGetSystemState MPU_uxTaskGetSystemState - #define vTaskList MPU_vTaskList - #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats - #define xTaskGenericNotify MPU_xTaskGenericNotify - #define xTaskNotifyWait MPU_xTaskNotifyWait - #define ulTaskNotifyTake MPU_ulTaskNotifyTake - #define xTaskNotifyStateClear MPU_xTaskNotifyStateClear - - #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle - #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState - #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut - #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState - - /* Map standard queue.h API functions to the MPU equivalents. */ - #define xQueueGenericSend MPU_xQueueGenericSend - #define xQueueReceive MPU_xQueueReceive - #define xQueuePeek MPU_xQueuePeek - #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake - #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting - #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable - #define vQueueDelete MPU_vQueueDelete - #define xQueueCreateMutex MPU_xQueueCreateMutex - #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic - #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore - #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic - #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder - #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive - #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive - #define xQueueGenericCreate MPU_xQueueGenericCreate - #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic - #define xQueueCreateSet MPU_xQueueCreateSet - #define xQueueAddToSet MPU_xQueueAddToSet - #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet - #define xQueueSelectFromSet MPU_xQueueSelectFromSet - #define xQueueGenericReset MPU_xQueueGenericReset - - #if( configQUEUE_REGISTRY_SIZE > 0 ) - #define vQueueAddToRegistry MPU_vQueueAddToRegistry - #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue - #define pcQueueGetName MPU_pcQueueGetName - #endif - - /* Map standard timer.h API functions to the MPU equivalents. */ - #define xTimerCreate MPU_xTimerCreate - #define xTimerCreateStatic MPU_xTimerCreateStatic - #define pvTimerGetTimerID MPU_pvTimerGetTimerID - #define vTimerSetTimerID MPU_vTimerSetTimerID - #define xTimerIsTimerActive MPU_xTimerIsTimerActive - #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle - #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall - #define pcTimerGetName MPU_pcTimerGetName - #define xTimerGetPeriod MPU_xTimerGetPeriod - #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime - #define xTimerGenericCommand MPU_xTimerGenericCommand - - /* Map standard event_group.h API functions to the MPU equivalents. */ - #define xEventGroupCreate MPU_xEventGroupCreate - #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic - #define xEventGroupWaitBits MPU_xEventGroupWaitBits - #define xEventGroupClearBits MPU_xEventGroupClearBits - #define xEventGroupSetBits MPU_xEventGroupSetBits - #define xEventGroupSync MPU_xEventGroupSync - #define vEventGroupDelete MPU_vEventGroupDelete - - /* Map standard message/stream_buffer.h API functions to the MPU - equivalents. */ - #define xStreamBufferSend MPU_xStreamBufferSend - #define xStreamBufferSendFromISR MPU_xStreamBufferSendFromISR - #define xStreamBufferReceive MPU_xStreamBufferReceive - #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes - #define xStreamBufferReceiveFromISR MPU_xStreamBufferReceiveFromISR - #define vStreamBufferDelete MPU_vStreamBufferDelete - #define xStreamBufferIsFull MPU_xStreamBufferIsFull - #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty - #define xStreamBufferReset MPU_xStreamBufferReset - #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable - #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable - #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel - #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate - #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic - - - /* Remove the privileged function macro, but keep the PRIVILEGED_DATA - macro so applications can place data in privileged access sections - (useful when using statically allocated objects). */ - #define PRIVILEGED_FUNCTION - #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - - #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ - - /* Ensure API functions go in the privileged execution section. */ - #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) - #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) - - #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ - -#else /* portUSING_MPU_WRAPPERS */ - - #define PRIVILEGED_FUNCTION - #define PRIVILEGED_DATA - #define portUSING_MPU_WRAPPERS 0 - -#endif /* portUSING_MPU_WRAPPERS */ - - -#endif /* MPU_WRAPPERS_H */ - diff --git a/bundles/mesh/inc/os/os_mbuf.h b/bundles/mesh/inc/os/os_mbuf.h deleted file mode 100644 index 76afcd16a..000000000 --- a/bundles/mesh/inc/os/os_mbuf.h +++ /dev/null @@ -1,716 +0,0 @@ -/* - * 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. - */ - - -/** - * @addtogroup OSKernel - * @{ - * @defgroup OSMbuf Chained Memory Buffers - * @{ - */ - - -#ifndef _OS_MBUF_H -#define _OS_MBUF_H - -#include "os/os.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * A mbuf pool from which to allocate mbufs. This contains a pointer to the os - * mempool to allocate mbufs out of, the total number of elements in the pool, - * and the amount of "user" data in a non-packet header mbuf. The total pool - * size, in bytes, should be: - * os_mbuf_count * (omp_databuf_len + sizeof(struct os_mbuf)) - */ -struct os_mbuf_pool { - /** - * Total length of the databuf in each mbuf. This is the size of the - * mempool block, minus the mbuf header - */ - uint16_t omp_databuf_len; - /** - * The memory pool which to allocate mbufs out of - */ - struct os_mempool *omp_pool; - - STAILQ_ENTRY(os_mbuf_pool) omp_next; -}; - - -/** - * A packet header structure that preceeds the mbuf packet headers. - */ -struct os_mbuf_pkthdr { - /** - * Overall length of the packet. - */ - uint16_t omp_len; - /** - * Flags - */ - uint16_t omp_flags; - - STAILQ_ENTRY(os_mbuf_pkthdr) omp_next; -}; - -/** - * Chained memory buffer. - */ -struct os_mbuf { - /** - * Current pointer to data in the structure - */ - uint8_t *om_data; - /** - * Flags associated with this buffer, see OS_MBUF_F_* defintions - */ - uint8_t om_flags; - /** - * Length of packet header - */ - uint8_t om_pkthdr_len; - /** - * Length of data in this buffer - */ - uint16_t om_len; - - /** - * The mbuf pool this mbuf was allocated out of - */ - struct os_mbuf_pool *om_omp; - - SLIST_ENTRY(os_mbuf) om_next; - - /** - * Pointer to the beginning of the data, after this buffer - */ - uint8_t om_databuf[0]; -}; - -/** - * Structure representing a queue of mbufs. - */ -struct os_mqueue { - STAILQ_HEAD(, os_mbuf_pkthdr) mq_head; - /** Event to post when new buffers are available on the queue. */ - struct ble_npl_event mq_ev; -}; - -/* - * Given a flag number, provide the mask for it - * - * @param __n The number of the flag in the mask - */ -#define OS_MBUF_F_MASK(__n) (1 << (__n)) - -/* - * Checks whether a given mbuf is a packet header mbuf - * - * @param __om The mbuf to check - */ -#define OS_MBUF_IS_PKTHDR(__om) \ - ((__om)->om_pkthdr_len >= sizeof (struct os_mbuf_pkthdr)) - -/** Get a packet header pointer given an mbuf pointer */ -#define OS_MBUF_PKTHDR(__om) ((struct os_mbuf_pkthdr *) \ - ((uint8_t *)&(__om)->om_data + sizeof(struct os_mbuf))) - -/** Given a mbuf packet header pointer, return a pointer to the mbuf */ -#define OS_MBUF_PKTHDR_TO_MBUF(__hdr) \ - (struct os_mbuf *)((uint8_t *)(__hdr) - sizeof(struct os_mbuf)) - -/** - * Gets the length of an entire mbuf chain. The specified mbuf must have a - * packet header. - */ -#define OS_MBUF_PKTLEN(__om) (OS_MBUF_PKTHDR(__om)->omp_len) - -/** - * Access the data of a mbuf, and cast it to type - * - * @param __om The mbuf to access, and cast - * @param __type The type to cast it to - */ -#define OS_MBUF_DATA(__om, __type) \ - (__type) ((__om)->om_data) - -/** - * Access the "user header" in the head of an mbuf chain. - * - * @param om Pointer to the head of an mbuf chain. - */ -#define OS_MBUF_USRHDR(om) \ - (void *)((uint8_t *)om + sizeof (struct os_mbuf) + \ - sizeof (struct os_mbuf_pkthdr)) - -/** - * Retrieves the length of the user header in an mbuf. - * - * @param om Pointer to the mbuf to query. - */ -#define OS_MBUF_USRHDR_LEN(om) \ - ((om)->om_pkthdr_len - sizeof (struct os_mbuf_pkthdr)) - - -/** @cond INTERNAL_HIDDEN */ - -/* - * Called by OS_MBUF_LEADINGSPACE() macro - */ -static inline uint16_t -_os_mbuf_leadingspace(struct os_mbuf *om) -{ -// uint16_t startoff; - uint16_t startoff; -// uint16_t leadingspace; - uint16_t leadingspace; - - startoff = 0; - if (OS_MBUF_IS_PKTHDR(om)) { - startoff = om->om_pkthdr_len; - } - - leadingspace = (uint16_t) (OS_MBUF_DATA(om, uint8_t *) - - ((uint8_t *) &om->om_databuf[0] + startoff)); - - return (leadingspace); -} - -/** @endcond */ - -/** - * Returns the leading space (space at the beginning) of the mbuf. - * Works on both packet header, and regular mbufs, as it accounts - * for the additional space allocated to the packet header. - * - * @param __omp Is the mbuf pool (which contains packet header length.) - * @param __om Is the mbuf in that pool to get the leadingspace for - * - * @return Amount of leading space available in the mbuf - */ -#define OS_MBUF_LEADINGSPACE(__om) _os_mbuf_leadingspace(__om) - - -/** @cond INTERNAL_HIDDEN */ - -/* Called by OS_MBUF_TRAILINGSPACE() macro. */ -static inline uint16_t -_os_mbuf_trailingspace(struct os_mbuf *om) -{ - struct os_mbuf_pool *omp; - - omp = om->om_omp; - - return (&om->om_databuf[0] + omp->omp_databuf_len) - - (om->om_data + om->om_len); -} - -/** @endcond */ - -/** - * Returns the trailing space (space at the end) of the mbuf. - * Works on both packet header and regular mbufs. - * - * @param __omp The mbuf pool for this mbuf - * @param __om Is the mbuf in that pool to get trailing space for - * - * @return The amount of trailing space available in the mbuf - */ -#define OS_MBUF_TRAILINGSPACE(__om) _os_mbuf_trailingspace(__om) - - -/** - * Initializes an mqueue. An mqueue is a queue of mbufs that ties to a - * particular task's event queue. Mqueues form a helper API around a common - * paradigm: wait on an event queue until at least one packet is available, - * then process a queue of packets. - * - * When mbufs are available on the queue, an event OS_EVENT_T_MQUEUE_DATA - * will be posted to the task's mbuf queue. - * - * @param mq The mqueue to initialize - * @param ev_cb The callback to associate with the mqeueue - * event. Typically, this callback pulls each - * packet off the mqueue and processes them. - * @param arg The argument to associate with the mqueue event. - * - * @return 0 on success, non-zero on failure. - */ -// int os_mqueue_init(struct os_mqueue *mq, ble_npl_event_fn *ev_cb, void *arg); -typedef int (*f_os_mqueue_init)(struct os_mqueue *mq, ble_npl_event_fn *ev_cb, void *arg); -#define os_mqueue_init ((f_os_mqueue_init)(0x000285bf)) - - -/** - * Remove and return a single mbuf from the mbuf queue. Does not block. - * - * @param mq The mbuf queue to pull an element off of. - * - * @return The next mbuf in the queue, or NULL if queue has no mbufs. - */ -// struct os_mbuf *os_mqueue_get(struct os_mqueue *); -typedef struct os_mbuf * (*f_os_mqueue_get)(struct os_mqueue *); -#define os_mqueue_get ((f_os_mqueue_get)(0x00028599)) - - -/** - * Adds a packet (i.e. packet header mbuf) to an mqueue. The event associated - * with the mqueue gets posted to the specified eventq. - * - * @param mq The mbuf queue to append the mbuf to. - * @param evq The event queue to post an event to. - * @param m The mbuf to append to the mbuf queue. - * - * @return 0 on success, non-zero on failure. - */ -// int os_mqueue_put(struct os_mqueue *, struct ble_npl_eventq *, struct os_mbuf *); -typedef int (*f_os_mqueue_put)(struct os_mqueue *, struct ble_npl_eventq *, struct os_mbuf *); -#define os_mqueue_put ((f_os_mqueue_put)(0x000285d1)) - - -/** - * MSYS is a system level mbuf registry. Allows the system to share - * packet buffers amongst the various networking stacks that can be running - * simultaeneously. - * - * Mbuf pools are created in the system initialization code, and then when - * a mbuf is allocated out of msys, it will try and find the best fit based - * upon estimated mbuf size. - * - * os_msys_register() registers a mbuf pool with MSYS, and allows MSYS to - * allocate mbufs out of it. - * - * @param new_pool The pool to register with MSYS - * - * @return 0 on success, non-zero on failure - */ -// int os_msys_register(struct os_mbuf_pool *); -typedef int (*f_os_msys_register)(struct os_mbuf_pool *); -#define os_msys_register ((f_os_msys_register)(0x000286b9)) - - -/** - * Allocate a mbuf from msys. Based upon the data size requested, - * os_msys_get() will choose the mbuf pool that has the best fit. - * - * @param dsize The estimated size of the data being stored in the mbuf - * @param leadingspace The amount of leadingspace to allocate in the mbuf - * - * @return A freshly allocated mbuf on success, NULL on failure. - */ -// struct os_mbuf *os_msys_get(uint16_t dsize, uint16_t leadingspace); -typedef struct os_mbuf * (*f_os_msys_get)(uint16_t dsize, uint16_t leadingspace); -#define os_msys_get ((f_os_msys_get)(0x00028625)) - - -/** - * De-registers all mbuf pools from msys. - */ -// void os_msys_reset(void); -typedef void (*f_os_msys_reset)(void); -#define os_msys_reset ((f_os_msys_reset)(0x000286f5)) - - -/** - * Allocate a packet header structure from the MSYS pool. See - * os_msys_register() for a description of MSYS. - * - * @param dsize The estimated size of the data being stored in the mbuf - * @param user_hdr_len The length to allocate for the packet header structure - * - * @return A freshly allocated mbuf on success, NULL on failure. - */ -// struct os_mbuf *os_msys_get_pkthdr(uint16_t dsize, uint16_t user_hdr_len); -typedef struct os_mbuf * (*f_os_msys_get_pkthdr)(uint16_t dsize, uint16_t user_hdr_len); -#define os_msys_get_pkthdr ((f_os_msys_get_pkthdr)(0x0002863d)) - - -/** - * Count the number of blocks in all the mbuf pools that are allocated. - * - * @return total number of blocks allocated in Msys - */ -// int os_msys_count(void); -typedef int (*f_os_msys_count)(void); -#define os_msys_count ((f_os_msys_count)(0x00028609)) - - -/** - * Return the number of free blocks in Msys - * - * @return Number of free blocks available in Msys - */ -// int os_msys_num_free(void); -typedef int (*f_os_msys_num_free)(void); -#define os_msys_num_free ((f_os_msys_num_free)(0x0002869d)) - - -/** - * Initialize a pool of mbufs. - * - * @param omp The mbuf pool to initialize - * @param mp The memory pool that will hold this mbuf pool - * @param buf_len The length of the buffer itself. - * @param nbufs The number of buffers in the pool - * - * @return 0 on success, error code on failure. - */ -// int os_mbuf_pool_init(struct os_mbuf_pool *, struct os_mempool *mp, -// uint16_t, uint16_t); -typedef int (*f_os_mbuf_pool_init)(struct os_mbuf_pool *, struct os_mempool *mp, uint16_t, uint16_t); -#define os_mbuf_pool_init ((f_os_mbuf_pool_init)(0x00028307)) - - -/** - * Get an mbuf from the mbuf pool. The mbuf is allocated, and initialized - * prior to being returned. - * - * @param omp The mbuf pool to return the packet from - * @param leadingspace The amount of leadingspace to put before the data - * section by default. - * - * @return An initialized mbuf on success, and NULL on failure. - */ -// struct os_mbuf *os_mbuf_get(struct os_mbuf_pool *omp, uint16_t); -typedef struct os_mbuf * (*f_os_mbuf_get)(struct os_mbuf_pool *omp, uint16_t); -#define os_mbuf_get ((f_os_mbuf_get)(0x0002828d)) - - -/** - * Allocate a new packet header mbuf out of the os_mbuf_pool. - * - * @param omp The mbuf pool to allocate out of - * @param user_pkthdr_len The packet header length to reserve for the caller. - * - * @return A freshly allocated mbuf on success, NULL on failure. - */ -// struct os_mbuf *os_mbuf_get_pkthdr(struct os_mbuf_pool *omp, -// uint8_t pkthdr_len); -typedef struct os_mbuf * (*f_os_mbuf_get_pkthdr)(struct os_mbuf_pool *omp, uint8_t pkthdr_len); -#define os_mbuf_get_pkthdr ((f_os_mbuf_get_pkthdr)(0x000282b9)) - - -/** - * Duplicate a chain of mbufs. Return the start of the duplicated chain. - * - * @param omp The mbuf pool to duplicate out of - * @param om The mbuf chain to duplicate - * - * @return A pointer to the new chain of mbufs - */ -// struct os_mbuf *os_mbuf_dup(struct os_mbuf *m); -typedef struct os_mbuf * (*f_os_mbuf_dup)(struct os_mbuf *m); -#define os_mbuf_dup ((f_os_mbuf_dup)(0x0002819f)) - - -/** - * Locates the specified absolute offset within an mbuf chain. The offset - * can be one past than the total length of the chain, but no greater. - * - * @param om The start of the mbuf chain to seek within. - * @param off The absolute address to find. - * @param out_off On success, this points to the relative offset - * within the returned mbuf. - * - * @return The mbuf containing the specified offset on - * success. - * NULL if the specified offset is out of bounds. - */ -// struct os_mbuf *os_mbuf_off(const struct os_mbuf *om, int off, -// uint16_t *out_off); -typedef struct os_mbuf * (*f_os_mbuf_off)(const struct os_mbuf *om, int off, uint16_t *out_off); -#define os_mbuf_off ((f_os_mbuf_off)(0x000282e9)) - - - -/* - * Copy data from an mbuf chain starting "off" bytes from the beginning, - * continuing for "len" bytes, into the indicated buffer. - * - * @param m The mbuf chain to copy from - * @param off The offset into the mbuf chain to begin copying from - * @param len The length of the data to copy - * @param dst The destination buffer to copy into - * - * @return 0 on success; - * -1 if the mbuf does not contain enough data. - */ -// int os_mbuf_copydata(const struct os_mbuf *m, int off, int len, void *dst); -typedef int (*f_os_mbuf_copydata)(const struct os_mbuf *m, int off, int len, void *dst); -#define os_mbuf_copydata ((f_os_mbuf_copydata)(0x000280c9)) - - -/** - * Append data onto a mbuf - * - * @param om The mbuf to append the data onto - * @param data The data to append onto the mbuf - * @param len The length of the data to append - * - * @return 0 on success, and an error code on failure - */ -// int os_mbuf_append(struct os_mbuf *m, const void *, uint16_t); -typedef int (*f_os_mbuf_append)(struct os_mbuf *m, const void *, uint16_t); -#define os_mbuf_append ((f_os_mbuf_append)(0x00027e81)) - - -/** - * Reads data from one mbuf and appends it to another. On error, the specified - * data range may be partially appended. Neither mbuf is required to contain - * an mbuf packet header. - * - * @param dst The mbuf to append to. - * @param src The mbuf to copy data from. - * @param src_off The absolute offset within the source mbuf - * chain to read from. - * @param len The number of bytes to append. - * - * @return 0 on success; - * OS_EINVAL if the specified range extends beyond - * the end of the source mbuf chain. - */ -// int os_mbuf_appendfrom(struct os_mbuf *dst, const struct os_mbuf *src, -// uint16_t src_off, uint16_t len); -typedef int (*f_os_mbuf_appendfrom)(struct os_mbuf *dst, const struct os_mbuf *src, uint16_t src_off, uint16_t len); -#define os_mbuf_appendfrom ((f_os_mbuf_appendfrom)(0x00027f19)) - - -/** - * Release a mbuf back to the pool - * - * @param omp The Mbuf pool to release back to - * @param om The Mbuf to release back to the pool - * - * @return 0 on success, -1 on failure - */ -// int os_mbuf_free(struct os_mbuf *mb); -typedef int (*f_os_mbuf_free)(struct os_mbuf *mb); -#define os_mbuf_free ((f_os_mbuf_free)(0x0002825f)) - - -/** - * Free a chain of mbufs - * - * @param omp The mbuf pool to free the chain of mbufs into - * @param om The starting mbuf of the chain to free back into the pool - * - * @return 0 on success, -1 on failure - */ -// int os_mbuf_free_chain(struct os_mbuf *om); -typedef int (*f_os_mbuf_free_chain)(struct os_mbuf *om); -#define os_mbuf_free_chain ((f_os_mbuf_free_chain)(0x00028277)) - - -/** - * Adjust the length of a mbuf, trimming either from the head or the tail - * of the mbuf. - * - * @param mp The mbuf chain to adjust - * @param req_len The length to trim from the mbuf. If positive, trims - * from the head of the mbuf, if negative, trims from the - * tail of the mbuf. - */ -// void os_mbuf_adj(struct os_mbuf *mp, int req_len); -typedef void (*f_os_mbuf_adj)(struct os_mbuf *mp, int req_len); -#define os_mbuf_adj ((f_os_mbuf_adj)(0x00027de9)) - - - -/** - * Performs a memory compare of the specified region of an mbuf chain against a - * flat buffer. - * - * @param om The start of the mbuf chain to compare. - * @param off The offset within the mbuf chain to start the - * comparison. - * @param data The flat buffer to compare. - * @param len The length of the flat buffer. - * - * @return 0 if both memory regions are identical; - * A memcmp return code if there is a mismatch; - * INT_MAX if the mbuf is too short. - */ -// int os_mbuf_cmpf(const struct os_mbuf *om, int off, const void *data, int len); -typedef int (*f_os_mbuf_cmpf)(const struct os_mbuf *om, int off, const void *data, int len); -#define os_mbuf_cmpf ((f_os_mbuf_cmpf)(0x00027f6f)) - - -/** - * Compares the contents of two mbuf chains. The ranges of the two chains to - * be compared are specified via the two offset parameters and the len - * parameter. Neither mbuf chain is required to contain a packet header. - * - * @param om1 The first mbuf chain to compare. - * @param offset1 The absolute offset within om1 at which to - * start the comparison. - * @param om2 The second mbuf chain to compare. - * @param offset2 The absolute offset within om2 at which to - * start the comparison. - * @param len The number of bytes to compare. - * - * @return 0 if both mbuf segments are identical; - * A memcmp() return code if the segment contents - * differ; - * INT_MAX if a specified range extends beyond the - * end of its corresponding mbuf chain. - */ -// int os_mbuf_cmpm(const struct os_mbuf *om1, uint16_t offset1, -// const struct os_mbuf *om2, uint16_t offset2, -// uint16_t len); -typedef int (*f_os_mbuf_cmpm)(const struct os_mbuf *om1, uint16_t offset1, const struct os_mbuf *om2, uint16_t offset2, uint16_t len); -#define os_mbuf_cmpm ((f_os_mbuf_cmpm)(0x00027fcf)) - - -/** - * Increases the length of an mbuf chain by adding data to the front. If there - * is insufficient room in the leading mbuf, additional mbufs are allocated and - * prepended as necessary. If this function fails to allocate an mbuf, the - * entire chain is freed. - * - * The specified mbuf chain does not need to contain a packet header. - * - * @param omp The mbuf pool to allocate from. - * @param om The head of the mbuf chain. - * @param len The number of bytes to prepend. - * - * @return The new head of the chain on success; - * NULL on failure. - */ -// struct os_mbuf *os_mbuf_prepend(struct os_mbuf *om, int len); -typedef struct os_mbuf * (*f_os_mbuf_prepend)(struct os_mbuf *om, int len); -#define os_mbuf_prepend ((f_os_mbuf_prepend)(0x00028311)) - - -/** - * Prepends a chunk of empty data to the specified mbuf chain and ensures the - * chunk is contiguous. If either operation fails, the specified mbuf chain is - * freed and NULL is returned. - * - * @param om The mbuf chain to prepend to. - * @param len The number of bytes to prepend and pullup. - * - * @return The modified mbuf on success; - * NULL on failure (and the mbuf chain is freed). - */ -// struct os_mbuf *os_mbuf_prepend_pullup(struct os_mbuf *om, uint16_t len); -typedef struct os_mbuf * (*f_os_mbuf_prepend_pullup)(struct os_mbuf *om, uint16_t len); -#define os_mbuf_prepend_pullup ((f_os_mbuf_prepend_pullup)(0x00028393)) - - -/** - * Copies the contents of a flat buffer into an mbuf chain, starting at the - * specified destination offset. If the mbuf is too small for the source data, - * it is extended as necessary. If the destination mbuf contains a packet - * header, the header length is updated. - * - * @param omp The mbuf pool to allocate from. - * @param om The mbuf chain to copy into. - * @param off The offset within the chain to copy to. - * @param src The source buffer to copy from. - * @param len The number of bytes to copy. - * - * @return 0 on success; nonzero on failure. - */ -// int os_mbuf_copyinto(struct os_mbuf *om, int off, const void *src, int len); -typedef int (*f_os_mbuf_copyinto)(struct os_mbuf *om, int off, const void *src, int len); -#define os_mbuf_copyinto ((f_os_mbuf_copyinto)(0x00028121)) - - -/** - * Attaches a second mbuf chain onto the end of the first. If the first chain - * contains a packet header, the header's length is updated. If the second - * chain has a packet header, its header is cleared. - * - * @param first The mbuf chain being attached to. - * @param second The mbuf chain that gets attached. - */ -// void os_mbuf_concat(struct os_mbuf *first, struct os_mbuf *second); -typedef void (*f_os_mbuf_concat)(struct os_mbuf *first, struct os_mbuf *second); -#define os_mbuf_concat ((f_os_mbuf_concat)(0x0002808d)) - - - -/** - * Increases the length of an mbuf chain by the specified amount. If there is - * not sufficient room in the last buffer, a new buffer is allocated and - * appended to the chain. It is an error to request more data than can fit in - * a single buffer. - * - * @param omp - * @param om The head of the chain to extend. - * @param len The number of bytes to extend by. - * - * @return A pointer to the new data on success; - * NULL on failure. - */ -// void *os_mbuf_extend(struct os_mbuf *om, uint16_t len); -typedef void * (*f_os_mbuf_extend)(struct os_mbuf *om, uint16_t len); -#define os_mbuf_extend ((f_os_mbuf_extend)(0x0002820f)) - - -/** - * Rearrange a mbuf chain so that len bytes are contiguous, - * and in the data area of an mbuf (so that OS_MBUF_DATA() will - * work on a structure of size len.) Returns the resulting - * mbuf chain on success, free's it and returns NULL on failure. - * - * If there is room, it will add up to "max_protohdr - len" - * extra bytes to the contiguous region, in an attempt to avoid being - * called next time. - * - * @param omp The mbuf pool to take the mbufs out of - * @param om The mbuf chain to make contiguous - * @param len The number of bytes in the chain to make contiguous - * - * @return The contiguous mbuf chain on success, NULL on failure. - */ -// struct os_mbuf *os_mbuf_pullup(struct os_mbuf *om, uint16_t len); -typedef struct os_mbuf * (*f_os_mbuf_pullup)(struct os_mbuf *om, uint16_t len); -#define os_mbuf_pullup ((f_os_mbuf_pullup)(0x000283ab)) - - - -/** - * Removes and frees empty mbufs from the front of a chain. If the chain - * contains a packet header, it is preserved. - * - * @param om The mbuf chain to trim. - * - * @return The head of the trimmed mbuf chain. - */ -// struct os_mbuf *os_mbuf_trim_front(struct os_mbuf *om); -typedef struct os_mbuf * (*f_os_mbuf_trim_front)(struct os_mbuf *om); -#define os_mbuf_trim_front ((f_os_mbuf_trim_front)(0x00028477)) - - -#ifdef __cplusplus -} -#endif - -#endif /* _OS_MBUF_H */ - - -/** - * @} OSMbuf - * @} OSKernel - */ diff --git a/bundles/mesh/inc/os/portable.h b/bundles/mesh/inc/os/portable.h deleted file mode 100644 index 3f0ce8eb8..000000000 --- a/bundles/mesh/inc/os/portable.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Portable layer API. Each function must be defined for each port. - *----------------------------------------------------------*/ - -#ifndef PORTABLE_H -#define PORTABLE_H - -/* Each FreeRTOS port has a unique portmacro.h header file. Originally a -pre-processor definition was used to ensure the pre-processor found the correct -portmacro.h file for the port being used. That scheme was deprecated in favour -of setting the compiler's include path such that it found the correct -portmacro.h file - removing the need for the constant and allowing the -portmacro.h file to be located anywhere in relation to the port being used. -Purely for reasons of backward compatibility the old method is still valid, but -to make it clear that new projects should not use it, support for the port -specific constants has been moved into the deprecated_definitions.h header -file. */ -#include "deprecated_definitions.h" - -/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h -did not result in a portmacro.h header file being included - and it should be -included here. In this case the path to the correct portmacro.h header file -must be set in the compiler's include path. */ -#ifndef portENTER_CRITICAL - #include "portmacro.h" -#endif - -#if portBYTE_ALIGNMENT == 32 - #define portBYTE_ALIGNMENT_MASK ( 0x001f ) -#endif - -#if portBYTE_ALIGNMENT == 16 - #define portBYTE_ALIGNMENT_MASK ( 0x000f ) -#endif - -#if portBYTE_ALIGNMENT == 8 - #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) -#endif - -#if portBYTE_ALIGNMENT == 4 - #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) -#endif - -#if portBYTE_ALIGNMENT == 2 - #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) -#endif - -#if portBYTE_ALIGNMENT == 1 - #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) -#endif - -#ifndef portBYTE_ALIGNMENT_MASK - #error "Invalid portBYTE_ALIGNMENT definition" -#endif - -#ifndef portNUM_CONFIGURABLE_REGIONS - #define portNUM_CONFIGURABLE_REGIONS 1 -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include "mpu_wrappers.h" - -/* - * Setup the stack of a new task so it is ready to be placed under the - * scheduler control. The registers have to be placed on the stack in - * the order that the port expects to find them. - * - */ -#if( portUSING_MPU_WRAPPERS == 1 ) - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; -#else - StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; -#endif - -/* Used by heap_5.c. */ -typedef struct HeapRegion -{ - uint8_t *pucStartAddress; - size_t xSizeInBytes; -} HeapRegion_t; - -/* - * Used to define multiple heap regions for use by heap_5.c. This function - * must be called before any calls to pvPortMalloc() - not creating a task, - * queue, semaphore, mutex, software timer, event group, etc. will result in - * pvPortMalloc being called. - * - * pxHeapRegions passes in an array of HeapRegion_t structures - each of which - * defines a region of memory that can be used as the heap. The array is - * terminated by a HeapRegions_t structure that has a size of 0. The region - * with the lowest start address must appear first in the array. - */ -// void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - - -/* - * Map to the memory management routines required for the port. - */ -void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; -void vPortFree( void *pv ) PRIVILEGED_FUNCTION; -// void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Setup the hardware ready for the scheduler to take control. This generally - * sets up a tick interrupt and sets timers for the correct tick frequency. - */ -BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; - -/* - * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so - * the hardware is left in its original condition after the scheduler stops - * executing. - */ -// void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * The structures and methods of manipulating the MPU are contained within the - * port layer. - * - * Fills the xMPUSettings structure with the memory region information - * contained in xRegions. - */ -#if( portUSING_MPU_WRAPPERS == 1 ) - struct xMEMORY_REGION; - void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* PORTABLE_H */ - diff --git a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c b/bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c deleted file mode 100644 index cdd962beb..000000000 --- a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/port.c +++ /dev/null @@ -1,717 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the ARM CM3 port. - *----------------------------------------------------------*/ - -/* Scheduler includes. */ -#include "FreeRTOS.h" -#include "task.h" - -/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is -defined. The value should also ensure backward compatibility. -FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ -#ifndef configKERNEL_INTERRUPT_PRIORITY - #define configKERNEL_INTERRUPT_PRIORITY 255 -#endif - -#ifndef configSYSTICK_CLOCK_HZ - #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ - /* Ensure the SysTick is clocked at the same frequency as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) -#else - /* The way the SysTick is clocked is not modified in case it is not the same - as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 0 ) -#endif - -/* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) -/* ...then bits in the registers. */ -#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) -#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) -#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) -#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) - -#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) - -/* Constants required to check the validity of an interrupt priority. */ -#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) -#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) -#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) -#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) -#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) -#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) -#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) -#define portPRIGROUP_SHIFT ( 8UL ) - -/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ -#define portVECTACTIVE_MASK ( 0xFFUL ) - -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000UL ) - -/* The systick is a 24-bit counter. */ -#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) - -/* A fiddle factor to estimate the number of SysTick counts that would have -occurred while the SysTick counter is stopped during tickless idle -calculations. */ -#define portMISSED_COUNTS_FACTOR ( 45UL ) - -/* For strict compliance with the Cortex-M spec the task start address should -have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ -#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) - -/* Let the user override the pre-loading of the initial LR with the address of -prvTaskExitError() in case it messes up unwinding of the stack in the -debugger. */ -#ifdef configTASK_RETURN_ADDRESS - #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS -#else - #define portTASK_RETURN_ADDRESS prvTaskExitError -#endif - -/* - * Setup the timer to generate the tick interrupts. The implementation in this - * file is weak to allow application writers to change the timer used to - * generate the tick interrupt. - */ -void vPortSetupTimerInterrupt( void ); - -/* - * Exception handlers. - */ -void xPortPendSVHandler( void ) __attribute__ (( naked )); -void xPortSysTickHandler( void ); -void vPortSVCHandler( void ) __attribute__ (( naked )); - -/* - * Start first task is a separate function so it can be tested in isolation. - */ -static void prvPortStartFirstTask( void ) __attribute__ (( naked )); - -/* - * Used to catch tasks that attempt to return from their implementing function. - */ -static void prvTaskExitError( void ); - -/*-----------------------------------------------------------*/ - -/* Each task maintains its own interrupt status in the critical nesting -variable. */ -static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; - -/* - * The number of SysTick increments that make up one tick period. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulTimerCountsForOneTick = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * The maximum number of tick periods that can be suppressed is limited by the - * 24 bit resolution of the SysTick timer. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t xMaximumPossibleSuppressedTicks = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Compensate for the CPU cycles that pass while the SysTick is stopped (low - * power functionality only. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulStoppedTimerCompensation = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure - * FreeRTOS API functions are not called from interrupts that have been assigned - * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. - */ -#if( configASSERT_DEFINED == 1 ) - static uint8_t ucMaxSysCallPriority = 0; - static uint32_t ulMaxPRIGROUPValue = 0; - static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; -#endif /* configASSERT_DEFINED */ - -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) -{ - /* Simulate the stack frame as it would be created by a context switch - interrupt. */ - pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ - *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - pxTopOfStack--; - *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - pxTopOfStack--; - *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ - pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -static void prvTaskExitError( void ) -{ -volatile uint32_t ulDummy = 0UL; - - /* A function that implements a task must not exit or attempt to return to - its caller as there is nothing to return to. If a task wants to exit it - should instead call vTaskDelete( NULL ). - - Artificially force an assert() to be triggered if configASSERT() is - defined, then stop here so application writers can catch the error. */ - configASSERT( uxCriticalNesting == ~0UL ); - portDISABLE_INTERRUPTS(); - while( ulDummy == 0 ) - { - /* This file calls prvTaskExitError() after the scheduler has been - started to remove a compiler warning about the function being defined - but never called. ulDummy is used purely to quieten other warnings - about code appearing after this function is called - making ulDummy - volatile makes the compiler think the function could return and - therefore not output an 'unreachable code' warning for code that appears - after it. */ - } -} -/*-----------------------------------------------------------*/ - -void vPortSVCHandler( void ) -{ - __asm volatile ( - " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ - " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ - " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ - " ldmia r0!, {r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ - " msr psp, r0 \n" /* Restore the task stack pointer. */ - " isb \n" - " mov r0, #0 \n" - " msr basepri, r0 \n" - " orr r14, #0xd \n" - " bx r14 \n" - " \n" - " .align 4 \n" - "pxCurrentTCBConst2: .word pxCurrentTCB \n" - ); -} -/*-----------------------------------------------------------*/ - -static void prvPortStartFirstTask( void ) -{ - __asm volatile( - " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ - " ldr r0, [r0] \n" - " ldr r0, [r0] \n" - " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ - " cpsie i \n" /* Globally enable interrupts. */ - " cpsie f \n" - " dsb \n" - " isb \n" - " svc 0 \n" /* System call to start first task. */ - " nop \n" - ); -} -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -BaseType_t xPortStartScheduler( void ) -{ - /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. - See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ - configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); - - #if( configASSERT_DEFINED == 1 ) - { - volatile uint32_t ulOriginalPriority; - volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - volatile uint8_t ucMaxPriorityValue; - - /* Determine the maximum priority from which ISR safe FreeRTOS API - functions can be called. ISR safe functions are those that end in - "FromISR". FreeRTOS maintains separate thread and ISR API functions to - ensure interrupt entry is as fast and simple as possible. - - Save the interrupt priority value that is about to be clobbered. */ - ulOriginalPriority = *pucFirstUserPriorityRegister; - - /* Determine the number of priority bits available. First write to all - possible bits. */ - *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - - /* Read the value back to see how many bits stuck. */ - ucMaxPriorityValue = *pucFirstUserPriorityRegister; - - /* Use the same mask on the maximum system call priority. */ - ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - - /* Calculate the maximum acceptable priority group value for the number - of bits read back. */ - ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - { - ulMaxPRIGROUPValue--; - ucMaxPriorityValue <<= ( uint8_t ) 0x01; - } - - #ifdef __NVIC_PRIO_BITS - { - /* Check the CMSIS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); - } - #endif - - #ifdef configPRIO_BITS - { - /* Check the FreeRTOS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - } - #endif - - /* Shift the priority group value back to its position within the AIRCR - register. */ - ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - - /* Restore the clobbered interrupt priority register to its original - value. */ - *pucFirstUserPriorityRegister = ulOriginalPriority; - } - #endif /* conifgASSERT_DEFINED */ - - /* Make PendSV and SysTick the lowest priority interrupts. */ - portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - - /* Start the timer that generates the tick ISR. Interrupts are disabled - here already. */ - vPortSetupTimerInterrupt(); - - /* Initialise the critical nesting count ready for the first task. */ - uxCriticalNesting = 0; - - /* Start the first task. */ - prvPortStartFirstTask(); - - /* Should never get here as the tasks will now be executing! Call the task - exit error function to prevent compiler warnings about a static function - not being called in the case that the application writer overrides this - functionality by defining configTASK_RETURN_ADDRESS. Call - vTaskSwitchContext() so link time optimisation does not remove the - symbol. */ - vTaskSwitchContext(); - prvTaskExitError(); - - /* Should not get here! */ - return 0; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* Not implemented in ports where there is nothing to return to. - Artificially force an assert. */ - configASSERT( uxCriticalNesting == 1000UL ); -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; - - /* This is not the interrupt safe version of the enter critical function so - assert() if it is being called from an interrupt context. Only API - functions that end in "FromISR" can be used in an interrupt. Only assert if - the critical nesting count is 1 to protect against recursive calls if the - assert function also uses a critical section. */ - if( uxCriticalNesting == 1 ) - { - configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - } -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - configASSERT( uxCriticalNesting ); - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -void xPortPendSVHandler( void ) -{ - /* This is a naked function. */ - - __asm volatile - ( - " mrs r0, psp \n" - " isb \n" - " \n" - " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ - " ldr r2, [r3] \n" - " \n" - " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ - " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ - " \n" - " stmdb sp!, {r3, r14} \n" - " mov r0, %0 \n" - " msr basepri, r0 \n" - " bl vTaskSwitchContext \n" - " mov r0, #0 \n" - " msr basepri, r0 \n" - " ldmia sp!, {r3, r14} \n" - " \n" /* Restore the context, including the critical nesting count. */ - " ldr r1, [r3] \n" - " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ - " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ - " msr psp, r0 \n" - " isb \n" - " bx r14 \n" - " \n" - " .align 4 \n" - "pxCurrentTCBConst: .word pxCurrentTCB \n" - ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) - ); -} -/*-----------------------------------------------------------*/ - -void xPortSysTickHandler( void ) -{ - /* The SysTick runs at the lowest interrupt priority, so when this interrupt - executes all interrupts must be unmasked. There is therefore no need to - save and then restore the interrupt mask value as its value is already - known. */ - portDISABLE_INTERRUPTS(); - { - /* Increment the RTOS tick. */ - if( xTaskIncrementTick() != pdFALSE ) - { - /* A context switch is required. Context switching is performed in - the PendSV interrupt. Pend the PendSV interrupt. */ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - } - } - portENABLE_INTERRUPTS(); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE == 1 ) - - __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) - { - uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; - TickType_t xModifiableIdleTime; - - /* Make sure the SysTick reload value does not overflow the counter. */ - if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) - { - xExpectedIdleTime = xMaximumPossibleSuppressedTicks; - } - - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; - - /* Calculate the reload value required to wait xExpectedIdleTime - tick periods. -1 is used because this code will execute part way - through one of the tick periods. */ - ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); - if( ulReloadValue > ulStoppedTimerCompensation ) - { - ulReloadValue -= ulStoppedTimerCompensation; - } - - /* Enter a critical section but don't use the taskENTER_CRITICAL() - method as that will mask interrupts that should exit sleep mode. */ - __asm volatile( "cpsid i" ::: "memory" ); - __asm volatile( "dsb" ); - __asm volatile( "isb" ); - - /* If a context switch is pending or a task is waiting for the scheduler - to be unsuspended then abandon the low power entry. */ - if( eTaskConfirmSleepModeStatus() == eAbortSleep ) - { - /* Restart from whatever is left in the count register to complete - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Reset the reload register to the value required for normal tick - periods. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Re-enable interrupts - see comments above the cpsid instruction() - above. */ - __asm volatile( "cpsie i" ::: "memory" ); - } - else - { - /* Set the new reload value. */ - portNVIC_SYSTICK_LOAD_REG = ulReloadValue; - - /* Clear the SysTick count flag and set the count value back to - zero. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can - set its parameter to 0 to indicate that its implementation contains - its own wait for interrupt or wait for event instruction, and so wfi - should not be executed again. However, the original expected idle - time variable must remain unmodified, so a copy is taken. */ - xModifiableIdleTime = xExpectedIdleTime; - configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); - if( xModifiableIdleTime > 0 ) - { - __asm volatile( "dsb" ::: "memory" ); - __asm volatile( "wfi" ); - __asm volatile( "isb" ); - } - configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); - - /* Re-enable interrupts to allow the interrupt that brought the MCU - out of sleep mode to execute immediately. see comments above - __disable_interrupt() call above. */ - __asm volatile( "cpsie i" ::: "memory" ); - __asm volatile( "dsb" ); - __asm volatile( "isb" ); - - /* Disable interrupts again because the clock is about to be stopped - and interrupts that execute while the clock is stopped will increase - any slippage between the time maintained by the RTOS and calendar - time. */ - __asm volatile( "cpsid i" ::: "memory" ); - __asm volatile( "dsb" ); - __asm volatile( "isb" ); - - /* Disable the SysTick clock without reading the - portNVIC_SYSTICK_CTRL_REG register to ensure the - portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, - the time the SysTick is stopped for is accounted for as best it can - be, but using the tickless mode will inevitably result in some tiny - drift of the time maintained by the kernel with respect to calendar - time*/ - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); - - /* Determine if the SysTick clock has already counted to zero and - been set back to the current reload value (the reload back being - correct for the entire expected idle time) or if the SysTick is yet - to count to zero (in which case an interrupt other than the SysTick - must have brought the system out of sleep mode). */ - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) - { - uint32_t ulCalculatedLoadValue; - - /* The tick interrupt is already pending, and the SysTick count - reloaded with ulReloadValue. Reset the - portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick - period. */ - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); - - /* Don't allow a tiny value, or values that have somehow - underflowed because the post sleep hook did something - that took too long. */ - if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) - { - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); - } - - portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; - - /* As the pending tick will be processed as soon as this - function exits, the tick value maintained by the tick is stepped - forward by one less than the time spent waiting. */ - ulCompleteTickPeriods = xExpectedIdleTime - 1UL; - } - else - { - /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted rounded to complete tick - periods (not the ulReload value which accounted for part - ticks). */ - ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* How many complete tick periods passed while the processor - was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; - - /* The reload value is set to whatever fraction of a single tick - period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; - } - - /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG - again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - vTaskStepTick( ulCompleteTickPeriods ); - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Exit with interrpts enabled. */ - __asm volatile( "cpsie i" ::: "memory" ); - } - } - -#endif /* configUSE_TICKLESS_IDLE */ -/*-----------------------------------------------------------*/ - -/* - * Setup the systick timer to generate the tick interrupts at the required - * frequency. - */ -__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) -{ - /* Calculate the constants required to configure the tick interrupt. */ - #if( configUSE_TICKLESS_IDLE == 1 ) - { - ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); - xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; - ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); - } - #endif /* configUSE_TICKLESS_IDLE */ - - /* Stop and clear the SysTick. */ - portNVIC_SYSTICK_CTRL_REG = 0UL; - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); -} -/*-----------------------------------------------------------*/ - -#if( configASSERT_DEFINED == 1 ) - - void vPortValidateInterruptPriority( void ) - { - uint32_t ulCurrentInterrupt; - uint8_t ucCurrentPriority; - - /* Obtain the number of the currently executing interrupt. */ - __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" ); - - /* Is the interrupt number a user defined interrupt? */ - if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) - { - /* Look up the interrupt's priority. */ - ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; - - /* The following assertion will fail if a service routine (ISR) for - an interrupt that has been assigned a priority above - configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API - function. ISR safe FreeRTOS API functions must *only* be called - from interrupts that have been assigned a priority at or below - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Numerically low interrupt priority numbers represent logically high - interrupt priorities, therefore the priority of the interrupt must - be set to a value equal to or numerically *higher* than - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Interrupts that use the FreeRTOS API must not be left at their - default priority of zero as that is the highest possible priority, - which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, - and therefore also guaranteed to be invalid. - - FreeRTOS maintains separate thread and ISR API functions to ensure - interrupt entry is as fast and simple as possible. - - The following links provide detailed information: - http://www.freertos.org/RTOS-Cortex-M3-M4.html - http://www.freertos.org/FAQHelp.html */ - configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); - } - - /* Priority grouping: The interrupt controller (NVIC) allows the bits - that define each interrupt's priority to be split between bits that - define the interrupt's pre-emption priority bits and bits that define - the interrupt's sub-priority. For simplicity all bits must be defined - to be pre-emption priority bits. The following assertion will fail if - this is not the case (if some bits represent a sub-priority). - - If the application only uses CMSIS libraries for interrupt - configuration then the correct setting can be achieved on all Cortex-M - devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the - scheduler. Note however that some vendor specific peripheral libraries - assume a non-zero priority group setting, in which cases using a value - of zero will result in unpredictable behaviour. */ - configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); - } - -#endif /* configASSERT_DEFINED */ - - - - - - - - - - - - - - - - - - - - - diff --git a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h b/bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h deleted file mode 100644 index 1f0c43a1b..000000000 --- a/bundles/mesh/inc/os/portable/GCC/ARM_CM3/portmacro.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef PORTMACRO_H -#define PORTMACRO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * Port specific definitions. - * - * The settings in this file configure FreeRTOS correctly for the - * given hardware and compiler. - * - * These settings should not be altered. - *----------------------------------------------------------- - */ - -/* Type definitions. */ -#define portCHAR char -#define portFLOAT float -#define portDOUBLE double -#define portLONG long -#define portSHORT short -#define portSTACK_TYPE uint32_t -#define portBASE_TYPE long - -typedef portSTACK_TYPE StackType_t; -typedef long BaseType_t; -typedef unsigned long UBaseType_t; - -#if( configUSE_16_BIT_TICKS == 1 ) - typedef uint16_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffff -#else - typedef uint32_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffffffffUL - - /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do - not need to be guarded with a critical section. */ - #define portTICK_TYPE_IS_ATOMIC 1 -#endif -/*-----------------------------------------------------------*/ - -/* Architecture specifics. */ -#define portSTACK_GROWTH ( -1 ) -#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) -#define portBYTE_ALIGNMENT 8 -/*-----------------------------------------------------------*/ - -/* Scheduler utilities. */ -#define portYIELD() \ -{ \ - /* Set a PendSV to request a context switch. */ \ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ - \ - /* Barriers are normally not required but do ensure the code is completely \ - within the specified behaviour for the architecture. */ \ - __asm volatile( "dsb" ::: "memory" ); \ - __asm volatile( "isb" ); \ -} - -#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) -#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) -#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() -#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) -/*-----------------------------------------------------------*/ - -/* Critical section management. */ -extern void vPortEnterCritical( void ); -extern void vPortExitCritical( void ); -#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() -#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) -#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() -#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) -#define portENTER_CRITICAL() vPortEnterCritical() -#define portEXIT_CRITICAL() vPortExitCritical() - -/*-----------------------------------------------------------*/ - -/* Task function macros as described on the FreeRTOS.org WEB site. These are -not necessary for to use this port. They are defined so the common demo files -(which build with all the ports) will build. */ -#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) -#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) -/*-----------------------------------------------------------*/ - -/* Tickless idle/low power functionality. */ -#ifndef portSUPPRESS_TICKS_AND_SLEEP - extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); - #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) -#endif -/*-----------------------------------------------------------*/ - -/* Architecture specific optimisations. */ -#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 -#endif - -#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 - - /* Generic helper function. */ - __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) - { - uint8_t ucReturn; - - __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); - return ucReturn; - } - - /* Check the configuration. */ - #if( configMAX_PRIORITIES > 32 ) - #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. - #endif - - /* Store/clear the ready priorities in a bit map. */ - #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) - #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) - - /*-----------------------------------------------------------*/ - - #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) - -#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ - -/*-----------------------------------------------------------*/ - -#ifdef configASSERT - void vPortValidateInterruptPriority( void ); - #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() -#endif - -/* portNOP() is not required by this port. */ -#define portNOP() - -#define portINLINE __inline - -#ifndef portFORCE_INLINE - #define portFORCE_INLINE inline __attribute__(( always_inline)) -#endif - -portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) -{ -uint32_t ulCurrentInterrupt; -BaseType_t xReturn; - - /* Obtain the number of the currently executing interrupt. */ - __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" ); - - if( ulCurrentInterrupt == 0 ) - { - xReturn = pdFALSE; - } - else - { - xReturn = pdTRUE; - } - - return xReturn; -} - -/*-----------------------------------------------------------*/ - -portFORCE_INLINE static void vPortRaiseBASEPRI( void ) -{ -uint32_t ulNewBASEPRI; - - __asm volatile - ( - " mov %0, %1 \n" \ - " msr basepri, %0 \n" \ - " isb \n" \ - " dsb \n" \ - :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" - ); -} - -/*-----------------------------------------------------------*/ - -portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) -{ -uint32_t ulOriginalBASEPRI, ulNewBASEPRI; - - __asm volatile - ( - " mrs %0, basepri \n" \ - " mov %1, %2 \n" \ - " msr basepri, %1 \n" \ - " isb \n" \ - " dsb \n" \ - :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" - ); - - /* This return will not be reached but is necessary to prevent compiler - warnings. */ - return ulOriginalBASEPRI; -} -/*-----------------------------------------------------------*/ - -portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) -{ - __asm volatile - ( - " msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory" - ); -} -/*-----------------------------------------------------------*/ - - -#ifdef __cplusplus -} -#endif - -#endif /* PORTMACRO_H */ - diff --git a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portasm.s b/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portasm.s deleted file mode 100644 index fbc278a65..000000000 --- a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portasm.s +++ /dev/null @@ -1,103 +0,0 @@ -/* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#include - - RSEG CODE:CODE(2) - thumb - - EXTERN pxCurrentTCB - EXTERN vTaskSwitchContext - - PUBLIC xPortPendSVHandler - PUBLIC vPortSVCHandler - PUBLIC vPortStartFirstTask - - - -/*-----------------------------------------------------------*/ - -xPortPendSVHandler: - mrs r0, psp - isb - ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ - ldr r2, [r3] - - stmdb r0!, {r4-r11} /* Save the remaining registers. */ - str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ - - stmdb sp!, {r3, r14} - mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY - msr basepri, r0 - dsb - isb - bl vTaskSwitchContext - mov r0, #0 - msr basepri, r0 - ldmia sp!, {r3, r14} - - ldr r1, [r3] - ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ - ldmia r0!, {r4-r11} /* Pop the registers. */ - msr psp, r0 - isb - bx r14 - - -/*-----------------------------------------------------------*/ - -vPortSVCHandler: - /* Get the location of the current TCB. */ - ldr r3, =pxCurrentTCB - ldr r1, [r3] - ldr r0, [r1] - /* Pop the core registers. */ - ldmia r0!, {r4-r11} - msr psp, r0 - isb - mov r0, #0 - msr basepri, r0 - orr r14, r14, #13 - bx r14 - -/*-----------------------------------------------------------*/ - -vPortStartFirstTask - /* Use the NVIC offset register to locate the stack. */ - ldr r0, =0xE000ED08 - ldr r0, [r0] - ldr r0, [r0] - /* Set the msp back to the start of the stack. */ - msr msp, r0 - /* Call SVC to start the first task, ensuring interrupts are enabled. */ - cpsie i - cpsie f - dsb - isb - svc 0 - - END diff --git a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h b/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h deleted file mode 100644 index 7bffe3e47..000000000 --- a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/portmacro.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef PORTMACRO_H -#define PORTMACRO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * Port specific definitions. - * - * The settings in this file configure FreeRTOS correctly for the - * given hardware and compiler. - * - * These settings should not be altered. - *----------------------------------------------------------- - */ - -/* IAR includes. */ -#include - -/* Type definitions. */ -#define portCHAR char -#define portFLOAT float -#define portDOUBLE double -#define portLONG long -#define portSHORT short -#define portSTACK_TYPE uint32_t -#define portBASE_TYPE long - -typedef portSTACK_TYPE StackType_t; -typedef long BaseType_t; -typedef unsigned long UBaseType_t; - -#if( configUSE_16_BIT_TICKS == 1 ) - typedef uint16_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffff -#else - typedef uint32_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffffffffUL - - /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do - not need to be guarded with a critical section. */ - #define portTICK_TYPE_IS_ATOMIC 1 -#endif -/*-----------------------------------------------------------*/ - -/* Architecture specifics. */ -#define portSTACK_GROWTH ( -1 ) -#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) -#define portBYTE_ALIGNMENT 8 -/*-----------------------------------------------------------*/ - -/* Compiler directives. */ -#define portWEAK_SYMBOL __attribute__( ( weak ) ) - -/*-----------------------------------------------------------*/ - - -/* Scheduler utilities. */ -#define portYIELD() \ -{ \ - /* Set a PendSV to request a context switch. */ \ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ - __DSB(); \ - __ISB(); \ -} - -#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) -#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) -#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() -#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) - -/*-----------------------------------------------------------*/ - -/* Architecture specific optimisations. */ -#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 -#endif - -#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) - - /* Check the configuration. */ - #if( configMAX_PRIORITIES > 32 ) - #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. - #endif - - /* Store/clear the ready priorities in a bit map. */ - #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) - #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) - - /*-----------------------------------------------------------*/ - - #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) - -#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ -/*-----------------------------------------------------------*/ - -/* Critical section management. */ -extern void vPortEnterCritical( void ); -extern void vPortExitCritical( void ); - -#define portDISABLE_INTERRUPTS() \ -{ \ - __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ - __DSB(); \ - __ISB(); \ -} - -#define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) -#define portENTER_CRITICAL() vPortEnterCritical() -#define portEXIT_CRITICAL() vPortExitCritical() -#define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() -#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) __set_BASEPRI( x ) -/*-----------------------------------------------------------*/ - -/* Tickless idle/low power functionality. */ -#ifndef portSUPPRESS_TICKS_AND_SLEEP - extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); - #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) -#endif - -/*-----------------------------------------------------------*/ - -/* Task function macros as described on the FreeRTOS.org WEB site. These are -not necessary for to use this port. They are defined so the common demo files -(which build with all the ports) will build. */ -#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) -#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) -/*-----------------------------------------------------------*/ - -#ifdef configASSERT - void vPortValidateInterruptPriority( void ); - #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() -#endif - -/* portNOP() is not required by this port. */ -#define portNOP() - -/*-----------------------------------------------------------*/ - -/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in -the source code because to do so would cause other compilers to generate -warnings. */ -#pragma diag_suppress=Pe191 -#pragma diag_suppress=Pa082 - -#ifdef __cplusplus -} -#endif - -#endif /* PORTMACRO_H */ - diff --git a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h b/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h deleted file mode 100644 index ffa6654e3..000000000 --- a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/portmacro.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef PORTMACRO_H -#define PORTMACRO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * Port specific definitions. - * - * The settings in this file configure FreeRTOS correctly for the - * given hardware and compiler. - * - * These settings should not be altered. - *----------------------------------------------------------- - */ - -/* Type definitions. */ -#define portCHAR char -#define portFLOAT float -#define portDOUBLE double -#define portLONG long -#define portSHORT short -#define portSTACK_TYPE uint32_t -#define portBASE_TYPE long - -typedef portSTACK_TYPE StackType_t; -typedef long BaseType_t; -typedef unsigned long UBaseType_t; - -#if( configUSE_16_BIT_TICKS == 1 ) - typedef uint16_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffff -#else - typedef uint32_t TickType_t; - #define portMAX_DELAY ( TickType_t ) 0xffffffffUL - - /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do - not need to be guarded with a critical section. */ - #define portTICK_TYPE_IS_ATOMIC 1 -#endif -/*-----------------------------------------------------------*/ - -/* Architecture specifics. */ -#define portSTACK_GROWTH ( -1 ) -#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) -#define portBYTE_ALIGNMENT 8 - -/* Constants used with memory barrier intrinsics. */ -#define portSY_FULL_READ_WRITE ( 15 ) - -/*-----------------------------------------------------------*/ - -/* Scheduler utilities. */ -#define portYIELD() \ -{ \ - /* Set a PendSV to request a context switch. */ \ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ - \ - /* Barriers are normally not required but do ensure the code is completely \ - within the specified behaviour for the architecture. */ \ - __dsb( portSY_FULL_READ_WRITE ); \ - __isb( portSY_FULL_READ_WRITE ); \ -} -/*-----------------------------------------------------------*/ - -#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) -#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) -#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() -#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) -/*-----------------------------------------------------------*/ - -/* Critical section management. */ -extern void vPortEnterCritical( void ); -extern void vPortExitCritical( void ); - -#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() -#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) -#define portENTER_CRITICAL() vPortEnterCritical() -#define portEXIT_CRITICAL() vPortExitCritical() -#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() -#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) - -/*-----------------------------------------------------------*/ - -/* Tickless idle/low power functionality. */ -#ifndef portSUPPRESS_TICKS_AND_SLEEP - extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); - #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) -#endif -/*-----------------------------------------------------------*/ - -/* Port specific optimisations. */ -#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION - #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 -#endif - -#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 - - /* Check the configuration. */ - #if( configMAX_PRIORITIES > 32 ) - #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. - #endif - - /* Store/clear the ready priorities in a bit map. */ - #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) - #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) - - /*-----------------------------------------------------------*/ - - #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) - -#endif /* taskRECORD_READY_PRIORITY */ -/*-----------------------------------------------------------*/ - -/* Task function macros as described on the FreeRTOS.org WEB site. These are -not necessary for to use this port. They are defined so the common demo files -(which build with all the ports) will build. */ -#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) -#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) -/*-----------------------------------------------------------*/ - -#ifdef configASSERT - void vPortValidateInterruptPriority( void ); - #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() -#endif - -/* portNOP() is not required by this port. */ -#define portNOP() - -#define portINLINE __inline - -#ifndef portFORCE_INLINE - #define portFORCE_INLINE __forceinline -#endif - -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) -{ - __asm - { - /* Barrier instructions are not used as this function is only used to - lower the BASEPRI value. */ - msr basepri, ulBASEPRI - } -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE void vPortRaiseBASEPRI( void ) -{ -uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; - - __asm - { - /* Set BASEPRI to the max syscall priority to effect a critical - section. */ - msr basepri, ulNewBASEPRI - dsb - isb - } -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) -{ - __asm - { - /* Set BASEPRI to 0 so no interrupts are masked. This function is only - used to lower the mask in an interrupt, so memory barriers are not - used. */ - msr basepri, #0 - } -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) -{ -uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; - - __asm - { - /* Set BASEPRI to the max syscall priority to effect a critical - section. */ - mrs ulReturn, basepri - msr basepri, ulNewBASEPRI - dsb - isb - } - - return ulReturn; -} -/*-----------------------------------------------------------*/ - -static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) -{ -uint32_t ulCurrentInterrupt; -BaseType_t xReturn; - - /* Obtain the number of the currently executing interrupt. */ - __asm - { - mrs ulCurrentInterrupt, ipsr - } - - if( ulCurrentInterrupt == 0 ) - { - xReturn = pdFALSE; - } - else - { - xReturn = pdTRUE; - } - - return xReturn; -} - - -#ifdef __cplusplus -} -#endif - -#endif /* PORTMACRO_H */ - diff --git a/bundles/mesh/inc/os/projdefs.h b/bundles/mesh/inc/os/projdefs.h deleted file mode 100644 index c8621737b..000000000 --- a/bundles/mesh/inc/os/projdefs.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef PROJDEFS_H -#define PROJDEFS_H - -/* - * Defines the prototype to which task functions must conform. Defined in this - * file to ensure the type is known before portable.h is included. - */ -typedef void (*TaskFunction_t)( void * ); - -/* Converts a time in milliseconds to a time in ticks. This macro can be -overridden by a macro of the same name defined in FreeRTOSConfig.h in case the -definition here is not suitable for your application. */ -#ifndef pdMS_TO_TICKS - #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) -#endif - -#define pdFALSE ( ( BaseType_t ) 0 ) -#define pdTRUE ( ( BaseType_t ) 1 ) - -#define pdPASS ( pdTRUE ) -#define pdFAIL ( pdFALSE ) -#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) -#define errQUEUE_FULL ( ( BaseType_t ) 0 ) - -/* FreeRTOS error definitions. */ -#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) -#define errQUEUE_BLOCKED ( -4 ) -#define errQUEUE_YIELD ( -5 ) - -/* Macros used for basic data corruption checks. */ -#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES - #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 -#endif - -#if( configUSE_16_BIT_TICKS == 1 ) - #define pdINTEGRITY_CHECK_VALUE 0x5a5a -#else - #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL -#endif - -/* The following errno values are used by FreeRTOS+ components, not FreeRTOS -itself. */ -#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ -#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ -#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ -#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ -#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ -#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ -#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ -#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ -#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ -#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ -#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ -#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ -#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ -#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ -#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ -#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ -#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ -#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ -#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ -#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ -#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ -#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ -#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ -#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ -#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ -#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ -#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ -#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ -#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ -#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ -#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ -#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ -#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ -#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ -#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ -#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ -#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ -#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ -#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ - -/* The following endian values are used by FreeRTOS+ components, not FreeRTOS -itself. */ -#define pdFREERTOS_LITTLE_ENDIAN 0 -#define pdFREERTOS_BIG_ENDIAN 1 - -/* Re-defining endian values for generic naming. */ -#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN -#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN - - -#endif /* PROJDEFS_H */ - - - diff --git a/bundles/mesh/inc/os/queue.h b/bundles/mesh/inc/os/queue.h deleted file mode 100644 index 744ab1271..000000000 --- a/bundles/mesh/inc/os/queue.h +++ /dev/null @@ -1,1707 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef QUEUE_H -#define QUEUE_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include queue.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#include "task.h" - -/** - * Type by which queues are referenced. For example, a call to xQueueCreate() - * returns an QueueHandle_t variable that can then be used as a parameter to - * xQueueSend(), xQueueReceive(), etc. - */ -struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ -typedef struct QueueDefinition * QueueHandle_t; - -/** - * Type by which queue sets are referenced. For example, a call to - * xQueueCreateSet() returns an xQueueSet variable that can then be used as a - * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. - */ -typedef struct QueueDefinition * QueueSetHandle_t; - -/** - * Queue sets can contain both queues and semaphores, so the - * QueueSetMemberHandle_t is defined as a type to be used where a parameter or - * return value can be either an QueueHandle_t or an SemaphoreHandle_t. - */ -typedef struct QueueDefinition * QueueSetMemberHandle_t; - -/* For internal use only. */ -#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) -#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) -#define queueOVERWRITE ( ( BaseType_t ) 2 ) - -/* For internal use only. These definitions *must* match those in queue.c. */ -#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) -#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) -#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) -#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) -#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) -#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) - -/** - * queue. h - *
    - QueueHandle_t xQueueCreate(
    -							  UBaseType_t uxQueueLength,
    -							  UBaseType_t uxItemSize
    -						  );
    - * 
    - * - * Creates a new queue instance, and returns a handle by which the new queue - * can be referenced. - * - * Internally, within the FreeRTOS implementation, queues use two blocks of - * memory. The first block is used to hold the queue's data structures. The - * second block is used to hold items placed into the queue. If a queue is - * created using xQueueCreate() then both blocks of memory are automatically - * dynamically allocated inside the xQueueCreate() function. (see - * http://www.freertos.org/a00111.html). If a queue is created using - * xQueueCreateStatic() then the application writer must provide the memory that - * will get used by the queue. xQueueCreateStatic() therefore allows a queue to - * be created without using any dynamic memory allocation. - * - * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html - * - * @param uxQueueLength The maximum number of items that the queue can contain. - * - * @param uxItemSize The number of bytes each item in the queue will require. - * Items are queued by copy, not by reference, so this is the number of bytes - * that will be copied for each posted item. Each item on the queue must be - * the same size. - * - * @return If the queue is successfully create then a handle to the newly - * created queue is returned. If the queue cannot be created then 0 is - * returned. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - };
    -
    - void vATask( void *pvParameters )
    - {
    - QueueHandle_t xQueue1, xQueue2;
    -
    -	// Create a queue capable of containing 10 uint32_t values.
    -	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    -	if( xQueue1 == 0 )
    -	{
    -		// Queue was not created and must not be used.
    -	}
    -
    -	// Create a queue capable of containing 10 pointers to AMessage structures.
    -	// These should be passed by pointer as they contain a lot of data.
    -	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    -	if( xQueue2 == 0 )
    -	{
    -		// Queue was not created and must not be used.
    -	}
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueueCreate xQueueCreate - * \ingroup QueueManagement - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) -#endif - -/** - * queue. h - *
    - QueueHandle_t xQueueCreateStatic(
    -							  UBaseType_t uxQueueLength,
    -							  UBaseType_t uxItemSize,
    -							  uint8_t *pucQueueStorageBuffer,
    -							  StaticQueue_t *pxQueueBuffer
    -						  );
    - * 
    - * - * Creates a new queue instance, and returns a handle by which the new queue - * can be referenced. - * - * Internally, within the FreeRTOS implementation, queues use two blocks of - * memory. The first block is used to hold the queue's data structures. The - * second block is used to hold items placed into the queue. If a queue is - * created using xQueueCreate() then both blocks of memory are automatically - * dynamically allocated inside the xQueueCreate() function. (see - * http://www.freertos.org/a00111.html). If a queue is created using - * xQueueCreateStatic() then the application writer must provide the memory that - * will get used by the queue. xQueueCreateStatic() therefore allows a queue to - * be created without using any dynamic memory allocation. - * - * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html - * - * @param uxQueueLength The maximum number of items that the queue can contain. - * - * @param uxItemSize The number of bytes each item in the queue will require. - * Items are queued by copy, not by reference, so this is the number of bytes - * that will be copied for each posted item. Each item on the queue must be - * the same size. - * - * @param pucQueueStorageBuffer If uxItemSize is not zero then - * pucQueueStorageBuffer must point to a uint8_t array that is at least large - * enough to hold the maximum number of items that can be in the queue at any - * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is - * zero then pucQueueStorageBuffer can be NULL. - * - * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which - * will be used to hold the queue's data structure. - * - * @return If the queue is created then a handle to the created queue is - * returned. If pxQueueBuffer is NULL then NULL is returned. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - };
    -
    - #define QUEUE_LENGTH 10
    - #define ITEM_SIZE sizeof( uint32_t )
    -
    - // xQueueBuffer will hold the queue structure.
    - StaticQueue_t xQueueBuffer;
    -
    - // ucQueueStorage will hold the items posted to the queue.  Must be at least
    - // [(queue length) * ( queue item size)] bytes long.
    - uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
    -
    - void vATask( void *pvParameters )
    - {
    - QueueHandle_t xQueue1;
    -
    -	// Create a queue capable of containing 10 uint32_t values.
    -	xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.
    -							ITEM_SIZE	  // The size of each item in the queue
    -							&( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.
    -							&xQueueBuffer ); // The buffer that will hold the queue structure.
    -
    -	// The queue is guaranteed to be created successfully as no dynamic memory
    -	// allocation is used.  Therefore xQueue1 is now a handle to a valid queue.
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueueCreateStatic xQueueCreateStatic - * \ingroup QueueManagement - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * queue. h - *
    - BaseType_t xQueueSendToToFront(
    -								   QueueHandle_t	xQueue,
    -								   const void		*pvItemToQueue,
    -								   TickType_t		xTicksToWait
    -							   );
    - * 
    - * - * Post an item to the front of a queue. The item is queued by copy, not by - * reference. This function must not be called from an interrupt service - * routine. See xQueueSendFromISR () for an alternative which may be used - * in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the - * queue is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - } xMessage;
    -
    - uint32_t ulVar = 10UL;
    -
    - void vATask( void *pvParameters )
    - {
    - QueueHandle_t xQueue1, xQueue2;
    - struct AMessage *pxMessage;
    -
    -	// Create a queue capable of containing 10 uint32_t values.
    -	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    -
    -	// Create a queue capable of containing 10 pointers to AMessage structures.
    -	// These should be passed by pointer as they contain a lot of data.
    -	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    -
    -	// ...
    -
    -	if( xQueue1 != 0 )
    -	{
    -		// Send an uint32_t.  Wait for 10 ticks for space to become
    -		// available if necessary.
    -		if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    -		{
    -			// Failed to post the message, even after 10 ticks.
    -		}
    -	}
    -
    -	if( xQueue2 != 0 )
    -	{
    -		// Send a pointer to a struct AMessage object.  Don't block if the
    -		// queue is already full.
    -		pxMessage = & xMessage;
    -		xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    -	}
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) - -/** - * queue. h - *
    - BaseType_t xQueueSendToBack(
    -								   QueueHandle_t	xQueue,
    -								   const void		*pvItemToQueue,
    -								   TickType_t		xTicksToWait
    -							   );
    - * 
    - * - * This is a macro that calls xQueueGenericSend(). - * - * Post an item to the back of a queue. The item is queued by copy, not by - * reference. This function must not be called from an interrupt service - * routine. See xQueueSendFromISR () for an alternative which may be used - * in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the queue - * is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - } xMessage;
    -
    - uint32_t ulVar = 10UL;
    -
    - void vATask( void *pvParameters )
    - {
    - QueueHandle_t xQueue1, xQueue2;
    - struct AMessage *pxMessage;
    -
    -	// Create a queue capable of containing 10 uint32_t values.
    -	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    -
    -	// Create a queue capable of containing 10 pointers to AMessage structures.
    -	// These should be passed by pointer as they contain a lot of data.
    -	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    -
    -	// ...
    -
    -	if( xQueue1 != 0 )
    -	{
    -		// Send an uint32_t.  Wait for 10 ticks for space to become
    -		// available if necessary.
    -		if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    -		{
    -			// Failed to post the message, even after 10 ticks.
    -		}
    -	}
    -
    -	if( xQueue2 != 0 )
    -	{
    -		// Send a pointer to a struct AMessage object.  Don't block if the
    -		// queue is already full.
    -		pxMessage = & xMessage;
    -		xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    -	}
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) - -/** - * queue. h - *
    - BaseType_t xQueueSend(
    -							  QueueHandle_t xQueue,
    -							  const void * pvItemToQueue,
    -							  TickType_t xTicksToWait
    -						 );
    - * 
    - * - * This is a macro that calls xQueueGenericSend(). It is included for - * backward compatibility with versions of FreeRTOS.org that did not - * include the xQueueSendToFront() and xQueueSendToBack() macros. It is - * equivalent to xQueueSendToBack(). - * - * Post an item on a queue. The item is queued by copy, not by reference. - * This function must not be called from an interrupt service routine. - * See xQueueSendFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the - * queue is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - } xMessage;
    -
    - uint32_t ulVar = 10UL;
    -
    - void vATask( void *pvParameters )
    - {
    - QueueHandle_t xQueue1, xQueue2;
    - struct AMessage *pxMessage;
    -
    -	// Create a queue capable of containing 10 uint32_t values.
    -	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    -
    -	// Create a queue capable of containing 10 pointers to AMessage structures.
    -	// These should be passed by pointer as they contain a lot of data.
    -	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    -
    -	// ...
    -
    -	if( xQueue1 != 0 )
    -	{
    -		// Send an uint32_t.  Wait for 10 ticks for space to become
    -		// available if necessary.
    -		if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    -		{
    -			// Failed to post the message, even after 10 ticks.
    -		}
    -	}
    -
    -	if( xQueue2 != 0 )
    -	{
    -		// Send a pointer to a struct AMessage object.  Don't block if the
    -		// queue is already full.
    -		pxMessage = & xMessage;
    -		xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    -	}
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) - -/** - * queue. h - *
    - BaseType_t xQueueOverwrite(
    -							  QueueHandle_t xQueue,
    -							  const void * pvItemToQueue
    -						 );
    - * 
    - * - * Only for use with queues that have a length of one - so the queue is either - * empty or full. - * - * Post an item on a queue. If the queue is already full then overwrite the - * value held in the queue. The item is queued by copy, not by reference. - * - * This function must not be called from an interrupt service routine. - * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle of the queue to which the data is being sent. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and - * therefore has the same return values as xQueueSendToFront(). However, pdPASS - * is the only value that can be returned because xQueueOverwrite() will write - * to the queue even when the queue is already full. - * - * Example usage: -
    -
    - void vFunction( void *pvParameters )
    - {
    - QueueHandle_t xQueue;
    - uint32_t ulVarToSend, ulValReceived;
    -
    -	// Create a queue to hold one uint32_t value.  It is strongly
    -	// recommended *not* to use xQueueOverwrite() on queues that can
    -	// contain more than one value, and doing so will trigger an assertion
    -	// if configASSERT() is defined.
    -	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
    -
    -	// Write the value 10 to the queue using xQueueOverwrite().
    -	ulVarToSend = 10;
    -	xQueueOverwrite( xQueue, &ulVarToSend );
    -
    -	// Peeking the queue should now return 10, but leave the value 10 in
    -	// the queue.  A block time of zero is used as it is known that the
    -	// queue holds a value.
    -	ulValReceived = 0;
    -	xQueuePeek( xQueue, &ulValReceived, 0 );
    -
    -	if( ulValReceived != 10 )
    -	{
    -		// Error unless the item was removed by a different task.
    -	}
    -
    -	// The queue is still full.  Use xQueueOverwrite() to overwrite the
    -	// value held in the queue with 100.
    -	ulVarToSend = 100;
    -	xQueueOverwrite( xQueue, &ulVarToSend );
    -
    -	// This time read from the queue, leaving the queue empty once more.
    -	// A block time of 0 is used again.
    -	xQueueReceive( xQueue, &ulValReceived, 0 );
    -
    -	// The value read should be the last value written, even though the
    -	// queue was already full when the value was written.
    -	if( ulValReceived != 100 )
    -	{
    -		// Error!
    -	}
    -
    -	// ...
    -}
    - 
    - * \defgroup xQueueOverwrite xQueueOverwrite - * \ingroup QueueManagement - */ -#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) - - -/** - * queue. h - *
    - BaseType_t xQueueGenericSend(
    -									QueueHandle_t xQueue,
    -									const void * pvItemToQueue,
    -									TickType_t xTicksToWait
    -									BaseType_t xCopyPosition
    -								);
    - * 
    - * - * It is preferred that the macros xQueueSend(), xQueueSendToFront() and - * xQueueSendToBack() are used in place of calling this function directly. - * - * Post an item on a queue. The item is queued by copy, not by reference. - * This function must not be called from an interrupt service routine. - * See xQueueSendFromISR () for an alternative which may be used in an ISR. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for space to become available on the queue, should it already - * be full. The call will return immediately if this is set to 0 and the - * queue is full. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * - * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the - * item at the back of the queue, or queueSEND_TO_FRONT to place the item - * at the front of the queue (for high priority messages). - * - * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - } xMessage;
    -
    - uint32_t ulVar = 10UL;
    -
    - void vATask( void *pvParameters )
    - {
    - QueueHandle_t xQueue1, xQueue2;
    - struct AMessage *pxMessage;
    -
    -	// Create a queue capable of containing 10 uint32_t values.
    -	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    -
    -	// Create a queue capable of containing 10 pointers to AMessage structures.
    -	// These should be passed by pointer as they contain a lot of data.
    -	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    -
    -	// ...
    -
    -	if( xQueue1 != 0 )
    -	{
    -		// Send an uint32_t.  Wait for 10 ticks for space to become
    -		// available if necessary.
    -		if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS )
    -		{
    -			// Failed to post the message, even after 10 ticks.
    -		}
    -	}
    -
    -	if( xQueue2 != 0 )
    -	{
    -		// Send a pointer to a struct AMessage object.  Don't block if the
    -		// queue is already full.
    -		pxMessage = & xMessage;
    -		xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK );
    -	}
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueueSend xQueueSend - * \ingroup QueueManagement - */ -BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
    - BaseType_t xQueuePeek(
    -							 QueueHandle_t xQueue,
    -							 void * const pvBuffer,
    -							 TickType_t xTicksToWait
    -						 );
    - * - * Receive an item from a queue without removing the item from the queue. - * The item is received by copy so a buffer of adequate size must be - * provided. The number of bytes copied into the buffer was defined when - * the queue was created. - * - * Successfully received items remain on the queue so will be returned again - * by the next call, or a call to xQueueReceive(). - * - * This macro must not be used in an interrupt service routine. See - * xQueuePeekFromISR() for an alternative that can be called from an interrupt - * service routine. - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for an item to receive should the queue be empty at the time - * of the call. The time is defined in tick periods so the constant - * portTICK_PERIOD_MS should be used to convert to real time if this is required. - * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue - * is empty. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - } xMessage;
    -
    - QueueHandle_t xQueue;
    -
    - // Task to create a queue and post a value.
    - void vATask( void *pvParameters )
    - {
    - struct AMessage *pxMessage;
    -
    -	// Create a queue capable of containing 10 pointers to AMessage structures.
    -	// These should be passed by pointer as they contain a lot of data.
    -	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    -	if( xQueue == 0 )
    -	{
    -		// Failed to create the queue.
    -	}
    -
    -	// ...
    -
    -	// Send a pointer to a struct AMessage object.  Don't block if the
    -	// queue is already full.
    -	pxMessage = & xMessage;
    -	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    -
    -	// ... Rest of task code.
    - }
    -
    - // Task to peek the data from the queue.
    - void vADifferentTask( void *pvParameters )
    - {
    - struct AMessage *pxRxedMessage;
    -
    -	if( xQueue != 0 )
    -	{
    -		// Peek a message on the created queue.  Block for 10 ticks if a
    -		// message is not immediately available.
    -		if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    -		{
    -			// pcRxedMessage now points to the struct AMessage variable posted
    -			// by vATask, but the item still remains on the queue.
    -		}
    -	}
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueuePeek xQueuePeek - * \ingroup QueueManagement - */ -// BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * queue. h - *
    - BaseType_t xQueuePeekFromISR(
    -									QueueHandle_t xQueue,
    -									void *pvBuffer,
    -								);
    - * - * A version of xQueuePeek() that can be called from an interrupt service - * routine (ISR). - * - * Receive an item from a queue without removing the item from the queue. - * The item is received by copy so a buffer of adequate size must be - * provided. The number of bytes copied into the buffer was defined when - * the queue was created. - * - * Successfully received items remain on the queue so will be returned again - * by the next call, or a call to xQueueReceive(). - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * \defgroup xQueuePeekFromISR xQueuePeekFromISR - * \ingroup QueueManagement - */ -// BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * queue. h - *
    - BaseType_t xQueueReceive(
    -								 QueueHandle_t xQueue,
    -								 void *pvBuffer,
    -								 TickType_t xTicksToWait
    -							);
    - * - * Receive an item from a queue. The item is received by copy so a buffer of - * adequate size must be provided. The number of bytes copied into the buffer - * was defined when the queue was created. - * - * Successfully received items are removed from the queue. - * - * This function must not be used in an interrupt service routine. See - * xQueueReceiveFromISR for an alternative that can. - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param xTicksToWait The maximum amount of time the task should block - * waiting for an item to receive should the queue be empty at the time - * of the call. xQueueReceive() will return immediately if xTicksToWait - * is zero and the queue is empty. The time is defined in tick periods so the - * constant portTICK_PERIOD_MS should be used to convert to real time if this is - * required. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
    - struct AMessage
    - {
    -	char ucMessageID;
    -	char ucData[ 20 ];
    - } xMessage;
    -
    - QueueHandle_t xQueue;
    -
    - // Task to create a queue and post a value.
    - void vATask( void *pvParameters )
    - {
    - struct AMessage *pxMessage;
    -
    -	// Create a queue capable of containing 10 pointers to AMessage structures.
    -	// These should be passed by pointer as they contain a lot of data.
    -	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    -	if( xQueue == 0 )
    -	{
    -		// Failed to create the queue.
    -	}
    -
    -	// ...
    -
    -	// Send a pointer to a struct AMessage object.  Don't block if the
    -	// queue is already full.
    -	pxMessage = & xMessage;
    -	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    -
    -	// ... Rest of task code.
    - }
    -
    - // Task to receive from the queue.
    - void vADifferentTask( void *pvParameters )
    - {
    - struct AMessage *pxRxedMessage;
    -
    -	if( xQueue != 0 )
    -	{
    -		// Receive a message on the created queue.  Block for 10 ticks if a
    -		// message is not immediately available.
    -		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    -		{
    -			// pcRxedMessage now points to the struct AMessage variable posted
    -			// by vATask.
    -		}
    -	}
    -
    -	// ... Rest of task code.
    - }
    - 
    - * \defgroup xQueueReceive xQueueReceive - * \ingroup QueueManagement - */ -BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
    UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
    - * - * Return the number of messages stored in a queue. - * - * @param xQueue A handle to the queue being queried. - * - * @return The number of messages available in the queue. - * - * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting - * \ingroup QueueManagement - */ -// UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * queue. h - *
    UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
    - * - * Return the number of free spaces available in a queue. This is equal to the - * number of items that can be sent to the queue before the queue becomes full - * if no items are removed. - * - * @param xQueue A handle to the queue being queried. - * - * @return The number of spaces available in the queue. - * - * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting - * \ingroup QueueManagement - */ -// UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * queue. h - *
    void vQueueDelete( QueueHandle_t xQueue );
    - * - * Delete a queue - freeing all the memory allocated for storing of items - * placed on the queue. - * - * @param xQueue A handle to the queue to be deleted. - * - * \defgroup vQueueDelete vQueueDelete - * \ingroup QueueManagement - */ -// void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * queue. h - *
    - BaseType_t xQueueSendToFrontFromISR(
    -										 QueueHandle_t xQueue,
    -										 const void *pvItemToQueue,
    -										 BaseType_t *pxHigherPriorityTaskWoken
    -									  );
    - 
    - * - * This is a macro that calls xQueueGenericSendFromISR(). - * - * Post an item to the front of a queue. It is safe to use this macro from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
    - void vBufferISR( void )
    - {
    - char cIn;
    - BaseType_t xHigherPrioritTaskWoken;
    -
    -	// We have not woken a task at the start of the ISR.
    -	xHigherPriorityTaskWoken = pdFALSE;
    -
    -	// Loop until the buffer is empty.
    -	do
    -	{
    -		// Obtain a byte from the buffer.
    -		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    -
    -		// Post the byte.
    -		xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    -
    -	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    -
    -	// Now the buffer is empty we can switch context if necessary.
    -	if( xHigherPriorityTaskWoken )
    -	{
    -		taskYIELD ();
    -	}
    - }
    - 
    - * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) - - -/** - * queue. h - *
    - BaseType_t xQueueSendToBackFromISR(
    -										 QueueHandle_t xQueue,
    -										 const void *pvItemToQueue,
    -										 BaseType_t *pxHigherPriorityTaskWoken
    -									  );
    - 
    - * - * This is a macro that calls xQueueGenericSendFromISR(). - * - * Post an item to the back of a queue. It is safe to use this macro from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
    - void vBufferISR( void )
    - {
    - char cIn;
    - BaseType_t xHigherPriorityTaskWoken;
    -
    -	// We have not woken a task at the start of the ISR.
    -	xHigherPriorityTaskWoken = pdFALSE;
    -
    -	// Loop until the buffer is empty.
    -	do
    -	{
    -		// Obtain a byte from the buffer.
    -		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    -
    -		// Post the byte.
    -		xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    -
    -	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    -
    -	// Now the buffer is empty we can switch context if necessary.
    -	if( xHigherPriorityTaskWoken )
    -	{
    -		taskYIELD ();
    -	}
    - }
    - 
    - * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) - -/** - * queue. h - *
    - BaseType_t xQueueOverwriteFromISR(
    -							  QueueHandle_t xQueue,
    -							  const void * pvItemToQueue,
    -							  BaseType_t *pxHigherPriorityTaskWoken
    -						 );
    - * 
    - * - * A version of xQueueOverwrite() that can be used in an interrupt service - * routine (ISR). - * - * Only for use with queues that can hold a single item - so the queue is either - * empty or full. - * - * Post an item on a queue. If the queue is already full then overwrite the - * value held in the queue. The item is queued by copy, not by reference. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return xQueueOverwriteFromISR() is a macro that calls - * xQueueGenericSendFromISR(), and therefore has the same return values as - * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be - * returned because xQueueOverwriteFromISR() will write to the queue even when - * the queue is already full. - * - * Example usage: -
    -
    - QueueHandle_t xQueue;
    -
    - void vFunction( void *pvParameters )
    - {
    - 	// Create a queue to hold one uint32_t value.  It is strongly
    -	// recommended *not* to use xQueueOverwriteFromISR() on queues that can
    -	// contain more than one value, and doing so will trigger an assertion
    -	// if configASSERT() is defined.
    -	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
    -}
    -
    -void vAnInterruptHandler( void )
    -{
    -// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
    -BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    -uint32_t ulVarToSend, ulValReceived;
    -
    -	// Write the value 10 to the queue using xQueueOverwriteFromISR().
    -	ulVarToSend = 10;
    -	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
    -
    -	// The queue is full, but calling xQueueOverwriteFromISR() again will still
    -	// pass because the value held in the queue will be overwritten with the
    -	// new value.
    -	ulVarToSend = 100;
    -	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
    -
    -	// Reading from the queue will now return 100.
    -
    -	// ...
    -
    -	if( xHigherPrioritytaskWoken == pdTRUE )
    -	{
    -		// Writing to the queue caused a task to unblock and the unblocked task
    -		// has a priority higher than or equal to the priority of the currently
    -		// executing task (the task this interrupt interrupted).  Perform a context
    -		// switch so this interrupt returns directly to the unblocked task.
    -		portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
    -	}
    -}
    - 
    - * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR - * \ingroup QueueManagement - */ -#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) - -/** - * queue. h - *
    - BaseType_t xQueueSendFromISR(
    -									 QueueHandle_t xQueue,
    -									 const void *pvItemToQueue,
    -									 BaseType_t *pxHigherPriorityTaskWoken
    -								);
    - 
    - * - * This is a macro that calls xQueueGenericSendFromISR(). It is included - * for backward compatibility with versions of FreeRTOS.org that did not - * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() - * macros. - * - * Post an item to the back of a queue. It is safe to use this function from - * within an interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueSendFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
    - void vBufferISR( void )
    - {
    - char cIn;
    - BaseType_t xHigherPriorityTaskWoken;
    -
    -	// We have not woken a task at the start of the ISR.
    -	xHigherPriorityTaskWoken = pdFALSE;
    -
    -	// Loop until the buffer is empty.
    -	do
    -	{
    -		// Obtain a byte from the buffer.
    -		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    -
    -		// Post the byte.
    -		xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    -
    -	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    -
    -	// Now the buffer is empty we can switch context if necessary.
    -	if( xHigherPriorityTaskWoken )
    -	{
    -		// Actual macro used here is port specific.
    -		portYIELD_FROM_ISR ();
    -	}
    - }
    - 
    - * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) - -/** - * queue. h - *
    - BaseType_t xQueueGenericSendFromISR(
    -										   QueueHandle_t		xQueue,
    -										   const	void	*pvItemToQueue,
    -										   BaseType_t	*pxHigherPriorityTaskWoken,
    -										   BaseType_t	xCopyPosition
    -									   );
    - 
    - * - * It is preferred that the macros xQueueSendFromISR(), - * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place - * of calling this function directly. xQueueGiveFromISR() is an - * equivalent for use by semaphores that don't actually copy any data. - * - * Post an item on a queue. It is safe to use this function from within an - * interrupt service routine. - * - * Items are queued by copy not reference so it is preferable to only - * queue small items, especially when called from an ISR. In most cases - * it would be preferable to store a pointer to the item being queued. - * - * @param xQueue The handle to the queue on which the item is to be posted. - * - * @param pvItemToQueue A pointer to the item that is to be placed on the - * queue. The size of the items the queue will hold was defined when the - * queue was created, so this many bytes will be copied from pvItemToQueue - * into the queue storage area. - * - * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the - * item at the back of the queue, or queueSEND_TO_FRONT to place the item - * at the front of the queue (for high priority messages). - * - * @return pdTRUE if the data was successfully sent to the queue, otherwise - * errQUEUE_FULL. - * - * Example usage for buffered IO (where the ISR can obtain more than one value - * per call): -
    - void vBufferISR( void )
    - {
    - char cIn;
    - BaseType_t xHigherPriorityTaskWokenByPost;
    -
    -	// We have not woken a task at the start of the ISR.
    -	xHigherPriorityTaskWokenByPost = pdFALSE;
    -
    -	// Loop until the buffer is empty.
    -	do
    -	{
    -		// Obtain a byte from the buffer.
    -		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    -
    -		// Post each byte.
    -		xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
    -
    -	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    -
    -	// Now the buffer is empty we can switch context if necessary.  Note that the
    -	// name of the yield function required is port specific.
    -	if( xHigherPriorityTaskWokenByPost )
    -	{
    -		taskYIELD_YIELD_FROM_ISR();
    -	}
    - }
    - 
    - * - * \defgroup xQueueSendFromISR xQueueSendFromISR - * \ingroup QueueManagement - */ -BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; -BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/** - * queue. h - *
    - BaseType_t xQueueReceiveFromISR(
    -									   QueueHandle_t	xQueue,
    -									   void	*pvBuffer,
    -									   BaseType_t *pxTaskWoken
    -								   );
    - * 
    - * - * Receive an item from a queue. It is safe to use this function from within an - * interrupt service routine. - * - * @param xQueue The handle to the queue from which the item is to be - * received. - * - * @param pvBuffer Pointer to the buffer into which the received item will - * be copied. - * - * @param pxTaskWoken A task may be blocked waiting for space to become - * available on the queue. If xQueueReceiveFromISR causes such a task to - * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will - * remain unchanged. - * - * @return pdTRUE if an item was successfully received from the queue, - * otherwise pdFALSE. - * - * Example usage: -
    -
    - QueueHandle_t xQueue;
    -
    - // Function to create a queue and post some values.
    - void vAFunction( void *pvParameters )
    - {
    - char cValueToPost;
    - const TickType_t xTicksToWait = ( TickType_t )0xff;
    -
    -	// Create a queue capable of containing 10 characters.
    -	xQueue = xQueueCreate( 10, sizeof( char ) );
    -	if( xQueue == 0 )
    -	{
    -		// Failed to create the queue.
    -	}
    -
    -	// ...
    -
    -	// Post some characters that will be used within an ISR.  If the queue
    -	// is full then this task will block for xTicksToWait ticks.
    -	cValueToPost = 'a';
    -	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    -	cValueToPost = 'b';
    -	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    -
    -	// ... keep posting characters ... this task may block when the queue
    -	// becomes full.
    -
    -	cValueToPost = 'c';
    -	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    - }
    -
    - // ISR that outputs all the characters received on the queue.
    - void vISR_Routine( void )
    - {
    - BaseType_t xTaskWokenByReceive = pdFALSE;
    - char cRxedChar;
    -
    -	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
    -	{
    -		// A character was received.  Output the character now.
    -		vOutputCharacter( cRxedChar );
    -
    -		// If removing the character from the queue woke the task that was
    -		// posting onto the queue cTaskWokenByReceive will have been set to
    -		// pdTRUE.  No matter how many times this loop iterates only one
    -		// task will be woken.
    -	}
    -
    -	if( cTaskWokenByPost != ( char ) pdFALSE;
    -	{
    -		taskYIELD ();
    -	}
    - }
    - 
    - * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR - * \ingroup QueueManagement - */ -BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; - -/* - * Utilities to query queues that are safe to use from an ISR. These utilities - * should be used only from witin an ISR, or within a critical section. - */ -BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * The functions defined above are for passing data to and from tasks. The - * functions below are the equivalents for passing data to and from - * co-routines. - * - * These functions are called from the co-routine macro implementation and - * should not be called directly from application code. Instead use the macro - * wrappers defined within croutine.h. - */ -// BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ); -// WARNING: ^^^ this API is not available in this release - -// BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken ); -// WARNING: ^^^ this API is not available in this release - -// BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ); -// WARNING: ^^^ this API is not available in this release - -// BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ); -// WARNING: ^^^ this API is not available in this release - - -/* - * For internal use only. Use xSemaphoreCreateMutex(), - * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling - * these functions directly. - */ -// QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; -// QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * For internal use only. Use xSemaphoreTakeMutexRecursive() or - * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. - */ -// BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Reset a queue back to its original empty state. The return value is now - * obsolete and is always set to pdPASS. - */ -#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) - -/* - * The registry is provided as a means for kernel aware debuggers to - * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add - * a queue, semaphore or mutex handle to the registry if you want the handle - * to be available to a kernel aware debugger. If you are not using a kernel - * aware debugger then this function can be ignored. - * - * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the - * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 - * within FreeRTOSConfig.h for the registry to be available. Its value - * does not effect the number of queues, semaphores and mutexes that can be - * created - just the number that the registry can hold. - * - * @param xQueue The handle of the queue being added to the registry. This - * is the handle returned by a call to xQueueCreate(). Semaphore and mutex - * handles can also be passed in here. - * - * @param pcName The name to be associated with the handle. This is the - * name that the kernel aware debugger will display. The queue registry only - * stores a pointer to the string - so the string must be persistent (global or - * preferably in ROM/Flash), not on the stack. - */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -#endif - -/* - * The registry is provided as a means for kernel aware debuggers to - * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add - * a queue, semaphore or mutex handle to the registry if you want the handle - * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to - * remove the queue, semaphore or mutex from the register. If you are not using - * a kernel aware debugger then this function can be ignored. - * - * @param xQueue The handle of the queue being removed from the registry. - */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -#endif - -/* - * The queue registry is provided as a means for kernel aware debuggers to - * locate queues, semaphores and mutexes. Call pcQueueGetName() to look - * up and return the name of a queue in the queue registry from the queue's - * handle. - * - * @param xQueue The handle of the queue the name of which will be returned. - * @return If the queue is in the registry then a pointer to the name of the - * queue is returned. If the queue is not in the registry then NULL is - * returned. - */ -#if( configQUEUE_REGISTRY_SIZE > 0 ) - const char *pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -#endif - -/* - * Generic version of the function used to creaet a queue using dynamic memory - * allocation. This is called by other functions and macros that create other - * RTOS objects that use the queue structure as their base. - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -#endif - -/* - * Generic version of the function used to creaet a queue using dynamic memory - * allocation. This is called by other functions and macros that create other - * RTOS objects that use the queue structure as their base. - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; -#endif - -/* - * Queue sets provide a mechanism to allow a task to block (pend) on a read - * operation from multiple queues or semaphores simultaneously. - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * A queue set must be explicitly created using a call to xQueueCreateSet() - * before it can be used. Once created, standard FreeRTOS queues and semaphores - * can be added to the set using calls to xQueueAddToSet(). - * xQueueSelectFromSet() is then used to determine which, if any, of the queues - * or semaphores contained in the set is in a state where a queue read or - * semaphore take operation would be successful. - * - * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html - * for reasons why queue sets are very rarely needed in practice as there are - * simpler methods of blocking on multiple objects. - * - * Note 2: Blocking on a queue set that contains a mutex will not cause the - * mutex holder to inherit the priority of the blocked task. - * - * Note 3: An additional 4 bytes of RAM is required for each space in a every - * queue added to a queue set. Therefore counting semaphores that have a high - * maximum count value should not be added to a queue set. - * - * Note 4: A receive (in the case of a queue) or take (in the case of a - * semaphore) operation must not be performed on a member of a queue set unless - * a call to xQueueSelectFromSet() has first returned a handle to that set member. - * - * @param uxEventQueueLength Queue sets store events that occur on - * the queues and semaphores contained in the set. uxEventQueueLength specifies - * the maximum number of events that can be queued at once. To be absolutely - * certain that events are not lost uxEventQueueLength should be set to the - * total sum of the length of the queues added to the set, where binary - * semaphores and mutexes have a length of 1, and counting semaphores have a - * length set by their maximum count value. Examples: - * + If a queue set is to hold a queue of length 5, another queue of length 12, - * and a binary semaphore, then uxEventQueueLength should be set to - * (5 + 12 + 1), or 18. - * + If a queue set is to hold three binary semaphores then uxEventQueueLength - * should be set to (1 + 1 + 1 ), or 3. - * + If a queue set is to hold a counting semaphore that has a maximum count of - * 5, and a counting semaphore that has a maximum count of 3, then - * uxEventQueueLength should be set to (5 + 3), or 8. - * - * @return If the queue set is created successfully then a handle to the created - * queue set is returned. Otherwise NULL is returned. - */ -// QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Adds a queue or semaphore to a queue set that was previously created by a - * call to xQueueCreateSet(). - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * Note 1: A receive (in the case of a queue) or take (in the case of a - * semaphore) operation must not be performed on a member of a queue set unless - * a call to xQueueSelectFromSet() has first returned a handle to that set member. - * - * @param xQueueOrSemaphore The handle of the queue or semaphore being added to - * the queue set (cast to an QueueSetMemberHandle_t type). - * - * @param xQueueSet The handle of the queue set to which the queue or semaphore - * is being added. - * - * @return If the queue or semaphore was successfully added to the queue set - * then pdPASS is returned. If the queue could not be successfully added to the - * queue set because it is already a member of a different queue set then pdFAIL - * is returned. - */ -// BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Removes a queue or semaphore from a queue set. A queue or semaphore can only - * be removed from a set if the queue or semaphore is empty. - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * @param xQueueOrSemaphore The handle of the queue or semaphore being removed - * from the queue set (cast to an QueueSetMemberHandle_t type). - * - * @param xQueueSet The handle of the queue set in which the queue or semaphore - * is included. - * - * @return If the queue or semaphore was successfully removed from the queue set - * then pdPASS is returned. If the queue was not in the queue set, or the - * queue (or semaphore) was not empty, then pdFAIL is returned. - */ -// BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * xQueueSelectFromSet() selects from the members of a queue set a queue or - * semaphore that either contains data (in the case of a queue) or is available - * to take (in the case of a semaphore). xQueueSelectFromSet() effectively - * allows a task to block (pend) on a read operation on all the queues and - * semaphores in a queue set simultaneously. - * - * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this - * function. - * - * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html - * for reasons why queue sets are very rarely needed in practice as there are - * simpler methods of blocking on multiple objects. - * - * Note 2: Blocking on a queue set that contains a mutex will not cause the - * mutex holder to inherit the priority of the blocked task. - * - * Note 3: A receive (in the case of a queue) or take (in the case of a - * semaphore) operation must not be performed on a member of a queue set unless - * a call to xQueueSelectFromSet() has first returned a handle to that set member. - * - * @param xQueueSet The queue set on which the task will (potentially) block. - * - * @param xTicksToWait The maximum time, in ticks, that the calling task will - * remain in the Blocked state (with other tasks executing) to wait for a member - * of the queue set to be ready for a successful queue read or semaphore take - * operation. - * - * @return xQueueSelectFromSet() will return the handle of a queue (cast to - * a QueueSetMemberHandle_t type) contained in the queue set that contains data, - * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained - * in the queue set that is available, or NULL if no such queue or semaphore - * exists before before the specified block time expires. - */ -// QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * A version of xQueueSelectFromSet() that can be used from an ISR. - */ -// QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* Not public API functions. */ -void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; -BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; -// void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -// uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - - -#ifdef __cplusplus -} -#endif - -#endif /* QUEUE_H */ - diff --git a/bundles/mesh/inc/os/semphr.h b/bundles/mesh/inc/os/semphr.h deleted file mode 100644 index 53b158afb..000000000 --- a/bundles/mesh/inc/os/semphr.h +++ /dev/null @@ -1,1140 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#ifndef SEMAPHORE_H -#define SEMAPHORE_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h" must appear in source files before "include semphr.h" -#endif - -#include "queue.h" - -typedef QueueHandle_t SemaphoreHandle_t; - -#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) -#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) -#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) - - -/** - * semphr. h - *
    vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
    - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the - * xSemaphoreCreateBinary() function. Note that binary semaphores created using - * the vSemaphoreCreateBinary() macro are created in a state such that the - * first call to 'take' the semaphore would pass, whereas binary semaphores - * created using xSemaphoreCreateBinary() are created in a state such that the - * the semaphore must first be 'given' before it can be 'taken'. - * - * Macro that implements a semaphore by using the existing queue mechanism. - * The queue length is 1 as this is a binary semaphore. The data size is 0 - * as we don't want to actually store any data - we just want to know if the - * queue is empty or full. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore = NULL;
    -
    - void vATask( void * pvParameters )
    - {
    -    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
    -    // This is a macro so pass the variable in directly.
    -    vSemaphoreCreateBinary( xSemaphore );
    -
    -    if( xSemaphore != NULL )
    -    {
    -        // The semaphore was created successfully.
    -        // The semaphore can now be used.
    -    }
    - }
    - 
    - * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define vSemaphoreCreateBinary( xSemaphore ) \ - { \ - ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ - if( ( xSemaphore ) != NULL ) \ - { \ - ( void ) xSemaphoreGive( ( xSemaphore ) ); \ - } \ - } -#endif - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateBinary( void )
    - * - * Creates a new binary semaphore instance, and returns a handle by which the - * new semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, binary semaphores use a block - * of memory, in which the semaphore structure is stored. If a binary semaphore - * is created using xSemaphoreCreateBinary() then the required memory is - * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore - * is created using xSemaphoreCreateBinaryStatic() then the application writer - * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a - * binary semaphore to be created without using any dynamic memory allocation. - * - * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this - * xSemaphoreCreateBinary() function. Note that binary semaphores created using - * the vSemaphoreCreateBinary() macro are created in a state such that the - * first call to 'take' the semaphore would pass, whereas binary semaphores - * created using xSemaphoreCreateBinary() are created in a state such that the - * the semaphore must first be 'given' before it can be 'taken'. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @return Handle to the created semaphore, or NULL if the memory required to - * hold the semaphore's data structures could not be allocated. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore = NULL;
    -
    - void vATask( void * pvParameters )
    - {
    -    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
    -    // This is a macro so pass the variable in directly.
    -    xSemaphore = xSemaphoreCreateBinary();
    -
    -    if( xSemaphore != NULL )
    -    {
    -        // The semaphore was created successfully.
    -        // The semaphore can now be used.
    -    }
    - }
    - 
    - * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) -#endif - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
    - * - * Creates a new binary semaphore instance, and returns a handle by which the - * new semaphore can be referenced. - * - * NOTE: In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a binary semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, binary semaphores use a block - * of memory, in which the semaphore structure is stored. If a binary semaphore - * is created using xSemaphoreCreateBinary() then the required memory is - * automatically dynamically allocated inside the xSemaphoreCreateBinary() - * function. (see http://www.freertos.org/a00111.html). If a binary semaphore - * is created using xSemaphoreCreateBinaryStatic() then the application writer - * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a - * binary semaphore to be created without using any dynamic memory allocation. - * - * This type of semaphore can be used for pure synchronisation between tasks or - * between an interrupt and a task. The semaphore need not be given back once - * obtained, so one task/interrupt can continuously 'give' the semaphore while - * another continuously 'takes' the semaphore. For this reason this type of - * semaphore does not use a priority inheritance mechanism. For an alternative - * that does use priority inheritance see xSemaphoreCreateMutex(). - * - * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the semaphore's data structure, removing the - * need for the memory to be allocated dynamically. - * - * @return If the semaphore is created then a handle to the created semaphore is - * returned. If pxSemaphoreBuffer is NULL then NULL is returned. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore = NULL;
    - StaticSemaphore_t xSemaphoreBuffer;
    -
    - void vATask( void * pvParameters )
    - {
    -    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
    -    // The semaphore's data structures will be placed in the xSemaphoreBuffer
    -    // variable, the address of which is passed into the function.  The
    -    // function's parameter is not NULL, so the function will not attempt any
    -    // dynamic memory allocation, and therefore the function will not return
    -    // return NULL.
    -    xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
    -
    -    // Rest of task code goes here.
    - }
    - 
    - * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic - * \ingroup Semaphores - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
    xSemaphoreTake(
    - *                   SemaphoreHandle_t xSemaphore,
    - *                   TickType_t xBlockTime
    - *               )
    - * - * Macro to obtain a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). - * - * @param xSemaphore A handle to the semaphore being taken - obtained when - * the semaphore was created. - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_PERIOD_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. A block - * time of portMAX_DELAY can be used to block indefinitely (provided - * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). - * - * @return pdTRUE if the semaphore was obtained. pdFALSE - * if xBlockTime expired without the semaphore becoming available. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore = NULL;
    -
    - // A task that creates a semaphore.
    - void vATask( void * pvParameters )
    - {
    -    // Create the semaphore to guard a shared resource.
    -    xSemaphore = xSemaphoreCreateBinary();
    - }
    -
    - // A task that uses the semaphore.
    - void vAnotherTask( void * pvParameters )
    - {
    -    // ... Do other things.
    -
    -    if( xSemaphore != NULL )
    -    {
    -        // See if we can obtain the semaphore.  If the semaphore is not available
    -        // wait 10 ticks to see if it becomes free.
    -        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
    -        {
    -            // We were able to obtain the semaphore and can now access the
    -            // shared resource.
    -
    -            // ...
    -
    -            // We have finished accessing the shared resource.  Release the
    -            // semaphore.
    -            xSemaphoreGive( xSemaphore );
    -        }
    -        else
    -        {
    -            // We could not obtain the semaphore and can therefore not access
    -            // the shared resource safely.
    -        }
    -    }
    - }
    - 
    - * \defgroup xSemaphoreTake xSemaphoreTake - * \ingroup Semaphores - */ -#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) - -/** - * semphr. h - * xSemaphoreTakeRecursive( - * SemaphoreHandle_t xMutex, - * TickType_t xBlockTime - * ) - * - * Macro to recursively obtain, or 'take', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being obtained. This is the - * handle returned by xSemaphoreCreateRecursiveMutex(); - * - * @param xBlockTime The time in ticks to wait for the semaphore to become - * available. The macro portTICK_PERIOD_MS can be used to convert this to a - * real time. A block time of zero can be used to poll the semaphore. If - * the task already owns the semaphore then xSemaphoreTakeRecursive() will - * return immediately no matter what the value of xBlockTime. - * - * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime - * expired without the semaphore becoming available. - * - * Example usage: -
    - SemaphoreHandle_t xMutex = NULL;
    -
    - // A task that creates a mutex.
    - void vATask( void * pvParameters )
    - {
    -    // Create the mutex to guard a shared resource.
    -    xMutex = xSemaphoreCreateRecursiveMutex();
    - }
    -
    - // A task that uses the mutex.
    - void vAnotherTask( void * pvParameters )
    - {
    -    // ... Do other things.
    -
    -    if( xMutex != NULL )
    -    {
    -        // See if we can obtain the mutex.  If the mutex is not available
    -        // wait 10 ticks to see if it becomes free.
    -        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
    -        {
    -            // We were able to obtain the mutex and can now access the
    -            // shared resource.
    -
    -            // ...
    -            // For some reason due to the nature of the code further calls to
    -            // xSemaphoreTakeRecursive() are made on the same mutex.  In real
    -            // code these would not be just sequential calls as this would make
    -            // no sense.  Instead the calls are likely to be buried inside
    -            // a more complex call structure.
    -            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    -            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    -
    -            // The mutex has now been 'taken' three times, so will not be
    -            // available to another task until it has also been given back
    -            // three times.  Again it is unlikely that real code would have
    -            // these calls sequentially, but instead buried in a more complex
    -            // call structure.  This is just for illustrative purposes.
    -            xSemaphoreGiveRecursive( xMutex );
    -            xSemaphoreGiveRecursive( xMutex );
    -            xSemaphoreGiveRecursive( xMutex );
    -
    -            // Now the mutex can be taken by other tasks.
    -        }
    -        else
    -        {
    -            // We could not obtain the mutex and can therefore not access
    -            // the shared resource safely.
    -        }
    -    }
    - }
    - 
    - * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive - * \ingroup Semaphores - */ -#if( configUSE_RECURSIVE_MUTEXES == 1 ) - #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) -#endif - -/** - * semphr. h - *
    xSemaphoreGive( SemaphoreHandle_t xSemaphore )
    - * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or - * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). - * - * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for - * an alternative which can be used from an ISR. - * - * This macro must also not be used on semaphores created using - * xSemaphoreCreateRecursiveMutex(). - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. - * Semaphores are implemented using queues. An error can occur if there is - * no space on the queue to post a message - indicating that the - * semaphore was not first obtained correctly. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore = NULL;
    -
    - void vATask( void * pvParameters )
    - {
    -    // Create the semaphore to guard a shared resource.
    -    xSemaphore = vSemaphoreCreateBinary();
    -
    -    if( xSemaphore != NULL )
    -    {
    -        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
    -        {
    -            // We would expect this call to fail because we cannot give
    -            // a semaphore without first "taking" it!
    -        }
    -
    -        // Obtain the semaphore - don't block if the semaphore is not
    -        // immediately available.
    -        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
    -        {
    -            // We now have the semaphore and can access the shared resource.
    -
    -            // ...
    -
    -            // We have finished accessing the shared resource so can free the
    -            // semaphore.
    -            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
    -            {
    -                // We would not expect this call to fail because we must have
    -                // obtained the semaphore to get here.
    -            }
    -        }
    -    }
    - }
    - 
    - * \defgroup xSemaphoreGive xSemaphoreGive - * \ingroup Semaphores - */ -#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) - -/** - * semphr. h - *
    xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
    - * - * Macro to recursively release, or 'give', a mutex type semaphore. - * The mutex must have previously been created using a call to - * xSemaphoreCreateRecursiveMutex(); - * - * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this - * macro to be available. - * - * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * @param xMutex A handle to the mutex being released, or 'given'. This is the - * handle returned by xSemaphoreCreateMutex(); - * - * @return pdTRUE if the semaphore was given. - * - * Example usage: -
    - SemaphoreHandle_t xMutex = NULL;
    -
    - // A task that creates a mutex.
    - void vATask( void * pvParameters )
    - {
    -    // Create the mutex to guard a shared resource.
    -    xMutex = xSemaphoreCreateRecursiveMutex();
    - }
    -
    - // A task that uses the mutex.
    - void vAnotherTask( void * pvParameters )
    - {
    -    // ... Do other things.
    -
    -    if( xMutex != NULL )
    -    {
    -        // See if we can obtain the mutex.  If the mutex is not available
    -        // wait 10 ticks to see if it becomes free.
    -        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
    -        {
    -            // We were able to obtain the mutex and can now access the
    -            // shared resource.
    -
    -            // ...
    -            // For some reason due to the nature of the code further calls to
    -			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
    -			// code these would not be just sequential calls as this would make
    -			// no sense.  Instead the calls are likely to be buried inside
    -			// a more complex call structure.
    -            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    -            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    -
    -            // The mutex has now been 'taken' three times, so will not be
    -			// available to another task until it has also been given back
    -			// three times.  Again it is unlikely that real code would have
    -			// these calls sequentially, it would be more likely that the calls
    -			// to xSemaphoreGiveRecursive() would be called as a call stack
    -			// unwound.  This is just for demonstrative purposes.
    -            xSemaphoreGiveRecursive( xMutex );
    -			xSemaphoreGiveRecursive( xMutex );
    -			xSemaphoreGiveRecursive( xMutex );
    -
    -			// Now the mutex can be taken by other tasks.
    -        }
    -        else
    -        {
    -            // We could not obtain the mutex and can therefore not access
    -            // the shared resource safely.
    -        }
    -    }
    - }
    - 
    - * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive - * \ingroup Semaphores - */ -#if( configUSE_RECURSIVE_MUTEXES == 1 ) - #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) -#endif - -/** - * semphr. h - *
    - xSemaphoreGiveFromISR(
    -                          SemaphoreHandle_t xSemaphore,
    -                          BaseType_t *pxHigherPriorityTaskWoken
    -                      )
    - * - * Macro to release a semaphore. The semaphore must have previously been - * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). - * - * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) - * must not be used with this macro. - * - * This macro can be used from an ISR. - * - * @param xSemaphore A handle to the semaphore being released. This is the - * handle returned when the semaphore was created. - * - * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. - * - * Example usage: -
    - \#define LONG_TIME 0xffff
    - \#define TICKS_TO_WAIT	10
    - SemaphoreHandle_t xSemaphore = NULL;
    -
    - // Repetitive task.
    - void vATask( void * pvParameters )
    - {
    -    for( ;; )
    -    {
    -        // We want this task to run every 10 ticks of a timer.  The semaphore
    -        // was created before this task was started.
    -
    -        // Block waiting for the semaphore to become available.
    -        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
    -        {
    -            // It is time to execute.
    -
    -            // ...
    -
    -            // We have finished our task.  Return to the top of the loop where
    -            // we will block on the semaphore until it is time to execute
    -            // again.  Note when using the semaphore for synchronisation with an
    -			// ISR in this manner there is no need to 'give' the semaphore back.
    -        }
    -    }
    - }
    -
    - // Timer ISR
    - void vTimerISR( void * pvParameters )
    - {
    - static uint8_t ucLocalTickCount = 0;
    - static BaseType_t xHigherPriorityTaskWoken;
    -
    -    // A timer tick has occurred.
    -
    -    // ... Do other time functions.
    -
    -    // Is it time for vATask () to run?
    -	xHigherPriorityTaskWoken = pdFALSE;
    -    ucLocalTickCount++;
    -    if( ucLocalTickCount >= TICKS_TO_WAIT )
    -    {
    -        // Unblock the task by releasing the semaphore.
    -        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
    -
    -        // Reset the count so we release the semaphore again in 10 ticks time.
    -        ucLocalTickCount = 0;
    -    }
    -
    -    if( xHigherPriorityTaskWoken != pdFALSE )
    -    {
    -        // We can force a context switch here.  Context switching from an
    -        // ISR uses port specific syntax.  Check the demo task for your port
    -        // to find the syntax required.
    -    }
    - }
    - 
    - * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR - * \ingroup Semaphores - */ -#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) - -/** - * semphr. h - *
    - xSemaphoreTakeFromISR(
    -                          SemaphoreHandle_t xSemaphore,
    -                          BaseType_t *pxHigherPriorityTaskWoken
    -                      )
    - * - * Macro to take a semaphore from an ISR. The semaphore must have - * previously been created with a call to xSemaphoreCreateBinary() or - * xSemaphoreCreateCounting(). - * - * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) - * must not be used with this macro. - * - * This macro can be used from an ISR, however taking a semaphore from an ISR - * is not a common operation. It is likely to only be useful when taking a - * counting semaphore when an interrupt is obtaining an object from a resource - * pool (when the semaphore count indicates the number of resources available). - * - * @param xSemaphore A handle to the semaphore being taken. This is the - * handle returned when the semaphore was created. - * - * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task - * to unblock, and the unblocked task has a priority higher than the currently - * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then - * a context switch should be requested before the interrupt is exited. - * - * @return pdTRUE if the semaphore was successfully taken, otherwise - * pdFALSE - */ -#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateMutex( void )
    - * - * Creates a new mutex type semaphore instance, and returns a handle by which - * the new mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, mutex semaphores use a block - * of memory, in which the mutex structure is stored. If a mutex is created - * using xSemaphoreCreateMutex() then the required memory is automatically - * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using - * xSemaphoreCreateMutexStatic() then the application writer must provided the - * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created - * without using any dynamic memory allocation. - * - * Mutexes created using this function can be accessed using the xSemaphoreTake() - * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and - * xSemaphoreGiveRecursive() macros must not be used. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return If the mutex was successfully created then a handle to the created - * semaphore is returned. If there was not enough heap to allocate the mutex - * data structures then NULL is returned. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore;
    -
    - void vATask( void * pvParameters )
    - {
    -    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
    -    // This is a macro so pass the variable in directly.
    -    xSemaphore = xSemaphoreCreateMutex();
    -
    -    if( xSemaphore != NULL )
    -    {
    -        // The semaphore was created successfully.
    -        // The semaphore can now be used.
    -    }
    - }
    - 
    - * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) -#endif - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer )
    - * - * Creates a new mutex type semaphore instance, and returns a handle by which - * the new mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, mutex semaphores use a block - * of memory, in which the mutex structure is stored. If a mutex is created - * using xSemaphoreCreateMutex() then the required memory is automatically - * dynamically allocated inside the xSemaphoreCreateMutex() function. (see - * http://www.freertos.org/a00111.html). If a mutex is created using - * xSemaphoreCreateMutexStatic() then the application writer must provided the - * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created - * without using any dynamic memory allocation. - * - * Mutexes created using this function can be accessed using the xSemaphoreTake() - * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and - * xSemaphoreGiveRecursive() macros must not be used. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, - * which will be used to hold the mutex's data structure, removing the need for - * the memory to be allocated dynamically. - * - * @return If the mutex was successfully created then a handle to the created - * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore;
    - StaticSemaphore_t xMutexBuffer;
    -
    - void vATask( void * pvParameters )
    - {
    -    // A mutex cannot be used before it has been created.  xMutexBuffer is
    -    // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
    -    // attempted.
    -    xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
    -
    -    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
    -    // so there is no need to check it.
    - }
    - 
    - * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic - * \ingroup Semaphores - */ - #if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
    - * - * Creates a new recursive mutex type semaphore instance, and returns a handle - * by which the new recursive mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, recursive mutexs use a block - * of memory, in which the mutex structure is stored. If a recursive mutex is - * created using xSemaphoreCreateRecursiveMutex() then the required memory is - * automatically dynamically allocated inside the - * xSemaphoreCreateRecursiveMutex() function. (see - * http://www.freertos.org/a00111.html). If a recursive mutex is created using - * xSemaphoreCreateRecursiveMutexStatic() then the application writer must - * provide the memory that will get used by the mutex. - * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to - * be created without using any dynamic memory allocation. - * - * Mutexes created using this macro can be accessed using the - * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The - * xSemaphoreTake() and xSemaphoreGive() macros must not be used. - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @return xSemaphore Handle to the created mutex semaphore. Should be of type - * SemaphoreHandle_t. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore;
    -
    - void vATask( void * pvParameters )
    - {
    -    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
    -    // This is a macro so pass the variable in directly.
    -    xSemaphore = xSemaphoreCreateRecursiveMutex();
    -
    -    if( xSemaphore != NULL )
    -    {
    -        // The semaphore was created successfully.
    -        // The semaphore can now be used.
    -    }
    - }
    - 
    - * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex - * \ingroup Semaphores - */ -#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) -#endif - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer )
    - * - * Creates a new recursive mutex type semaphore instance, and returns a handle - * by which the new recursive mutex can be referenced. - * - * Internally, within the FreeRTOS implementation, recursive mutexs use a block - * of memory, in which the mutex structure is stored. If a recursive mutex is - * created using xSemaphoreCreateRecursiveMutex() then the required memory is - * automatically dynamically allocated inside the - * xSemaphoreCreateRecursiveMutex() function. (see - * http://www.freertos.org/a00111.html). If a recursive mutex is created using - * xSemaphoreCreateRecursiveMutexStatic() then the application writer must - * provide the memory that will get used by the mutex. - * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to - * be created without using any dynamic memory allocation. - * - * Mutexes created using this macro can be accessed using the - * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The - * xSemaphoreTake() and xSemaphoreGive() macros must not be used. - * - * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex - * doesn't become available again until the owner has called - * xSemaphoreGiveRecursive() for each successful 'take' request. For example, - * if a task successfully 'takes' the same mutex 5 times then the mutex will - * not be available to any other task until it has also 'given' the mutex back - * exactly five times. - * - * This type of semaphore uses a priority inheritance mechanism so a task - * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the - * semaphore it is no longer required. - * - * Mutex type semaphores cannot be used from within interrupt service routines. - * - * See xSemaphoreCreateBinary() for an alternative implementation that can be - * used for pure synchronisation (where one task or interrupt always 'gives' the - * semaphore and another always 'takes' the semaphore) and from within interrupt - * service routines. - * - * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the recursive mutex's data structure, - * removing the need for the memory to be allocated dynamically. - * - * @return If the recursive mutex was successfully created then a handle to the - * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is - * returned. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore;
    - StaticSemaphore_t xMutexBuffer;
    -
    - void vATask( void * pvParameters )
    - {
    -    // A recursive semaphore cannot be used before it is created.  Here a
    -    // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
    -    // The address of xMutexBuffer is passed into the function, and will hold
    -    // the mutexes data structures - so no dynamic memory allocation will be
    -    // attempted.
    -    xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
    -
    -    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
    -    // so there is no need to check it.
    - }
    - 
    - * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic - * \ingroup Semaphores - */ -#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) - #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
    - * - * Creates a new counting semaphore instance, and returns a handle by which the - * new counting semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, counting semaphores use a - * block of memory, in which the counting semaphore structure is stored. If a - * counting semaphore is created using xSemaphoreCreateCounting() then the - * required memory is automatically dynamically allocated inside the - * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created - * using xSemaphoreCreateCountingStatic() then the application writer can - * instead optionally provide the memory that will get used by the counting - * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting - * semaphore to be created without using any dynamic memory allocation. - * - * Counting semaphores are typically used for two things: - * - * 1) Counting events. - * - * In this usage scenario an event handler will 'give' a semaphore each time - * an event occurs (incrementing the semaphore count value), and a handler - * task will 'take' a semaphore each time it processes an event - * (decrementing the semaphore count value). The count value is therefore - * the difference between the number of events that have occurred and the - * number that have been processed. In this case it is desirable for the - * initial count value to be zero. - * - * 2) Resource management. - * - * In this usage scenario the count value indicates the number of resources - * available. To obtain control of a resource a task must first obtain a - * semaphore - decrementing the semaphore count value. When the count value - * reaches zero there are no free resources. When a task finishes with the - * resource it 'gives' the semaphore back - incrementing the semaphore count - * value. In this case it is desirable for the initial count value to be - * equal to the maximum count value, indicating that all resources are free. - * - * @param uxMaxCount The maximum count value that can be reached. When the - * semaphore reaches this value it can no longer be 'given'. - * - * @param uxInitialCount The count value assigned to the semaphore when it is - * created. - * - * @return Handle to the created semaphore. Null if the semaphore could not be - * created. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore;
    -
    - void vATask( void * pvParameters )
    - {
    - SemaphoreHandle_t xSemaphore = NULL;
    -
    -    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
    -    // The max value to which the semaphore can count should be 10, and the
    -    // initial value assigned to the count should be 0.
    -    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
    -
    -    if( xSemaphore != NULL )
    -    {
    -        // The semaphore was created successfully.
    -        // The semaphore can now be used.
    -    }
    - }
    - 
    - * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting - * \ingroup Semaphores - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) -#endif - -/** - * semphr. h - *
    SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer )
    - * - * Creates a new counting semaphore instance, and returns a handle by which the - * new counting semaphore can be referenced. - * - * In many usage scenarios it is faster and more memory efficient to use a - * direct to task notification in place of a counting semaphore! - * http://www.freertos.org/RTOS-task-notifications.html - * - * Internally, within the FreeRTOS implementation, counting semaphores use a - * block of memory, in which the counting semaphore structure is stored. If a - * counting semaphore is created using xSemaphoreCreateCounting() then the - * required memory is automatically dynamically allocated inside the - * xSemaphoreCreateCounting() function. (see - * http://www.freertos.org/a00111.html). If a counting semaphore is created - * using xSemaphoreCreateCountingStatic() then the application writer must - * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a - * counting semaphore to be created without using any dynamic memory allocation. - * - * Counting semaphores are typically used for two things: - * - * 1) Counting events. - * - * In this usage scenario an event handler will 'give' a semaphore each time - * an event occurs (incrementing the semaphore count value), and a handler - * task will 'take' a semaphore each time it processes an event - * (decrementing the semaphore count value). The count value is therefore - * the difference between the number of events that have occurred and the - * number that have been processed. In this case it is desirable for the - * initial count value to be zero. - * - * 2) Resource management. - * - * In this usage scenario the count value indicates the number of resources - * available. To obtain control of a resource a task must first obtain a - * semaphore - decrementing the semaphore count value. When the count value - * reaches zero there are no free resources. When a task finishes with the - * resource it 'gives' the semaphore back - incrementing the semaphore count - * value. In this case it is desirable for the initial count value to be - * equal to the maximum count value, indicating that all resources are free. - * - * @param uxMaxCount The maximum count value that can be reached. When the - * semaphore reaches this value it can no longer be 'given'. - * - * @param uxInitialCount The count value assigned to the semaphore when it is - * created. - * - * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, - * which will then be used to hold the semaphore's data structure, removing the - * need for the memory to be allocated dynamically. - * - * @return If the counting semaphore was successfully created then a handle to - * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL - * then NULL is returned. - * - * Example usage: -
    - SemaphoreHandle_t xSemaphore;
    - StaticSemaphore_t xSemaphoreBuffer;
    -
    - void vATask( void * pvParameters )
    - {
    - SemaphoreHandle_t xSemaphore = NULL;
    -
    -    // Counting semaphore cannot be used before they have been created.  Create
    -    // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
    -    // value to which the semaphore can count is 10, and the initial value
    -    // assigned to the count will be 0.  The address of xSemaphoreBuffer is
    -    // passed in and will be used to hold the semaphore structure, so no dynamic
    -    // memory allocation will be used.
    -    xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
    -
    -    // No memory allocation was attempted so xSemaphore cannot be NULL, so there
    -    // is no need to check its value.
    - }
    - 
    - * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic - * \ingroup Semaphores - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * semphr. h - *
    void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
    - * - * Delete a semaphore. This function must be used with care. For example, - * do not delete a mutex type semaphore if the mutex is held by a task. - * - * @param xSemaphore A handle to the semaphore to be deleted. - * - * \defgroup vSemaphoreDelete vSemaphoreDelete - * \ingroup Semaphores - */ -#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) - -/** - * semphr.h - *
    TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
    - * - * If xMutex is indeed a mutex type semaphore, return the current mutex holder. - * If xMutex is not a mutex type semaphore, or the mutex is available (not held - * by a task), return NULL. - * - * Note: This is a good way of determining if the calling task is the mutex - * holder, but not a good way of determining the identity of the mutex holder as - * the holder may change between the function exiting and the returned value - * being tested. - */ -#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) - -/** - * semphr.h - *
    TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );
    - * - * If xMutex is indeed a mutex type semaphore, return the current mutex holder. - * If xMutex is not a mutex type semaphore, or the mutex is available (not held - * by a task), return NULL. - * - */ -#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) - -/** - * semphr.h - *
    UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
    - * - * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns - * its current count value. If the semaphore is a binary semaphore then - * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the - * semaphore is not available. - * - */ -#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) - -#endif /* SEMAPHORE_H */ - - diff --git a/bundles/mesh/inc/os/task.h b/bundles/mesh/inc/os/task.h deleted file mode 100644 index 2f322cace..000000000 --- a/bundles/mesh/inc/os/task.h +++ /dev/null @@ -1,2409 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef INC_TASK_H -#define INC_TASK_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include task.h" -#endif - -#include "list.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * MACROS AND DEFINITIONS - *----------------------------------------------------------*/ - -#define tskKERNEL_VERSION_NUMBER "V10.1.1" -#define tskKERNEL_VERSION_MAJOR 10 -#define tskKERNEL_VERSION_MINOR 1 -#define tskKERNEL_VERSION_BUILD 1 - -/** - * task. h - * - * Type by which tasks are referenced. For example, a call to xTaskCreate - * returns (via a pointer parameter) an TaskHandle_t variable that can then - * be used as a parameter to vTaskDelete to delete the task. - * - * \defgroup TaskHandle_t TaskHandle_t - * \ingroup Tasks - */ -struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -typedef struct tskTaskControlBlock* TaskHandle_t; - -/* - * Defines the prototype to which the application task hook function must - * conform. - */ -typedef BaseType_t (*TaskHookFunction_t)( void * ); - -/* Task states returned by eTaskGetState. */ -typedef enum -{ - eRunning = 0, /* A task is querying the state of itself, so must be running. */ - eReady, /* The task being queried is in a read or pending ready list. */ - eBlocked, /* The task being queried is in the Blocked state. */ - eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ - eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ - eInvalid /* Used as an 'invalid state' value. */ -} eTaskState; - -/* Actions that can be performed when vTaskNotify() is called. */ -typedef enum -{ - eNoAction = 0, /* Notify the task without updating its notify value. */ - eSetBits, /* Set bits in the task's notification value. */ - eIncrement, /* Increment the task's notification value. */ - eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ - eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ -} eNotifyAction; - -/* - * Used internally only. - */ -typedef struct xTIME_OUT -{ - BaseType_t xOverflowCount; - TickType_t xTimeOnEntering; -} TimeOut_t; - -/* - * Defines the memory ranges allocated to the task when an MPU is used. - */ -typedef struct xMEMORY_REGION -{ - void *pvBaseAddress; - uint32_t ulLengthInBytes; - uint32_t ulParameters; -} MemoryRegion_t; - -/* - * Parameters required to create an MPU protected task. - */ -typedef struct xTASK_PARAMETERS -{ - TaskFunction_t pvTaskCode; - const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - uint16_t usStackDepth; - void *pvParameters; - UBaseType_t uxPriority; - StackType_t *puxStackBuffer; - MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; - #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - StaticTask_t * const pxTaskBuffer; - #endif -} TaskParameters_t; - -/* Used with the uxTaskGetSystemState() function to return the state of each task -in the system. */ -typedef struct xTASK_STATUS -{ - TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ - const char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - UBaseType_t xTaskNumber; /* A number unique to the task. */ - eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ - UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ - UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ - uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ - StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */ - configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ -} TaskStatus_t; - -/* Possible return values for eTaskConfirmSleepModeStatus(). */ -typedef enum -{ - eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ - eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ - eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ -} eSleepModeStatus; - -/** - * Defines the priority used by the idle task. This must not be modified. - * - * \ingroup TaskUtils - */ -#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) - -/** - * task. h - * - * Macro for forcing a context switch. - * - * \defgroup taskYIELD taskYIELD - * \ingroup SchedulerControl - */ -#define taskYIELD() portYIELD() - -/** - * task. h - * - * Macro to mark the start of a critical code region. Preemptive context - * switches cannot occur when in a critical region. - * - * NOTE: This may alter the stack (depending on the portable implementation) - * so must be used with care! - * - * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL - * \ingroup SchedulerControl - */ -#define taskENTER_CRITICAL() portENTER_CRITICAL() -#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() - -/** - * task. h - * - * Macro to mark the end of a critical code region. Preemptive context - * switches cannot occur when in a critical region. - * - * NOTE: This may alter the stack (depending on the portable implementation) - * so must be used with care! - * - * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL - * \ingroup SchedulerControl - */ -#define taskEXIT_CRITICAL() portEXIT_CRITICAL() -#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) -/** - * task. h - * - * Macro to disable all maskable interrupts. - * - * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS - * \ingroup SchedulerControl - */ -#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() - -/** - * task. h - * - * Macro to enable microcontroller interrupts. - * - * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS - * \ingroup SchedulerControl - */ -#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() - -/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is -0 to generate more optimal code when configASSERT() is defined as the constant -is used in assert() statements. */ -#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) -#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) -#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) - - -/*----------------------------------------------------------- - * TASK CREATION API - *----------------------------------------------------------*/ - -/** - * task. h - *
    - BaseType_t xTaskCreate(
    -							  TaskFunction_t pvTaskCode,
    -							  const char * const pcName,
    -							  configSTACK_DEPTH_TYPE usStackDepth,
    -							  void *pvParameters,
    -							  UBaseType_t uxPriority,
    -							  TaskHandle_t *pvCreatedTask
    -						  );
    - * - * Create a new task and add it to the list of tasks that are ready to run. - * - * Internally, within the FreeRTOS implementation, tasks use two blocks of - * memory. The first block is used to hold the task's data structures. The - * second block is used by the task as its stack. If a task is created using - * xTaskCreate() then both blocks of memory are automatically dynamically - * allocated inside the xTaskCreate() function. (see - * http://www.freertos.org/a00111.html). If a task is created using - * xTaskCreateStatic() then the application writer must provide the required - * memory. xTaskCreateStatic() therefore allows a task to be created without - * using any dynamic memory allocation. - * - * See xTaskCreateStatic() for a version that does not use any dynamic memory - * allocation. - * - * xTaskCreate() can only be used to create a task that has unrestricted - * access to the entire microcontroller memory map. Systems that include MPU - * support can alternatively create an MPU constrained task using - * xTaskCreateRestricted(). - * - * @param pvTaskCode Pointer to the task entry function. Tasks - * must be implemented to never return (i.e. continuous loop). - * - * @param pcName A descriptive name for the task. This is mainly used to - * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default - * is 16. - * - * @param usStackDepth The size of the task stack specified as the number of - * variables the stack can hold - not the number of bytes. For example, if - * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes - * will be allocated for stack storage. - * - * @param pvParameters Pointer that will be used as the parameter for the task - * being created. - * - * @param uxPriority The priority at which the task should run. Systems that - * include MPU support can optionally create tasks in a privileged (system) - * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For - * example, to create a privileged task at priority 2 the uxPriority parameter - * should be set to ( 2 | portPRIVILEGE_BIT ). - * - * @param pvCreatedTask Used to pass back a handle by which the created task - * can be referenced. - * - * @return pdPASS if the task was successfully created and added to a ready - * list, otherwise an error code defined in the file projdefs.h - * - * Example usage: -
    - // Task to be created.
    - void vTaskCode( void * pvParameters )
    - {
    -	 for( ;; )
    -	 {
    -		 // Task code goes here.
    -	 }
    - }
    -
    - // Function that creates a task.
    - void vOtherFunction( void )
    - {
    - static uint8_t ucParameterToPass;
    - TaskHandle_t xHandle = NULL;
    -
    -	 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
    -	 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
    -	 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
    -	 // the new task attempts to access it.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
    -     configASSERT( xHandle );
    -
    -	 // Use the handle to delete the task.
    -     if( xHandle != NULL )
    -     {
    -	     vTaskDelete( xHandle );
    -     }
    - }
    -   
    - * \defgroup xTaskCreate xTaskCreate - * \ingroup Tasks - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const configSTACK_DEPTH_TYPE usStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; -#endif - -/** - * task. h - *
    - TaskHandle_t xTaskCreateStatic( TaskFunction_t pvTaskCode,
    -								 const char * const pcName,
    -								 uint32_t ulStackDepth,
    -								 void *pvParameters,
    -								 UBaseType_t uxPriority,
    -								 StackType_t *pxStackBuffer,
    -								 StaticTask_t *pxTaskBuffer );
    - * - * Create a new task and add it to the list of tasks that are ready to run. - * - * Internally, within the FreeRTOS implementation, tasks use two blocks of - * memory. The first block is used to hold the task's data structures. The - * second block is used by the task as its stack. If a task is created using - * xTaskCreate() then both blocks of memory are automatically dynamically - * allocated inside the xTaskCreate() function. (see - * http://www.freertos.org/a00111.html). If a task is created using - * xTaskCreateStatic() then the application writer must provide the required - * memory. xTaskCreateStatic() therefore allows a task to be created without - * using any dynamic memory allocation. - * - * @param pvTaskCode Pointer to the task entry function. Tasks - * must be implemented to never return (i.e. continuous loop). - * - * @param pcName A descriptive name for the task. This is mainly used to - * facilitate debugging. The maximum length of the string is defined by - * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. - * - * @param ulStackDepth The size of the task stack specified as the number of - * variables the stack can hold - not the number of bytes. For example, if - * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes - * will be allocated for stack storage. - * - * @param pvParameters Pointer that will be used as the parameter for the task - * being created. - * - * @param uxPriority The priority at which the task will run. - * - * @param pxStackBuffer Must point to a StackType_t array that has at least - * ulStackDepth indexes - the array will then be used as the task's stack, - * removing the need for the stack to be allocated dynamically. - * - * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will - * then be used to hold the task's data structures, removing the need for the - * memory to be allocated dynamically. - * - * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will - * be created and pdPASS is returned. If either pxStackBuffer or pxTaskBuffer - * are NULL then the task will not be created and - * errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY is returned. - * - * Example usage: -
    -
    -    // Dimensions the buffer that the task being created will use as its stack.
    -    // NOTE:  This is the number of words the stack will hold, not the number of
    -    // bytes.  For example, if each stack item is 32-bits, and this is set to 100,
    -    // then 400 bytes (100 * 32-bits) will be allocated.
    -    #define STACK_SIZE 200
    -
    -    // Structure that will hold the TCB of the task being created.
    -    StaticTask_t xTaskBuffer;
    -
    -    // Buffer that the task being created will use as its stack.  Note this is
    -    // an array of StackType_t variables.  The size of StackType_t is dependent on
    -    // the RTOS port.
    -    StackType_t xStack[ STACK_SIZE ];
    -
    -    // Function that implements the task being created.
    -    void vTaskCode( void * pvParameters )
    -    {
    -        // The parameter value is expected to be 1 as 1 is passed in the
    -        // pvParameters value in the call to xTaskCreateStatic().
    -        configASSERT( ( uint32_t ) pvParameters == 1UL );
    -
    -        for( ;; )
    -        {
    -            // Task code goes here.
    -        }
    -    }
    -
    -    // Function that creates a task.
    -    void vOtherFunction( void )
    -    {
    -        TaskHandle_t xHandle = NULL;
    -
    -        // Create the task without using any dynamic memory allocation.
    -        xHandle = xTaskCreateStatic(
    -                      vTaskCode,       // Function that implements the task.
    -                      "NAME",          // Text name for the task.
    -                      STACK_SIZE,      // Stack size in words, not bytes.
    -                      ( void * ) 1,    // Parameter passed into the task.
    -                      tskIDLE_PRIORITY,// Priority at which the task is created.
    -                      xStack,          // Array to use as the task's stack.
    -                      &xTaskBuffer );  // Variable to hold the task's data structure.
    -
    -        // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have
    -        // been created, and xHandle will be the task's handle.  Use the handle
    -        // to suspend the task.
    -        vTaskSuspend( xHandle );
    -    }
    -   
    - * \defgroup xTaskCreateStatic xTaskCreateStatic - * \ingroup Tasks - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) - TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, - const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const uint32_t ulStackDepth, - void * const pvParameters, - UBaseType_t uxPriority, - StackType_t * const puxStackBuffer, - StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * task. h - *
    - BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
    - * - * Only available when configSUPPORT_DYNAMIC_ALLOCATION is set to 1. - * - * xTaskCreateRestricted() should only be used in systems that include an MPU - * implementation. - * - * Create a new task and add it to the list of tasks that are ready to run. - * The function parameters define the memory regions and associated access - * permissions allocated to the task. - * - * See xTaskCreateRestrictedStatic() for a version that does not use any - * dynamic memory allocation. - * - * @param pxTaskDefinition Pointer to a structure that contains a member - * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API - * documentation) plus an optional stack buffer and the memory region - * definitions. - * - * @param pxCreatedTask Used to pass back a handle by which the created task - * can be referenced. - * - * @return pdPASS if the task was successfully created and added to a ready - * list, otherwise an error code defined in the file projdefs.h - * - * Example usage: -
    -// Create an TaskParameters_t structure that defines the task to be created.
    -static const TaskParameters_t xCheckTaskParameters =
    -{
    -	vATask,		// pvTaskCode - the function that implements the task.
    -	"ATask",	// pcName - just a text name for the task to assist debugging.
    -	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
    -	NULL,		// pvParameters - passed into the task function as the function parameters.
    -	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
    -	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
    -
    -	// xRegions - Allocate up to three separate memory regions for access by
    -	// the task, with appropriate access permissions.  Different processors have
    -	// different memory alignment requirements - refer to the FreeRTOS documentation
    -	// for full information.
    -	{
    -		// Base address					Length	Parameters
    -        { cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
    -        { cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
    -        { cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
    -	}
    -};
    -
    -int main( void )
    -{
    -TaskHandle_t xHandle;
    -
    -	// Create a task from the const structure defined above.  The task handle
    -	// is requested (the second parameter is not NULL) but in this case just for
    -	// demonstration purposes as its not actually used.
    -	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
    -
    -	// Start the scheduler.
    -	vTaskStartScheduler();
    -
    -	// Will only get here if there was insufficient memory to create the idle
    -	// and/or timer task.
    -	for( ;; );
    -}
    -   
    - * \defgroup xTaskCreateRestricted xTaskCreateRestricted - * \ingroup Tasks - */ -#if( portUSING_MPU_WRAPPERS == 1 ) - BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; -#endif - -/** - * task. h - *
    - BaseType_t xTaskCreateRestrictedStatic( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
    - * - * Only available when configSUPPORT_STATIC_ALLOCATION is set to 1. - * - * xTaskCreateRestrictedStatic() should only be used in systems that include an - * MPU implementation. - * - * Internally, within the FreeRTOS implementation, tasks use two blocks of - * memory. The first block is used to hold the task's data structures. The - * second block is used by the task as its stack. If a task is created using - * xTaskCreateRestricted() then the stack is provided by the application writer, - * and the memory used to hold the task's data structure is automatically - * dynamically allocated inside the xTaskCreateRestricted() function. If a task - * is created using xTaskCreateRestrictedStatic() then the application writer - * must provide the memory used to hold the task's data structures too. - * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be - * created without using any dynamic memory allocation. - * - * @param pxTaskDefinition Pointer to a structure that contains a member - * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API - * documentation) plus an optional stack buffer and the memory region - * definitions. If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure - * contains an additional member, which is used to point to a variable of type - * StaticTask_t - which is then used to hold the task's data structure. - * - * @param pxCreatedTask Used to pass back a handle by which the created task - * can be referenced. - * - * @return pdPASS if the task was successfully created and added to a ready - * list, otherwise an error code defined in the file projdefs.h - * - * Example usage: -
    -// Create an TaskParameters_t structure that defines the task to be created.
    -// The StaticTask_t variable is only included in the structure when
    -// configSUPPORT_STATIC_ALLOCATION is set to 1.  The PRIVILEGED_DATA macro can
    -// be used to force the variable into the RTOS kernel's privileged data area.
    -static PRIVILEGED_DATA StaticTask_t xTaskBuffer;
    -static const TaskParameters_t xCheckTaskParameters =
    -{
    -	vATask,		// pvTaskCode - the function that implements the task.
    -	"ATask",	// pcName - just a text name for the task to assist debugging.
    -	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
    -	NULL,		// pvParameters - passed into the task function as the function parameters.
    -	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
    -	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
    -
    -	// xRegions - Allocate up to three separate memory regions for access by
    -	// the task, with appropriate access permissions.  Different processors have
    -	// different memory alignment requirements - refer to the FreeRTOS documentation
    -	// for full information.
    -	{
    -		// Base address					Length	Parameters
    -        { cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
    -        { cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
    -        { cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
    -	}
    -
    -	&xTaskBuffer; // Holds the task's data structure.
    -};
    -
    -int main( void )
    -{
    -TaskHandle_t xHandle;
    -
    -	// Create a task from the const structure defined above.  The task handle
    -	// is requested (the second parameter is not NULL) but in this case just for
    -	// demonstration purposes as its not actually used.
    -	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
    -
    -	// Start the scheduler.
    -	vTaskStartScheduler();
    -
    -	// Will only get here if there was insufficient memory to create the idle
    -	// and/or timer task.
    -	for( ;; );
    -}
    -   
    - * \defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic - * \ingroup Tasks - */ -#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) - BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; -#endif - -/** - * task. h - *
    - void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );
    - * - * Memory regions are assigned to a restricted task when the task is created by - * a call to xTaskCreateRestricted(). These regions can be redefined using - * vTaskAllocateMPURegions(). - * - * @param xTask The handle of the task being updated. - * - * @param xRegions A pointer to an MemoryRegion_t structure that contains the - * new memory region definitions. - * - * Example usage: -
    -// Define an array of MemoryRegion_t structures that configures an MPU region
    -// allowing read/write access for 1024 bytes starting at the beginning of the
    -// ucOneKByte array.  The other two of the maximum 3 definable regions are
    -// unused so set to zero.
    -static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =
    -{
    -	// Base address		Length		Parameters
    -	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },
    -	{ 0,				0,			0 },
    -	{ 0,				0,			0 }
    -};
    -
    -void vATask( void *pvParameters )
    -{
    -	// This task was created such that it has access to certain regions of
    -	// memory as defined by the MPU configuration.  At some point it is
    -	// desired that these MPU regions are replaced with that defined in the
    -	// xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()
    -	// for this purpose.  NULL is used as the task handle to indicate that this
    -	// function should modify the MPU regions of the calling task.
    -	vTaskAllocateMPURegions( NULL, xAltRegions );
    -
    -	// Now the task can continue its function, but from this point on can only
    -	// access its stack and the ucOneKByte array (unless any other statically
    -	// defined or shared regions have been declared elsewhere).
    -}
    -   
    - * \defgroup xTaskCreateRestricted xTaskCreateRestricted - * \ingroup Tasks - */ -// void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskDelete( TaskHandle_t xTask );
    - * - * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Remove a task from the RTOS real time kernel's management. The task being - * deleted will be removed from all ready, blocked, suspended and event lists. - * - * NOTE: The idle task is responsible for freeing the kernel allocated - * memory from tasks that have been deleted. It is therefore important that - * the idle task is not starved of microcontroller processing time if your - * application makes any calls to vTaskDelete (). Memory allocated by the - * task code is not automatically freed, and should be freed before the task - * is deleted. - * - * See the demo application file death.c for sample code that utilises - * vTaskDelete (). - * - * @param xTask The handle of the task to be deleted. Passing NULL will - * cause the calling task to be deleted. - * - * Example usage: -
    - void vOtherFunction( void )
    - {
    - TaskHandle_t xHandle;
    -
    -	 // Create the task, storing the handle.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    -
    -	 // Use the handle to delete the task.
    -	 vTaskDelete( xHandle );
    - }
    -   
    - * \defgroup vTaskDelete vTaskDelete - * \ingroup Tasks - */ -// void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/*----------------------------------------------------------- - * TASK CONTROL API - *----------------------------------------------------------*/ - -/** - * task. h - *
    void vTaskDelay( const TickType_t xTicksToDelay );
    - * - * Delay a task for a given number of ticks. The actual time that the - * task remains blocked depends on the tick rate. The constant - * portTICK_PERIOD_MS can be used to calculate real time from the tick - * rate - with the resolution of one tick period. - * - * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * - * vTaskDelay() specifies a time at which the task wishes to unblock relative to - * the time at which vTaskDelay() is called. For example, specifying a block - * period of 100 ticks will cause the task to unblock 100 ticks after - * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method - * of controlling the frequency of a periodic task as the path taken through the - * code, as well as other task and interrupt activity, will effect the frequency - * at which vTaskDelay() gets called and therefore the time at which the task - * next executes. See vTaskDelayUntil() for an alternative API function designed - * to facilitate fixed frequency execution. It does this by specifying an - * absolute time (rather than a relative time) at which the calling task should - * unblock. - * - * @param xTicksToDelay The amount of time, in tick periods, that - * the calling task should block. - * - * Example usage: - - void vTaskFunction( void * pvParameters ) - { - // Block for 500ms. - const TickType_t xDelay = 500 / portTICK_PERIOD_MS; - - for( ;; ) - { - // Simply toggle the LED every 500ms, blocking between each toggle. - vToggleLED(); - vTaskDelay( xDelay ); - } - } - - * \defgroup vTaskDelay vTaskDelay - * \ingroup TaskCtrl - */ -void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
    void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
    - * - * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Delay a task until a specified time. This function can be used by periodic - * tasks to ensure a constant execution frequency. - * - * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will - * cause a task to block for the specified number of ticks from the time vTaskDelay () is - * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed - * execution frequency as the time between a task starting to execute and that task - * calling vTaskDelay () may not be fixed [the task may take a different path though the - * code between calls, or may get interrupted or preempted a different number of times - * each time it executes]. - * - * Whereas vTaskDelay () specifies a wake time relative to the time at which the function - * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to - * unblock. - * - * The constant portTICK_PERIOD_MS can be used to calculate real time from the tick - * rate - with the resolution of one tick period. - * - * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the - * task was last unblocked. The variable must be initialised with the current time - * prior to its first use (see the example below). Following this the variable is - * automatically updated within vTaskDelayUntil (). - * - * @param xTimeIncrement The cycle time period. The task will be unblocked at - * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the - * same xTimeIncrement parameter value will cause the task to execute with - * a fixed interface period. - * - * Example usage: -
    - // Perform an action every 10 ticks.
    - void vTaskFunction( void * pvParameters )
    - {
    - TickType_t xLastWakeTime;
    - const TickType_t xFrequency = 10;
    -
    -	 // Initialise the xLastWakeTime variable with the current time.
    -	 xLastWakeTime = xTaskGetTickCount ();
    -	 for( ;; )
    -	 {
    -		 // Wait for the next cycle.
    -		 vTaskDelayUntil( &xLastWakeTime, xFrequency );
    -
    -		 // Perform action here.
    -	 }
    - }
    -   
    - * \defgroup vTaskDelayUntil vTaskDelayUntil - * \ingroup TaskCtrl - */ -// void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    BaseType_t xTaskAbortDelay( TaskHandle_t xTask );
    - * - * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this - * function to be available. - * - * A task will enter the Blocked state when it is waiting for an event. The - * event it is waiting for can be a temporal event (waiting for a time), such - * as when vTaskDelay() is called, or an event on an object, such as when - * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task - * that is in the Blocked state is used in a call to xTaskAbortDelay() then the - * task will leave the Blocked state, and return from whichever function call - * placed the task into the Blocked state. - * - * @param xTask The handle of the task to remove from the Blocked state. - * - * @return If the task referenced by xTask was not in the Blocked state then - * pdFAIL is returned. Otherwise pdPASS is returned. - * - * \defgroup xTaskAbortDelay xTaskAbortDelay - * \ingroup TaskCtrl - */ -// BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
    - * - * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Obtain the priority of any task. - * - * @param xTask Handle of the task to be queried. Passing a NULL - * handle results in the priority of the calling task being returned. - * - * @return The priority of xTask. - * - * Example usage: -
    - void vAFunction( void )
    - {
    - TaskHandle_t xHandle;
    -
    -	 // Create a task, storing the handle.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    -
    -	 // ...
    -
    -	 // Use the handle to obtain the priority of the created task.
    -	 // It was created with tskIDLE_PRIORITY, but may have changed
    -	 // it itself.
    -	 if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
    -	 {
    -		 // The task has changed it's priority.
    -	 }
    -
    -	 // ...
    -
    -	 // Is our priority higher than the created task?
    -	 if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
    -	 {
    -		 // Our priority (obtained using NULL handle) is higher.
    -	 }
    - }
    -   
    - * \defgroup uxTaskPriorityGet uxTaskPriorityGet - * \ingroup TaskCtrl - */ -// UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );
    - * - * A version of uxTaskPriorityGet() that can be used from an ISR. - */ -// UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    eTaskState eTaskGetState( TaskHandle_t xTask );
    - * - * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Obtain the state of any task. States are encoded by the eTaskState - * enumerated type. - * - * @param xTask Handle of the task to be queried. - * - * @return The state of xTask at the time the function was called. Note the - * state of the task might change between the function being called, and the - * functions return value being tested by the calling task. - */ -// eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
    - * - * configUSE_TRACE_FACILITY must be defined as 1 for this function to be - * available. See the configuration section for more information. - * - * Populates a TaskStatus_t structure with information about a task. - * - * @param xTask Handle of the task being queried. If xTask is NULL then - * information will be returned about the calling task. - * - * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be - * filled with information about the task referenced by the handle passed using - * the xTask parameter. - * - * @xGetFreeStackSpace The TaskStatus_t structure contains a member to report - * the stack high water mark of the task being queried. Calculating the stack - * high water mark takes a relatively long time, and can make the system - * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to - * allow the high water mark checking to be skipped. The high watermark value - * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is - * not set to pdFALSE; - * - * @param eState The TaskStatus_t structure contains a member to report the - * state of the task being queried. Obtaining the task state is not as fast as - * a simple assignment - so the eState parameter is provided to allow the state - * information to be omitted from the TaskStatus_t structure. To obtain state - * information then set eState to eInvalid - otherwise the value passed in - * eState will be reported as the task state in the TaskStatus_t structure. - * - * Example usage: -
    - void vAFunction( void )
    - {
    - TaskHandle_t xHandle;
    - TaskStatus_t xTaskDetails;
    -
    -    // Obtain the handle of a task from its name.
    -    xHandle = xTaskGetHandle( "Task_Name" );
    -
    -    // Check the handle is not NULL.
    -    configASSERT( xHandle );
    -
    -    // Use the handle to obtain further information about the task.
    -    vTaskGetInfo( xHandle,
    -                  &xTaskDetails,
    -                  pdTRUE, // Include the high water mark in xTaskDetails.
    -                  eInvalid ); // Include the task state in xTaskDetails.
    - }
    -   
    - * \defgroup vTaskGetInfo vTaskGetInfo - * \ingroup TaskCtrl - */ -// void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
    - * - * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Set the priority of any task. - * - * A context switch will occur before the function returns if the priority - * being set is higher than the currently executing task. - * - * @param xTask Handle to the task for which the priority is being set. - * Passing a NULL handle results in the priority of the calling task being set. - * - * @param uxNewPriority The priority to which the task will be set. - * - * Example usage: -
    - void vAFunction( void )
    - {
    - TaskHandle_t xHandle;
    -
    -	 // Create a task, storing the handle.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    -
    -	 // ...
    -
    -	 // Use the handle to raise the priority of the created task.
    -	 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
    -
    -	 // ...
    -
    -	 // Use a NULL handle to raise our priority to the same value.
    -	 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
    - }
    -   
    - * \defgroup vTaskPrioritySet vTaskPrioritySet - * \ingroup TaskCtrl - */ -// void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskSuspend( TaskHandle_t xTaskToSuspend );
    - * - * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Suspend any task. When suspended a task will never get any microcontroller - * processing time, no matter what its priority. - * - * Calls to vTaskSuspend are not accumulative - - * i.e. calling vTaskSuspend () twice on the same task still only requires one - * call to vTaskResume () to ready the suspended task. - * - * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL - * handle will cause the calling task to be suspended. - * - * Example usage: -
    - void vAFunction( void )
    - {
    - TaskHandle_t xHandle;
    -
    -	 // Create a task, storing the handle.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    -
    -	 // ...
    -
    -	 // Use the handle to suspend the created task.
    -	 vTaskSuspend( xHandle );
    -
    -	 // ...
    -
    -	 // The created task will not run during this period, unless
    -	 // another task calls vTaskResume( xHandle ).
    -
    -	 //...
    -
    -
    -	 // Suspend ourselves.
    -	 vTaskSuspend( NULL );
    -
    -	 // We cannot get here unless another task calls vTaskResume
    -	 // with our handle as the parameter.
    - }
    -   
    - * \defgroup vTaskSuspend vTaskSuspend - * \ingroup TaskCtrl - */ -// void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskResume( TaskHandle_t xTaskToResume );
    - * - * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. - * See the configuration section for more information. - * - * Resumes a suspended task. - * - * A task that has been suspended by one or more calls to vTaskSuspend () - * will be made available for running again by a single call to - * vTaskResume (). - * - * @param xTaskToResume Handle to the task being readied. - * - * Example usage: -
    - void vAFunction( void )
    - {
    - TaskHandle_t xHandle;
    -
    -	 // Create a task, storing the handle.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    -
    -	 // ...
    -
    -	 // Use the handle to suspend the created task.
    -	 vTaskSuspend( xHandle );
    -
    -	 // ...
    -
    -	 // The created task will not run during this period, unless
    -	 // another task calls vTaskResume( xHandle ).
    -
    -	 //...
    -
    -
    -	 // Resume the suspended task ourselves.
    -	 vTaskResume( xHandle );
    -
    -	 // The created task will once again get microcontroller processing
    -	 // time in accordance with its priority within the system.
    - }
    -   
    - * \defgroup vTaskResume vTaskResume - * \ingroup TaskCtrl - */ -// void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void xTaskResumeFromISR( TaskHandle_t xTaskToResume );
    - * - * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be - * available. See the configuration section for more information. - * - * An implementation of vTaskResume() that can be called from within an ISR. - * - * A task that has been suspended by one or more calls to vTaskSuspend () - * will be made available for running again by a single call to - * xTaskResumeFromISR (). - * - * xTaskResumeFromISR() should not be used to synchronise a task with an - * interrupt if there is a chance that the interrupt could arrive prior to the - * task being suspended - as this can lead to interrupts being missed. Use of a - * semaphore as a synchronisation mechanism would avoid this eventuality. - * - * @param xTaskToResume Handle to the task being readied. - * - * @return pdTRUE if resuming the task should result in a context switch, - * otherwise pdFALSE. This is used by the ISR to determine if a context switch - * may be required following the ISR. - * - * \defgroup vTaskResumeFromISR vTaskResumeFromISR - * \ingroup TaskCtrl - */ -// BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/*----------------------------------------------------------- - * SCHEDULER CONTROL - *----------------------------------------------------------*/ - -/** - * task. h - *
    void vTaskStartScheduler( void );
    - * - * Starts the real time kernel tick processing. After calling the kernel - * has control over which tasks are executed and when. - * - * See the demo application file main.c for an example of creating - * tasks and starting the kernel. - * - * Example usage: -
    - void vAFunction( void )
    - {
    -	 // Create at least one task before starting the kernel.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
    -
    -	 // Start the real time kernel with preemption.
    -	 vTaskStartScheduler ();
    -
    -	 // Will not get here unless a task calls vTaskEndScheduler ()
    - }
    -   
    - * - * \defgroup vTaskStartScheduler vTaskStartScheduler - * \ingroup SchedulerControl - */ -void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
    void vTaskEndScheduler( void );
    - * - * NOTE: At the time of writing only the x86 real mode port, which runs on a PC - * in place of DOS, implements this function. - * - * Stops the real time kernel tick. All created tasks will be automatically - * deleted and multitasking (either preemptive or cooperative) will - * stop. Execution then resumes from the point where vTaskStartScheduler () - * was called, as if vTaskStartScheduler () had just returned. - * - * See the demo application file main. c in the demo/PC directory for an - * example that uses vTaskEndScheduler (). - * - * vTaskEndScheduler () requires an exit function to be defined within the - * portable layer (see vPortEndScheduler () in port. c for the PC port). This - * performs hardware specific operations such as stopping the kernel tick. - * - * vTaskEndScheduler () will cause all of the resources allocated by the - * kernel to be freed - but will not free resources allocated by application - * tasks. - * - * Example usage: -
    - void vTaskCode( void * pvParameters )
    - {
    -	 for( ;; )
    -	 {
    -		 // Task code goes here.
    -
    -		 // At some point we want to end the real time kernel processing
    -		 // so call ...
    -		 vTaskEndScheduler ();
    -	 }
    - }
    -
    - void vAFunction( void )
    - {
    -	 // Create at least one task before starting the kernel.
    -	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
    -
    -	 // Start the real time kernel with preemption.
    -	 vTaskStartScheduler ();
    -
    -	 // Will only get here when the vTaskCode () task has called
    -	 // vTaskEndScheduler ().  When we get here we are back to single task
    -	 // execution.
    - }
    -   
    - * - * \defgroup vTaskEndScheduler vTaskEndScheduler - * \ingroup SchedulerControl - */ -// void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskSuspendAll( void );
    - * - * Suspends the scheduler without disabling interrupts. Context switches will - * not occur while the scheduler is suspended. - * - * After calling vTaskSuspendAll () the calling task will continue to execute - * without risk of being swapped out until a call to xTaskResumeAll () has been - * made. - * - * API functions that have the potential to cause a context switch (for example, - * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler - * is suspended. - * - * Example usage: -
    - void vTask1( void * pvParameters )
    - {
    -	 for( ;; )
    -	 {
    -		 // Task code goes here.
    -
    -		 // ...
    -
    -		 // At some point the task wants to perform a long operation during
    -		 // which it does not want to get swapped out.  It cannot use
    -		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
    -		 // operation may cause interrupts to be missed - including the
    -		 // ticks.
    -
    -		 // Prevent the real time kernel swapping out the task.
    -		 vTaskSuspendAll ();
    -
    -		 // Perform the operation here.  There is no need to use critical
    -		 // sections as we have all the microcontroller processing time.
    -		 // During this time interrupts will still operate and the kernel
    -		 // tick count will be maintained.
    -
    -		 // ...
    -
    -		 // The operation is complete.  Restart the kernel.
    -		 xTaskResumeAll ();
    -	 }
    - }
    -   
    - * \defgroup vTaskSuspendAll vTaskSuspendAll - * \ingroup SchedulerControl - */ -void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
    BaseType_t xTaskResumeAll( void );
    - * - * Resumes scheduler activity after it was suspended by a call to - * vTaskSuspendAll(). - * - * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks - * that were previously suspended by a call to vTaskSuspend(). - * - * @return If resuming the scheduler caused a context switch then pdTRUE is - * returned, otherwise pdFALSE is returned. - * - * Example usage: -
    - void vTask1( void * pvParameters )
    - {
    -	 for( ;; )
    -	 {
    -		 // Task code goes here.
    -
    -		 // ...
    -
    -		 // At some point the task wants to perform a long operation during
    -		 // which it does not want to get swapped out.  It cannot use
    -		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
    -		 // operation may cause interrupts to be missed - including the
    -		 // ticks.
    -
    -		 // Prevent the real time kernel swapping out the task.
    -		 vTaskSuspendAll ();
    -
    -		 // Perform the operation here.  There is no need to use critical
    -		 // sections as we have all the microcontroller processing time.
    -		 // During this time interrupts will still operate and the real
    -		 // time kernel tick count will be maintained.
    -
    -		 // ...
    -
    -		 // The operation is complete.  Restart the kernel.  We want to force
    -		 // a context switch - but there is no point if resuming the scheduler
    -		 // caused a context switch already.
    -		 if( !xTaskResumeAll () )
    -		 {
    -			  taskYIELD ();
    -		 }
    -	 }
    - }
    -   
    - * \defgroup xTaskResumeAll xTaskResumeAll - * \ingroup SchedulerControl - */ -BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; - -/*----------------------------------------------------------- - * TASK UTILITIES - *----------------------------------------------------------*/ - -/** - * task. h - *
    TickType_t xTaskGetTickCount( void );
    - * - * @return The count of ticks since vTaskStartScheduler was called. - * - * \defgroup xTaskGetTickCount xTaskGetTickCount - * \ingroup TaskUtils - */ -TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
    TickType_t xTaskGetTickCountFromISR( void );
    - * - * @return The count of ticks since vTaskStartScheduler was called. - * - * This is a version of xTaskGetTickCount() that is safe to be called from an - * ISR - provided that TickType_t is the natural word size of the - * microcontroller being used or interrupt nesting is either not supported or - * not being used. - * - * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR - * \ingroup TaskUtils - */ -TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; - -/** - * task. h - *
    uint16_t uxTaskGetNumberOfTasks( void );
    - * - * @return The number of tasks that the real time kernel is currently managing. - * This includes all ready, blocked and suspended tasks. A task that - * has been deleted but not yet freed by the idle task will also be - * included in the count. - * - * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks - * \ingroup TaskUtils - */ -// UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    char *pcTaskGetName( TaskHandle_t xTaskToQuery );
    - * - * @return The text (human readable) name of the task referenced by the handle - * xTaskToQuery. A task can query its own name by either passing in its own - * handle, or by setting xTaskToQuery to NULL. - * - * \defgroup pcTaskGetName pcTaskGetName - * \ingroup TaskUtils - */ -// char *pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    TaskHandle_t xTaskGetHandle( const char *pcNameToQuery );
    - * - * NOTE: This function takes a relatively long time to complete and should be - * used sparingly. - * - * @return The handle of the task that has the human readable name pcNameToQuery. - * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle - * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. - * - * \defgroup pcTaskGetHandle pcTaskGetHandle - * \ingroup TaskUtils - */ -// TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -// WARNING: ^^^ this API is not available in this release - - -/** - * task.h - *
    UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
    - * - * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for - * this function to be available. - * - * Returns the high water mark of the stack associated with xTask. That is, - * the minimum free stack space there has been (in words, so on a 32 bit machine - * a value of 1 means 4 bytes) since the task started. The smaller the returned - * number the closer the task has come to overflowing its stack. - * - * @param xTask Handle of the task associated with the stack to be checked. - * Set xTask to NULL to check the stack of the calling task. - * - * @return The smallest amount of free stack space there has been (in words, so - * actual spaces on the stack rather than bytes) since the task referenced by - * xTask was created. - */ -// UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* When using trace macros it is sometimes necessary to include task.h before -FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, -so the following two prototypes will cause a compilation error. This can be -fixed by simply guarding against the inclusion of these two prototypes unless -they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration -constant. */ -#ifdef configUSE_APPLICATION_TASK_TAG - #if configUSE_APPLICATION_TASK_TAG == 1 - /** - * task.h - *
    void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
    - * - * Sets pxHookFunction to be the task hook function used by the task xTask. - * Passing xTask as NULL has the effect of setting the calling tasks hook - * function. - */ - void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; - - /** - * task.h - *
    void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
    - * - * Returns the pxHookFunction value assigned to the task xTask. - */ - TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; - #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ -#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ - -#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) - - /* Each task contains an array of pointers that is dimensioned by the - configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The - kernel does not use the pointers itself, so the application writer can use - the pointers for any purpose they wish. The following two functions are - used to set and query a pointer respectively. */ - void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; - void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; - -#endif - -/** - * task.h - *
    BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
    - * - * Calls the hook function associated with xTask. Passing xTask as NULL has - * the effect of calling the Running tasks (the calling task) hook function. - * - * pvParameter is passed to the hook function for the task to interpret as it - * wants. The return value is the value returned by the task hook function - * registered by the user. - */ -// BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * xTaskGetIdleTaskHandle() is only available if - * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. - * - * Simply returns the handle of the idle task. It is not valid to call - * xTaskGetIdleTaskHandle() before the scheduler has been started. - */ -// TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for - * uxTaskGetSystemState() to be available. - * - * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in - * the system. TaskStatus_t structures contain, among other things, members - * for the task handle, task name, task priority, task state, and total amount - * of run time consumed by the task. See the TaskStatus_t structure - * definition in this file for the full member list. - * - * NOTE: This function is intended for debugging use only as its use results in - * the scheduler remaining suspended for an extended period. - * - * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. - * The array must contain at least one TaskStatus_t structure for each task - * that is under the control of the RTOS. The number of tasks under the control - * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. - * - * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray - * parameter. The size is specified as the number of indexes in the array, or - * the number of TaskStatus_t structures contained in the array, not by the - * number of bytes in the array. - * - * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in - * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the - * total run time (as defined by the run time stats clock, see - * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. - * pulTotalRunTime can be set to NULL to omit the total run time information. - * - * @return The number of TaskStatus_t structures that were populated by - * uxTaskGetSystemState(). This should equal the number returned by the - * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed - * in the uxArraySize parameter was too small. - * - * Example usage: -
    -    // This example demonstrates how a human readable table of run time stats
    -	// information is generated from raw data provided by uxTaskGetSystemState().
    -	// The human readable table is written to pcWriteBuffer
    -	void vTaskGetRunTimeStats( char *pcWriteBuffer )
    -	{
    -	TaskStatus_t *pxTaskStatusArray;
    -	volatile UBaseType_t uxArraySize, x;
    -	uint32_t ulTotalRunTime, ulStatsAsPercentage;
    -
    -		// Make sure the write buffer does not contain a string.
    -		*pcWriteBuffer = 0x00;
    -
    -		// Take a snapshot of the number of tasks in case it changes while this
    -		// function is executing.
    -		uxArraySize = uxTaskGetNumberOfTasks();
    -
    -		// Allocate a TaskStatus_t structure for each task.  An array could be
    -		// allocated statically at compile time.
    -		pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
    -
    -		if( pxTaskStatusArray != NULL )
    -		{
    -			// Generate raw status information about each task.
    -			uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
    -
    -			// For percentage calculations.
    -			ulTotalRunTime /= 100UL;
    -
    -			// Avoid divide by zero errors.
    -			if( ulTotalRunTime > 0 )
    -			{
    -				// For each populated position in the pxTaskStatusArray array,
    -				// format the raw data as human readable ASCII data
    -				for( x = 0; x < uxArraySize; x++ )
    -				{
    -					// What percentage of the total run time has the task used?
    -					// This will always be rounded down to the nearest integer.
    -					// ulTotalRunTimeDiv100 has already been divided by 100.
    -					ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;
    -
    -					if( ulStatsAsPercentage > 0UL )
    -					{
    -						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
    -					}
    -					else
    -					{
    -						// If the percentage is zero here then the task has
    -						// consumed less than 1% of the total run time.
    -						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
    -					}
    -
    -					pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );
    -				}
    -			}
    -
    -			// The array is no longer needed, free the memory it consumes.
    -			vPortFree( pxTaskStatusArray );
    -		}
    -	}
    -	
    - */ -// UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskList( char *pcWriteBuffer );
    - * - * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must - * both be defined as 1 for this function to be available. See the - * configuration section of the FreeRTOS.org website for more information. - * - * NOTE 1: This function will disable interrupts for its duration. It is - * not intended for normal application runtime use but as a debug aid. - * - * Lists all the current tasks, along with their current state and stack - * usage high water mark. - * - * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or - * suspended ('S'). - * - * PLEASE NOTE: - * - * This function is provided for convenience only, and is used by many of the - * demo applications. Do not consider it to be part of the scheduler. - * - * vTaskList() calls uxTaskGetSystemState(), then formats part of the - * uxTaskGetSystemState() output into a human readable table that displays task - * names, states and stack usage. - * - * vTaskList() has a dependency on the sprintf() C library function that might - * bloat the code size, use a lot of stack, and provide different results on - * different platforms. An alternative, tiny, third party, and limited - * functionality implementation of sprintf() is provided in many of the - * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note - * printf-stdarg.c does not provide a full snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() - * directly to get access to raw stats data, rather than indirectly through a - * call to vTaskList(). - * - * @param pcWriteBuffer A buffer into which the above mentioned details - * will be written, in ASCII form. This buffer is assumed to be large - * enough to contain the generated report. Approximately 40 bytes per - * task should be sufficient. - * - * \defgroup vTaskList vTaskList - * \ingroup TaskUtils - */ -// void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    void vTaskGetRunTimeStats( char *pcWriteBuffer );
    - * - * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS - * must both be defined as 1 for this function to be available. The application - * must also then provide definitions for - * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() - * to configure a peripheral timer/counter and return the timers current count - * value respectively. The counter should be at least 10 times the frequency of - * the tick count. - * - * NOTE 1: This function will disable interrupts for its duration. It is - * not intended for normal application runtime use but as a debug aid. - * - * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total - * accumulated execution time being stored for each task. The resolution - * of the accumulated time value depends on the frequency of the timer - * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. - * Calling vTaskGetRunTimeStats() writes the total execution time of each - * task into a buffer, both as an absolute count value and as a percentage - * of the total system execution time. - * - * NOTE 2: - * - * This function is provided for convenience only, and is used by many of the - * demo applications. Do not consider it to be part of the scheduler. - * - * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the - * uxTaskGetSystemState() output into a human readable table that displays the - * amount of time each task has spent in the Running state in both absolute and - * percentage terms. - * - * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function - * that might bloat the code size, use a lot of stack, and provide different - * results on different platforms. An alternative, tiny, third party, and - * limited functionality implementation of sprintf() is provided in many of the - * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note - * printf-stdarg.c does not provide a full snprintf() implementation!). - * - * It is recommended that production systems call uxTaskGetSystemState() directly - * to get access to raw stats data, rather than indirectly through a call to - * vTaskGetRunTimeStats(). - * - * @param pcWriteBuffer A buffer into which the execution times will be - * written, in ASCII form. This buffer is assumed to be large enough to - * contain the generated report. Approximately 40 bytes per task should - * be sufficient. - * - * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats - * \ingroup TaskUtils - */ -// void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
    - * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * A notification sent to a task will remain pending until it is cleared by the - * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was - * already in the Blocked state to wait for a notification when the notification - * arrives then the task will automatically be removed from the Blocked state - * (unblocked) and the notification cleared. - * - * A task can use xTaskNotifyWait() to [optionally] block to wait for a - * notification to be pending, or ulTaskNotifyTake() to [optionally] block - * to wait for its notification value to have a non-zero value. The task does - * not consume any CPU time while it is in the Blocked state. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param xTaskToNotify The handle of the task being notified. The handle to a - * task can be returned from the xTaskCreate() API function used to create the - * task, and the handle of the currently running task can be obtained by calling - * xTaskGetCurrentTaskHandle(). - * - * @param ulValue Data that can be sent with the notification. How the data is - * used depends on the value of the eAction parameter. - * - * @param eAction Specifies how the notification updates the task's notification - * value, if at all. Valid values for eAction are as follows: - * - * eSetBits - - * The task's notification value is bitwise ORed with ulValue. xTaskNofify() - * always returns pdPASS in this case. - * - * eIncrement - - * The task's notification value is incremented. ulValue is not used and - * xTaskNotify() always returns pdPASS in this case. - * - * eSetValueWithOverwrite - - * The task's notification value is set to the value of ulValue, even if the - * task being notified had not yet processed the previous notification (the - * task already had a notification pending). xTaskNotify() always returns - * pdPASS in this case. - * - * eSetValueWithoutOverwrite - - * If the task being notified did not already have a notification pending then - * the task's notification value is set to ulValue and xTaskNotify() will - * return pdPASS. If the task being notified already had a notification - * pending then no action is performed and pdFAIL is returned. - * - * eNoAction - - * The task receives a notification without its notification value being - * updated. ulValue is not used and xTaskNotify() always returns pdPASS in - * this case. - * - * pulPreviousNotificationValue - - * Can be used to pass out the subject task's notification value before any - * bits are modified by the notify function. - * - * @return Dependent on the value of eAction. See the description of the - * eAction parameter. - * - * \defgroup xTaskNotify xTaskNotify - * \ingroup TaskNotifications - */ -// BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -#define xTaskNotify( xTaskToNotify, ulValue, eAction ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL ) -#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) - -/** - * task. h - *
    BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
    - * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * A version of xTaskNotify() that can be used from an interrupt service routine - * (ISR). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * A notification sent to a task will remain pending until it is cleared by the - * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was - * already in the Blocked state to wait for a notification when the notification - * arrives then the task will automatically be removed from the Blocked state - * (unblocked) and the notification cleared. - * - * A task can use xTaskNotifyWait() to [optionally] block to wait for a - * notification to be pending, or ulTaskNotifyTake() to [optionally] block - * to wait for its notification value to have a non-zero value. The task does - * not consume any CPU time while it is in the Blocked state. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param xTaskToNotify The handle of the task being notified. The handle to a - * task can be returned from the xTaskCreate() API function used to create the - * task, and the handle of the currently running task can be obtained by calling - * xTaskGetCurrentTaskHandle(). - * - * @param ulValue Data that can be sent with the notification. How the data is - * used depends on the value of the eAction parameter. - * - * @param eAction Specifies how the notification updates the task's notification - * value, if at all. Valid values for eAction are as follows: - * - * eSetBits - - * The task's notification value is bitwise ORed with ulValue. xTaskNofify() - * always returns pdPASS in this case. - * - * eIncrement - - * The task's notification value is incremented. ulValue is not used and - * xTaskNotify() always returns pdPASS in this case. - * - * eSetValueWithOverwrite - - * The task's notification value is set to the value of ulValue, even if the - * task being notified had not yet processed the previous notification (the - * task already had a notification pending). xTaskNotify() always returns - * pdPASS in this case. - * - * eSetValueWithoutOverwrite - - * If the task being notified did not already have a notification pending then - * the task's notification value is set to ulValue and xTaskNotify() will - * return pdPASS. If the task being notified already had a notification - * pending then no action is performed and pdFAIL is returned. - * - * eNoAction - - * The task receives a notification without its notification value being - * updated. ulValue is not used and xTaskNotify() always returns pdPASS in - * this case. - * - * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set - * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the - * task to which the notification was sent to leave the Blocked state, and the - * unblocked task has a priority higher than the currently running task. If - * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should - * be requested before the interrupt is exited. How a context switch is - * requested from an ISR is dependent on the port - see the documentation page - * for the port in use. - * - * @return Dependent on the value of eAction. See the description of the - * eAction parameter. - * - * \defgroup xTaskNotify xTaskNotify - * \ingroup TaskNotifications - */ -// BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) -#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) - -/** - * task. h - *
    BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );
    - * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * A notification sent to a task will remain pending until it is cleared by the - * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was - * already in the Blocked state to wait for a notification when the notification - * arrives then the task will automatically be removed from the Blocked state - * (unblocked) and the notification cleared. - * - * A task can use xTaskNotifyWait() to [optionally] block to wait for a - * notification to be pending, or ulTaskNotifyTake() to [optionally] block - * to wait for its notification value to have a non-zero value. The task does - * not consume any CPU time while it is in the Blocked state. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value - * will be cleared in the calling task's notification value before the task - * checks to see if any notifications are pending, and optionally blocks if no - * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if - * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have - * the effect of resetting the task's notification value to 0. Setting - * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. - * - * @param ulBitsToClearOnExit If a notification is pending or received before - * the calling task exits the xTaskNotifyWait() function then the task's - * notification value (see the xTaskNotify() API function) is passed out using - * the pulNotificationValue parameter. Then any bits that are set in - * ulBitsToClearOnExit will be cleared in the task's notification value (note - * *pulNotificationValue is set before any bits are cleared). Setting - * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL - * (if limits.h is not included) will have the effect of resetting the task's - * notification value to 0 before the function exits. Setting - * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged - * when the function exits (in which case the value passed out in - * pulNotificationValue will match the task's notification value). - * - * @param pulNotificationValue Used to pass the task's notification value out - * of the function. Note the value passed out will not be effected by the - * clearing of any bits caused by ulBitsToClearOnExit being non-zero. - * - * @param xTicksToWait The maximum amount of time that the task should wait in - * the Blocked state for a notification to be received, should a notification - * not already be pending when xTaskNotifyWait() was called. The task - * will not consume any processing time while it is in the Blocked state. This - * is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be - * used to convert a time specified in milliseconds to a time specified in - * ticks. - * - * @return If a notification was received (including notifications that were - * already pending when xTaskNotifyWait was called) then pdPASS is - * returned. Otherwise pdFAIL is returned. - * - * \defgroup xTaskNotifyWait xTaskNotifyWait - * \ingroup TaskNotifications - */ -// BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
    - * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro - * to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * xTaskNotifyGive() is a helper macro intended for use when task notifications - * are used as light weight and faster binary or counting semaphore equivalents. - * Actual FreeRTOS semaphores are given using the xSemaphoreGive() API function, - * the equivalent action that instead uses a task notification is - * xTaskNotifyGive(). - * - * When task notifications are being used as a binary or counting semaphore - * equivalent then the task being notified should wait for the notification - * using the ulTaskNotificationTake() API function rather than the - * xTaskNotifyWait() API function. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. - * - * @param xTaskToNotify The handle of the task being notified. The handle to a - * task can be returned from the xTaskCreate() API function used to create the - * task, and the handle of the currently running task can be obtained by calling - * xTaskGetCurrentTaskHandle(). - * - * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the - * eAction parameter set to eIncrement - so pdPASS is always returned. - * - * \defgroup xTaskNotifyGive xTaskNotifyGive - * \ingroup TaskNotifications - */ -#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL ) - -/** - * task. h - *
    void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
    - *
    - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro
    - * to be available.
    - *
    - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private
    - * "notification value", which is a 32-bit unsigned integer (uint32_t).
    - *
    - * A version of xTaskNotifyGive() that can be called from an interrupt service
    - * routine (ISR).
    - *
    - * Events can be sent to a task using an intermediary object.  Examples of such
    - * objects are queues, semaphores, mutexes and event groups.  Task notifications
    - * are a method of sending an event directly to a task without the need for such
    - * an intermediary object.
    - *
    - * A notification sent to a task can optionally perform an action, such as
    - * update, overwrite or increment the task's notification value.  In that way
    - * task notifications can be used to send data to a task, or be used as light
    - * weight and fast binary or counting semaphores.
    - *
    - * vTaskNotifyGiveFromISR() is intended for use when task notifications are
    - * used as light weight and faster binary or counting semaphore equivalents.
    - * Actual FreeRTOS semaphores are given from an ISR using the
    - * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses
    - * a task notification is vTaskNotifyGiveFromISR().
    - *
    - * When task notifications are being used as a binary or counting semaphore
    - * equivalent then the task being notified should wait for the notification
    - * using the ulTaskNotificationTake() API function rather than the
    - * xTaskNotifyWait() API function.
    - *
    - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
    - *
    - * @param xTaskToNotify The handle of the task being notified.  The handle to a
    - * task can be returned from the xTaskCreate() API function used to create the
    - * task, and the handle of the currently running task can be obtained by calling
    - * xTaskGetCurrentTaskHandle().
    - *
    - * @param pxHigherPriorityTaskWoken  vTaskNotifyGiveFromISR() will set
    - * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
    - * task to which the notification was sent to leave the Blocked state, and the
    - * unblocked task has a priority higher than the currently running task.  If
    - * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch
    - * should be requested before the interrupt is exited.  How a context switch is
    - * requested from an ISR is dependent on the port - see the documentation page
    - * for the port in use.
    - *
    - * \defgroup xTaskNotifyWait xTaskNotifyWait
    - * \ingroup TaskNotifications
    - */
    -// void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
    -// WARNING: ^^^ this API is not available in this release
    -
    -
    -/**
    - * task. h
    - * 
    uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
    - * - * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this - * function to be available. - * - * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private - * "notification value", which is a 32-bit unsigned integer (uint32_t). - * - * Events can be sent to a task using an intermediary object. Examples of such - * objects are queues, semaphores, mutexes and event groups. Task notifications - * are a method of sending an event directly to a task without the need for such - * an intermediary object. - * - * A notification sent to a task can optionally perform an action, such as - * update, overwrite or increment the task's notification value. In that way - * task notifications can be used to send data to a task, or be used as light - * weight and fast binary or counting semaphores. - * - * ulTaskNotifyTake() is intended for use when a task notification is used as a - * faster and lighter weight binary or counting semaphore alternative. Actual - * FreeRTOS semaphores are taken using the xSemaphoreTake() API function, the - * equivalent action that instead uses a task notification is - * ulTaskNotifyTake(). - * - * When a task is using its notification value as a binary or counting semaphore - * other tasks should send notifications to it using the xTaskNotifyGive() - * macro, or xTaskNotify() function with the eAction parameter set to - * eIncrement. - * - * ulTaskNotifyTake() can either clear the task's notification value to - * zero on exit, in which case the notification value acts like a binary - * semaphore, or decrement the task's notification value on exit, in which case - * the notification value acts like a counting semaphore. - * - * A task can use ulTaskNotifyTake() to [optionally] block to wait for a - * the task's notification value to be non-zero. The task does not consume any - * CPU time while it is in the Blocked state. - * - * Where as xTaskNotifyWait() will return when a notification is pending, - * ulTaskNotifyTake() will return when the task's notification value is - * not zero. - * - * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. - * - * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's - * notification value is decremented when the function exits. In this way the - * notification value acts like a counting semaphore. If xClearCountOnExit is - * not pdFALSE then the task's notification value is cleared to zero when the - * function exits. In this way the notification value acts like a binary - * semaphore. - * - * @param xTicksToWait The maximum amount of time that the task should wait in - * the Blocked state for the task's notification value to be greater than zero, - * should the count not already be greater than zero when - * ulTaskNotifyTake() was called. The task will not consume any processing - * time while it is in the Blocked state. This is specified in kernel ticks, - * the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time - * specified in milliseconds to a time specified in ticks. - * - * @return The task's notification count before it is either cleared to zero or - * decremented (see the xClearCountOnExit parameter). - * - * \defgroup ulTaskNotifyTake ulTaskNotifyTake - * \ingroup TaskNotifications - */ -// uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * task. h - *
    BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
    - * - * If the notification state of the task referenced by the handle xTask is - * eNotified, then set the task's notification state to eNotWaitingNotification. - * The task's notification value is not altered. Set xTask to NULL to clear the - * notification state of the calling task. - * - * @return pdTRUE if the task's notification state was set to - * eNotWaitingNotification, otherwise pdFALSE. - * \defgroup xTaskNotifyStateClear xTaskNotifyStateClear - * \ingroup TaskNotifications - */ -// BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); -// WARNING: ^^^ this API is not available in this release - - -/*----------------------------------------------------------- - * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES - *----------------------------------------------------------*/ - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY - * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS - * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * Called from the real time kernel tick (either preemptive or cooperative), - * this increments the tick count and checks if any tasks that are blocked - * for a finite period required removing from a blocked list and placing on - * a ready list. If a non-zero value is returned then a context switch is - * required because either: - * + A task was removed from a blocked list because its timeout had expired, - * or - * + Time slicing is in use and there is a task of equal priority to the - * currently running task. - */ -BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * Removes the calling task from the ready list and places it both - * on the list of tasks waiting for a particular event, and the - * list of delayed tasks. The task will be removed from both lists - * and replaced on the ready list should either the event occur (and - * there be no higher priority tasks waiting on the same event) or - * the delay period expires. - * - * The 'unordered' version replaces the event list item value with the - * xItemValue value, and inserts the list item at the end of the list. - * - * The 'ordered' version uses the existing event list item value (which is the - * owning tasks priority) to insert the list item into the event list is task - * priority order. - * - * @param pxEventList The list containing tasks that are blocked waiting - * for the event to occur. - * - * @param xItemValue The item value to use for the event list item when the - * event list is not ordered by task priority. - * - * @param xTicksToWait The maximum amount of time that the task should wait - * for the event to occur. This is specified in kernel ticks,the constant - * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time - * period. - */ -void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * This function performs nearly the same function as vTaskPlaceOnEventList(). - * The difference being that this function does not permit tasks to block - * indefinitely, whereas vTaskPlaceOnEventList() does. - * - */ -void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN - * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. - * - * Removes a task from both the specified event list and the list of blocked - * tasks, and places it on a ready queue. - * - * xTaskRemoveFromEventList()/vTaskRemoveFromUnorderedEventList() will be called - * if either an event occurs to unblock a task, or the block timeout period - * expires. - * - * xTaskRemoveFromEventList() is used when the event list is in task priority - * order. It removes the list item from the head of the event list as that will - * have the highest priority owning task of all the tasks on the event list. - * vTaskRemoveFromUnorderedEventList() is used when the event list is not - * ordered and the event list items hold something other than the owning tasks - * priority. In this case the event list item value is updated to the value - * passed in the xItemValue parameter. - * - * @return pdTRUE if the task being removed has a higher priority than the task - * making the call, otherwise pdFALSE. - */ -BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; -// void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY - * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS - * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. - * - * Sets the pointer to the current TCB to the TCB of the highest priority task - * that is ready to run. - */ -void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; - -/* - * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY - * THE EVENT BITS MODULE. - */ -// TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Return the handle of the calling task. - */ -// TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Capture the current time status for future reference. - */ -// void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Compare the time status now with that previously captured to see if the - * timeout has expired. - */ -BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; - -/* - * Shortcut used by the queue implementation to prevent unnecessary call to - * taskYIELD(); - */ -void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; - -/* - * Returns the scheduler state as taskSCHEDULER_RUNNING, - * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. - */ -BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; - -/* - * Raises the priority of the mutex holder to that of the calling task should - * the mutex holder have a priority less than the calling task. - */ -BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; - -/* - * Set the priority of a task back to its proper priority in the case that it - * inherited a higher priority while it was holding a semaphore. - */ -BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; - -/* - * If a higher priority task attempting to obtain a mutex caused a lower - * priority task to inherit the higher priority task's priority - but the higher - * priority task then timed out without obtaining the mutex, then the lower - * priority task will disinherit the priority again - but only down as far as - * the highest priority task that is still waiting for the mutex (if there were - * more than one task waiting for the mutex). - */ -void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; - -/* - * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. - */ -// UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Set the uxTaskNumber of the task referenced by the xTask parameter to - * uxHandle. - */ -// void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/* - * Only available when configUSE_TICKLESS_IDLE is set to 1. - * If tickless mode is being used, or a low power mode is implemented, then - * the tick interrupt will not execute during idle periods. When this is the - * case, the tick count value maintained by the scheduler needs to be kept up - * to date with the actual execution time by being skipped forward by a time - * equal to the idle period. - */ -void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; - -/* - * Only avilable when configUSE_TICKLESS_IDLE is set to 1. - * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port - * specific sleep function to determine if it is ok to proceed with the sleep, - * and if it is ok to proceed, if it is ok to sleep indefinitely. - * - * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only - * called with the scheduler suspended, not from within a critical section. It - * is therefore possible for an interrupt to request a context switch between - * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being - * entered. eTaskConfirmSleepModeStatus() should be called from a short - * critical section between the timer being stopped and the sleep mode being - * entered to ensure it is ok to proceed into the sleep mode. - */ -eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; - -/* - * For internal use only. Increment the mutex held count when a mutex is - * taken and return the handle of the task that has taken the mutex. - */ -TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; - -/* - * For internal use only. Same as vTaskSetTimeOutState(), but without a critial - * section. - */ -void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; - - -#ifdef __cplusplus -} -#endif -#endif /* INC_TASK_H */ - - - diff --git a/bundles/mesh/inc/os/timers.h b/bundles/mesh/inc/os/timers.h deleted file mode 100644 index 57c4487ad..000000000 --- a/bundles/mesh/inc/os/timers.h +++ /dev/null @@ -1,1294 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - - -#ifndef TIMERS_H -#define TIMERS_H - -#ifndef INC_FREERTOS_H - #error "include FreeRTOS.h must appear in source files before include timers.h" -#endif - -/*lint -save -e537 This headers are only multiply included if the application code -happens to also be including task.h. */ -#include "task.h" -/*lint -restore */ - -#ifdef __cplusplus -extern "C" { -#endif - -/*----------------------------------------------------------- - * MACROS AND DEFINITIONS - *----------------------------------------------------------*/ - -/* IDs for commands that can be sent/received on the timer queue. These are to -be used solely through the macros that make up the public software timer API, -as defined below. The commands that are sent from interrupts must use the -highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task -or interrupt version of the queue send function should be used. */ -#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) -#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) -#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) -#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) -#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) -#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) -#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) -#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) - -#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) -#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) -#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) -#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) -#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) - - -/** - * Type by which software timers are referenced. For example, a call to - * xTimerCreate() returns an TimerHandle_t variable that can then be used to - * reference the subject timer in calls to other software timer API functions - * (for example, xTimerStart(), xTimerReset(), etc.). - */ -struct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ -typedef struct tmrTimerControl * TimerHandle_t; - -/* - * Defines the prototype to which timer callback functions must conform. - */ -typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); - -/* - * Defines the prototype to which functions used with the - * xTimerPendFunctionCallFromISR() function must conform. - */ -typedef void (*PendedFunction_t)( void *, uint32_t ); - -/** - * TimerHandle_t xTimerCreate( const char * const pcTimerName, - * TickType_t xTimerPeriodInTicks, - * UBaseType_t uxAutoReload, - * void * pvTimerID, - * TimerCallbackFunction_t pxCallbackFunction ); - * - * Creates a new software timer instance, and returns a handle by which the - * created software timer can be referenced. - * - * Internally, within the FreeRTOS implementation, software timers use a block - * of memory, in which the timer data structure is stored. If a software timer - * is created using xTimerCreate() then the required memory is automatically - * dynamically allocated inside the xTimerCreate() function. (see - * http://www.freertos.org/a00111.html). If a software timer is created using - * xTimerCreateStatic() then the application writer must provide the memory that - * will get used by the software timer. xTimerCreateStatic() therefore allows a - * software timer to be created without using any dynamic memory allocation. - * - * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), - * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and - * xTimerChangePeriodFromISR() API functions can all be used to transition a - * timer into the active state. - * - * @param pcTimerName A text name that is assigned to the timer. This is done - * purely to assist debugging. The kernel itself only ever references a timer - * by its handle, and never by its name. - * - * @param xTimerPeriodInTicks The timer period. The time is defined in tick - * periods so the constant portTICK_PERIOD_MS can be used to convert a time that - * has been specified in milliseconds. For example, if the timer must expire - * after 100 ticks, then xTimerPeriodInTicks should be set to 100. - * Alternatively, if the timer must expire after 500ms, then xPeriod can be set - * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or - * equal to 1000. - * - * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. - * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and - * enter the dormant state after it expires. - * - * @param pvTimerID An identifier that is assigned to the timer being created. - * Typically this would be used in the timer callback function to identify which - * timer expired when the same callback function is assigned to more than one - * timer. - * - * @param pxCallbackFunction The function to call when the timer expires. - * Callback functions must have the prototype defined by TimerCallbackFunction_t, - * which is "void vCallbackFunction( TimerHandle_t xTimer );". - * - * @return If the timer is successfully created then a handle to the newly - * created timer is returned. If the timer cannot be created (because either - * there is insufficient FreeRTOS heap remaining to allocate the timer - * structures, or the timer period was set to 0) then NULL is returned. - * - * Example usage: - * @verbatim - * #define NUM_TIMERS 5 - * - * // An array to hold handles to the created timers. - * TimerHandle_t xTimers[ NUM_TIMERS ]; - * - * // An array to hold a count of the number of times each timer expires. - * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; - * - * // Define a callback function that will be used by multiple timer instances. - * // The callback function does nothing but count the number of times the - * // associated timer expires, and stop the timer once the timer has expired - * // 10 times. - * void vTimerCallback( TimerHandle_t pxTimer ) - * { - * int32_t lArrayIndex; - * const int32_t xMaxExpiryCountBeforeStopping = 10; - * - * // Optionally do something if the pxTimer parameter is NULL. - * configASSERT( pxTimer ); - * - * // Which timer expired? - * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); - * - * // Increment the number of times that pxTimer has expired. - * lExpireCounters[ lArrayIndex ] += 1; - * - * // If the timer has expired 10 times then stop it from running. - * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) - * { - * // Do not use a block time if calling a timer API function from a - * // timer callback function, as doing so could cause a deadlock! - * xTimerStop( pxTimer, 0 ); - * } - * } - * - * void main( void ) - * { - * int32_t x; - * - * // Create then start some timers. Starting the timers before the scheduler - * // has been started means the timers will start running immediately that - * // the scheduler starts. - * for( x = 0; x < NUM_TIMERS; x++ ) - * { - * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. - * ( 100 * x ), // The timer period in ticks. - * pdTRUE, // The timers will auto-reload themselves when they expire. - * ( void * ) x, // Assign each timer a unique id equal to its array index. - * vTimerCallback // Each timer calls the same callback when it expires. - * ); - * - * if( xTimers[ x ] == NULL ) - * { - * // The timer was not created. - * } - * else - * { - * // Start the timer. No block time is specified, and even if one was - * // it would be ignored because the scheduler has not yet been - * // started. - * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) - * { - * // The timer could not be set into the Active state. - * } - * } - * } - * - * // ... - * // Create tasks here. - * // ... - * - * // Starting the scheduler will start the timers running as they have already - * // been set into the active state. - * vTaskStartScheduler(); - * - * // Should not reach here. - * for( ;; ); - * } - * @endverbatim - */ -#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) - TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ - const TickType_t xTimerPeriodInTicks, - const UBaseType_t uxAutoReload, - void * const pvTimerID, - TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; -#endif - -/** - * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, - * TickType_t xTimerPeriodInTicks, - * UBaseType_t uxAutoReload, - * void * pvTimerID, - * TimerCallbackFunction_t pxCallbackFunction, - * StaticTimer_t *pxTimerBuffer ); - * - * Creates a new software timer instance, and returns a handle by which the - * created software timer can be referenced. - * - * Internally, within the FreeRTOS implementation, software timers use a block - * of memory, in which the timer data structure is stored. If a software timer - * is created using xTimerCreate() then the required memory is automatically - * dynamically allocated inside the xTimerCreate() function. (see - * http://www.freertos.org/a00111.html). If a software timer is created using - * xTimerCreateStatic() then the application writer must provide the memory that - * will get used by the software timer. xTimerCreateStatic() therefore allows a - * software timer to be created without using any dynamic memory allocation. - * - * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), - * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and - * xTimerChangePeriodFromISR() API functions can all be used to transition a - * timer into the active state. - * - * @param pcTimerName A text name that is assigned to the timer. This is done - * purely to assist debugging. The kernel itself only ever references a timer - * by its handle, and never by its name. - * - * @param xTimerPeriodInTicks The timer period. The time is defined in tick - * periods so the constant portTICK_PERIOD_MS can be used to convert a time that - * has been specified in milliseconds. For example, if the timer must expire - * after 100 ticks, then xTimerPeriodInTicks should be set to 100. - * Alternatively, if the timer must expire after 500ms, then xPeriod can be set - * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or - * equal to 1000. - * - * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will - * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. - * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and - * enter the dormant state after it expires. - * - * @param pvTimerID An identifier that is assigned to the timer being created. - * Typically this would be used in the timer callback function to identify which - * timer expired when the same callback function is assigned to more than one - * timer. - * - * @param pxCallbackFunction The function to call when the timer expires. - * Callback functions must have the prototype defined by TimerCallbackFunction_t, - * which is "void vCallbackFunction( TimerHandle_t xTimer );". - * - * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which - * will be then be used to hold the software timer's data structures, removing - * the need for the memory to be allocated dynamically. - * - * @return If the timer is created then a handle to the created timer is - * returned. If pxTimerBuffer was NULL then NULL is returned. - * - * Example usage: - * @verbatim - * - * // The buffer used to hold the software timer's data structure. - * static StaticTimer_t xTimerBuffer; - * - * // A variable that will be incremented by the software timer's callback - * // function. - * UBaseType_t uxVariableToIncrement = 0; - * - * // A software timer callback function that increments a variable passed to - * // it when the software timer was created. After the 5th increment the - * // callback function stops the software timer. - * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) - * { - * UBaseType_t *puxVariableToIncrement; - * BaseType_t xReturned; - * - * // Obtain the address of the variable to increment from the timer ID. - * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); - * - * // Increment the variable to show the timer callback has executed. - * ( *puxVariableToIncrement )++; - * - * // If this callback has executed the required number of times, stop the - * // timer. - * if( *puxVariableToIncrement == 5 ) - * { - * // This is called from a timer callback so must not block. - * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); - * } - * } - * - * - * void main( void ) - * { - * // Create the software time. xTimerCreateStatic() has an extra parameter - * // than the normal xTimerCreate() API function. The parameter is a pointer - * // to the StaticTimer_t structure that will hold the software timer - * // structure. If the parameter is passed as NULL then the structure will be - * // allocated dynamically, just as if xTimerCreate() had been called. - * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. - * xTimerPeriod, // The period of the timer in ticks. - * pdTRUE, // This is an auto-reload timer. - * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function - * prvTimerCallback, // The function to execute when the timer expires. - * &xTimerBuffer ); // The buffer that will hold the software timer structure. - * - * // The scheduler has not started yet so a block time is not used. - * xReturned = xTimerStart( xTimer, 0 ); - * - * // ... - * // Create tasks here. - * // ... - * - * // Starting the scheduler will start the timers running as they have already - * // been set into the active state. - * vTaskStartScheduler(); - * - * // Should not reach here. - * for( ;; ); - * } - * @endverbatim - */ -#if( configSUPPORT_STATIC_ALLOCATION == 1 ) -// TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -// const TickType_t xTimerPeriodInTicks, -// const UBaseType_t uxAutoReload, -// void * const pvTimerID, -// TimerCallbackFunction_t pxCallbackFunction, -// StaticTimer_t *pxTimerBuffer ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - -#endif /* configSUPPORT_STATIC_ALLOCATION */ - -/** - * void *pvTimerGetTimerID( TimerHandle_t xTimer ); - * - * Returns the ID assigned to the timer. - * - * IDs are assigned to timers using the pvTimerID parameter of the call to - * xTimerCreated() that was used to create the timer, and by calling the - * vTimerSetTimerID() API function. - * - * If the same callback function is assigned to multiple timers then the timer - * ID can be used as time specific (timer local) storage. - * - * @param xTimer The timer being queried. - * - * @return The ID assigned to the timer being queried. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - */ -void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; - -/** - * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); - * - * Sets the ID assigned to the timer. - * - * IDs are assigned to timers using the pvTimerID parameter of the call to - * xTimerCreated() that was used to create the timer. - * - * If the same callback function is assigned to multiple timers then the timer - * ID can be used as time specific (timer local) storage. - * - * @param xTimer The timer being updated. - * - * @param pvNewID The ID to assign to the timer. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - */ -// void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); - * - * Queries a timer to see if it is active or dormant. - * - * A timer will be dormant if: - * 1) It has been created but not started, or - * 2) It is an expired one-shot timer that has not been restarted. - * - * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), - * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and - * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the - * active state. - * - * @param xTimer The timer being queried. - * - * @return pdFALSE will be returned if the timer is dormant. A value other than - * pdFALSE will be returned if the timer is active. - * - * Example usage: - * @verbatim - * // This function assumes xTimer has already been created. - * void vAFunction( TimerHandle_t xTimer ) - * { - * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" - * { - * // xTimer is active, do something. - * } - * else - * { - * // xTimer is not active, do something else. - * } - * } - * @endverbatim - */ -// BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); - * - * Simply returns the handle of the timer service/daemon task. It it not valid - * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. - */ -// TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerStart() starts a timer that was previously created using the - * xTimerCreate() API function. If the timer had already been started and was - * already in the active state, then xTimerStart() has equivalent functionality - * to the xTimerReset() API function. - * - * Starting a timer ensures the timer is in the active state. If the timer - * is not stopped, deleted, or reset in the mean time, the callback function - * associated with the timer will get called 'n' ticks after xTimerStart() was - * called, where 'n' is the timers defined period. - * - * It is valid to call xTimerStart() before the scheduler has been started, but - * when this is done the timer will not actually start until the scheduler is - * started, and the timers expiry time will be relative to when the scheduler is - * started, not relative to when xTimerStart() was called. - * - * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() - * to be available. - * - * @param xTimer The handle of the timer being started/restarted. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the start command to be successfully - * sent to the timer command queue, should the queue already be full when - * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called - * before the scheduler is started. - * - * @return pdFAIL will be returned if the start command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system, although the - * timers expiry time is relative to when xTimerStart() is actually called. The - * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - * - */ -#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerStop() stops a timer that was previously started using either of the - * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), - * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. - * - * Stopping a timer ensures the timer is not in the active state. - * - * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() - * to be available. - * - * @param xTimer The handle of the timer being stopped. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the stop command to be successfully - * sent to the timer command queue, should the queue already be full when - * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called - * before the scheduler is started. - * - * @return pdFAIL will be returned if the stop command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system. The timer - * service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * - * See the xTimerCreate() API function example usage scenario. - * - */ -#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, - * TickType_t xNewPeriod, - * TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerChangePeriod() changes the period of a timer that was previously - * created using the xTimerCreate() API function. - * - * xTimerChangePeriod() can be called to change the period of an active or - * dormant state timer. - * - * The configUSE_TIMERS configuration constant must be set to 1 for - * xTimerChangePeriod() to be available. - * - * @param xTimer The handle of the timer that is having its period changed. - * - * @param xNewPeriod The new period for xTimer. Timer periods are specified in - * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time - * that has been specified in milliseconds. For example, if the timer must - * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, - * if the timer must expire after 500ms, then xNewPeriod can be set to - * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than - * or equal to 1000. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the change period command to be - * successfully sent to the timer command queue, should the queue already be - * full when xTimerChangePeriod() was called. xTicksToWait is ignored if - * xTimerChangePeriod() is called before the scheduler is started. - * - * @return pdFAIL will be returned if the change period command could not be - * sent to the timer command queue even after xTicksToWait ticks had passed. - * pdPASS will be returned if the command was successfully sent to the timer - * command queue. When the command is actually processed will depend on the - * priority of the timer service/daemon task relative to other tasks in the - * system. The timer service/daemon task priority is set by the - * configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This function assumes xTimer has already been created. If the timer - * // referenced by xTimer is already active when it is called, then the timer - * // is deleted. If the timer referenced by xTimer is not active when it is - * // called, then the period of the timer is set to 500ms and the timer is - * // started. - * void vAFunction( TimerHandle_t xTimer ) - * { - * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" - * { - * // xTimer is already active - delete it. - * xTimerDelete( xTimer ); - * } - * else - * { - * // xTimer is not active, change its period to 500ms. This will also - * // cause the timer to start. Block for a maximum of 100 ticks if the - * // change period command cannot immediately be sent to the timer - * // command queue. - * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) - * { - * // The command was successfully sent. - * } - * else - * { - * // The command could not be sent, even after waiting for 100 ticks - * // to pass. Take appropriate action here. - * } - * } - * } - * @endverbatim - */ - #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerDelete() deletes a timer that was previously created using the - * xTimerCreate() API function. - * - * The configUSE_TIMERS configuration constant must be set to 1 for - * xTimerDelete() to be available. - * - * @param xTimer The handle of the timer being deleted. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the delete command to be - * successfully sent to the timer command queue, should the queue already be - * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() - * is called before the scheduler is started. - * - * @return pdFAIL will be returned if the delete command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system. The timer - * service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * - * See the xTimerChangePeriod() API function example usage scenario. - */ -#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); - * - * Timer functionality is provided by a timer service/daemon task. Many of the - * public FreeRTOS timer API functions send commands to the timer service task - * through a queue called the timer command queue. The timer command queue is - * private to the kernel itself and is not directly accessible to application - * code. The length of the timer command queue is set by the - * configTIMER_QUEUE_LENGTH configuration constant. - * - * xTimerReset() re-starts a timer that was previously created using the - * xTimerCreate() API function. If the timer had already been started and was - * already in the active state, then xTimerReset() will cause the timer to - * re-evaluate its expiry time so that it is relative to when xTimerReset() was - * called. If the timer was in the dormant state then xTimerReset() has - * equivalent functionality to the xTimerStart() API function. - * - * Resetting a timer ensures the timer is in the active state. If the timer - * is not stopped, deleted, or reset in the mean time, the callback function - * associated with the timer will get called 'n' ticks after xTimerReset() was - * called, where 'n' is the timers defined period. - * - * It is valid to call xTimerReset() before the scheduler has been started, but - * when this is done the timer will not actually start until the scheduler is - * started, and the timers expiry time will be relative to when the scheduler is - * started, not relative to when xTimerReset() was called. - * - * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() - * to be available. - * - * @param xTimer The handle of the timer being reset/started/restarted. - * - * @param xTicksToWait Specifies the time, in ticks, that the calling task should - * be held in the Blocked state to wait for the reset command to be successfully - * sent to the timer command queue, should the queue already be full when - * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called - * before the scheduler is started. - * - * @return pdFAIL will be returned if the reset command could not be sent to - * the timer command queue even after xTicksToWait ticks had passed. pdPASS will - * be returned if the command was successfully sent to the timer command queue. - * When the command is actually processed will depend on the priority of the - * timer service/daemon task relative to other tasks in the system, although the - * timers expiry time is relative to when xTimerStart() is actually called. The - * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * @verbatim - * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass - * // without a key being pressed, then the LCD back-light is switched off. In - * // this case, the timer is a one-shot timer. - * - * TimerHandle_t xBacklightTimer = NULL; - * - * // The callback function assigned to the one-shot timer. In this case the - * // parameter is not used. - * void vBacklightTimerCallback( TimerHandle_t pxTimer ) - * { - * // The timer expired, therefore 5 seconds must have passed since a key - * // was pressed. Switch off the LCD back-light. - * vSetBacklightState( BACKLIGHT_OFF ); - * } - * - * // The key press event handler. - * void vKeyPressEventHandler( char cKey ) - * { - * // Ensure the LCD back-light is on, then reset the timer that is - * // responsible for turning the back-light off after 5 seconds of - * // key inactivity. Wait 10 ticks for the command to be successfully sent - * // if it cannot be sent immediately. - * vSetBacklightState( BACKLIGHT_ON ); - * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) - * { - * // The reset command was not executed successfully. Take appropriate - * // action here. - * } - * - * // Perform the rest of the key processing here. - * } - * - * void main( void ) - * { - * int32_t x; - * - * // Create then start the one-shot timer that is responsible for turning - * // the back-light off if no keys are pressed within a 5 second period. - * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. - * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. - * pdFALSE, // The timer is a one-shot timer. - * 0, // The id is not used by the callback so can take any value. - * vBacklightTimerCallback // The callback function that switches the LCD back-light off. - * ); - * - * if( xBacklightTimer == NULL ) - * { - * // The timer was not created. - * } - * else - * { - * // Start the timer. No block time is specified, and even if one was - * // it would be ignored because the scheduler has not yet been - * // started. - * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) - * { - * // The timer could not be set into the Active state. - * } - * } - * - * // ... - * // Create tasks here. - * // ... - * - * // Starting the scheduler will start the timer running as it has already - * // been set into the active state. - * vTaskStartScheduler(); - * - * // Should not reach here. - * for( ;; ); - * } - * @endverbatim - */ -#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) - -/** - * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerStart() that can be called from an interrupt service - * routine. - * - * @param xTimer The handle of the timer being started/restarted. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerStartFromISR() writes a message to the timer - * command queue, so has the potential to transition the timer service/daemon - * task out of the Blocked state. If calling xTimerStartFromISR() causes the - * timer service/daemon task to leave the Blocked state, and the timer service/ - * daemon task has a priority equal to or greater than the currently executing - * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will - * get set to pdTRUE internally within the xTimerStartFromISR() function. If - * xTimerStartFromISR() sets this value to pdTRUE then a context switch should - * be performed before the interrupt exits. - * - * @return pdFAIL will be returned if the start command could not be sent to - * the timer command queue. pdPASS will be returned if the command was - * successfully sent to the timer command queue. When the command is actually - * processed will depend on the priority of the timer service/daemon task - * relative to other tasks in the system, although the timers expiry time is - * relative to when xTimerStartFromISR() is actually called. The timer - * service/daemon task priority is set by the configTIMER_TASK_PRIORITY - * configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xBacklightTimer has already been created. When a - * // key is pressed, an LCD back-light is switched on. If 5 seconds pass - * // without a key being pressed, then the LCD back-light is switched off. In - * // this case, the timer is a one-shot timer, and unlike the example given for - * // the xTimerReset() function, the key press event handler is an interrupt - * // service routine. - * - * // The callback function assigned to the one-shot timer. In this case the - * // parameter is not used. - * void vBacklightTimerCallback( TimerHandle_t pxTimer ) - * { - * // The timer expired, therefore 5 seconds must have passed since a key - * // was pressed. Switch off the LCD back-light. - * vSetBacklightState( BACKLIGHT_OFF ); - * } - * - * // The key press interrupt service routine. - * void vKeyPressEventInterruptHandler( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // Ensure the LCD back-light is on, then restart the timer that is - * // responsible for turning the back-light off after 5 seconds of - * // key inactivity. This is an interrupt service routine so can only - * // call FreeRTOS API functions that end in "FromISR". - * vSetBacklightState( BACKLIGHT_ON ); - * - * // xTimerStartFromISR() or xTimerResetFromISR() could be called here - * // as both cause the timer to re-calculate its expiry time. - * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was - * // declared (in this function). - * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The start command was not executed successfully. Take appropriate - * // action here. - * } - * - * // Perform the rest of the key processing here. - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) - -/** - * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerStop() that can be called from an interrupt service - * routine. - * - * @param xTimer The handle of the timer being stopped. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerStopFromISR() writes a message to the timer - * command queue, so has the potential to transition the timer service/daemon - * task out of the Blocked state. If calling xTimerStopFromISR() causes the - * timer service/daemon task to leave the Blocked state, and the timer service/ - * daemon task has a priority equal to or greater than the currently executing - * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will - * get set to pdTRUE internally within the xTimerStopFromISR() function. If - * xTimerStopFromISR() sets this value to pdTRUE then a context switch should - * be performed before the interrupt exits. - * - * @return pdFAIL will be returned if the stop command could not be sent to - * the timer command queue. pdPASS will be returned if the command was - * successfully sent to the timer command queue. When the command is actually - * processed will depend on the priority of the timer service/daemon task - * relative to other tasks in the system. The timer service/daemon task - * priority is set by the configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xTimer has already been created and started. When - * // an interrupt occurs, the timer should be simply stopped. - * - * // The interrupt service routine that stops the timer. - * void vAnExampleInterruptServiceRoutine( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // The interrupt has occurred - simply stop the timer. - * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined - * // (within this function). As this is an interrupt service routine, only - * // FreeRTOS API functions that end in "FromISR" can be used. - * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The stop command was not executed successfully. Take appropriate - * // action here. - * } - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) - -/** - * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, - * TickType_t xNewPeriod, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerChangePeriod() that can be called from an interrupt - * service routine. - * - * @param xTimer The handle of the timer that is having its period changed. - * - * @param xNewPeriod The new period for xTimer. Timer periods are specified in - * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time - * that has been specified in milliseconds. For example, if the timer must - * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, - * if the timer must expire after 500ms, then xNewPeriod can be set to - * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than - * or equal to 1000. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerChangePeriodFromISR() writes a message to the - * timer command queue, so has the potential to transition the timer service/ - * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() - * causes the timer service/daemon task to leave the Blocked state, and the - * timer service/daemon task has a priority equal to or greater than the - * currently executing task (the task that was interrupted), then - * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the - * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets - * this value to pdTRUE then a context switch should be performed before the - * interrupt exits. - * - * @return pdFAIL will be returned if the command to change the timers period - * could not be sent to the timer command queue. pdPASS will be returned if the - * command was successfully sent to the timer command queue. When the command - * is actually processed will depend on the priority of the timer service/daemon - * task relative to other tasks in the system. The timer service/daemon task - * priority is set by the configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xTimer has already been created and started. When - * // an interrupt occurs, the period of xTimer should be changed to 500ms. - * - * // The interrupt service routine that changes the period of xTimer. - * void vAnExampleInterruptServiceRoutine( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // The interrupt has occurred - change the period of xTimer to 500ms. - * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined - * // (within this function). As this is an interrupt service routine, only - * // FreeRTOS API functions that end in "FromISR" can be used. - * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The command to change the timers period was not executed - * // successfully. Take appropriate action here. - * } - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) - -/** - * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * A version of xTimerReset() that can be called from an interrupt service - * routine. - * - * @param xTimer The handle of the timer that is to be started, reset, or - * restarted. - * - * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most - * of its time in the Blocked state, waiting for messages to arrive on the timer - * command queue. Calling xTimerResetFromISR() writes a message to the timer - * command queue, so has the potential to transition the timer service/daemon - * task out of the Blocked state. If calling xTimerResetFromISR() causes the - * timer service/daemon task to leave the Blocked state, and the timer service/ - * daemon task has a priority equal to or greater than the currently executing - * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will - * get set to pdTRUE internally within the xTimerResetFromISR() function. If - * xTimerResetFromISR() sets this value to pdTRUE then a context switch should - * be performed before the interrupt exits. - * - * @return pdFAIL will be returned if the reset command could not be sent to - * the timer command queue. pdPASS will be returned if the command was - * successfully sent to the timer command queue. When the command is actually - * processed will depend on the priority of the timer service/daemon task - * relative to other tasks in the system, although the timers expiry time is - * relative to when xTimerResetFromISR() is actually called. The timer service/daemon - * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. - * - * Example usage: - * @verbatim - * // This scenario assumes xBacklightTimer has already been created. When a - * // key is pressed, an LCD back-light is switched on. If 5 seconds pass - * // without a key being pressed, then the LCD back-light is switched off. In - * // this case, the timer is a one-shot timer, and unlike the example given for - * // the xTimerReset() function, the key press event handler is an interrupt - * // service routine. - * - * // The callback function assigned to the one-shot timer. In this case the - * // parameter is not used. - * void vBacklightTimerCallback( TimerHandle_t pxTimer ) - * { - * // The timer expired, therefore 5 seconds must have passed since a key - * // was pressed. Switch off the LCD back-light. - * vSetBacklightState( BACKLIGHT_OFF ); - * } - * - * // The key press interrupt service routine. - * void vKeyPressEventInterruptHandler( void ) - * { - * BaseType_t xHigherPriorityTaskWoken = pdFALSE; - * - * // Ensure the LCD back-light is on, then reset the timer that is - * // responsible for turning the back-light off after 5 seconds of - * // key inactivity. This is an interrupt service routine so can only - * // call FreeRTOS API functions that end in "FromISR". - * vSetBacklightState( BACKLIGHT_ON ); - * - * // xTimerStartFromISR() or xTimerResetFromISR() could be called here - * // as both cause the timer to re-calculate its expiry time. - * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was - * // declared (in this function). - * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) - * { - * // The reset command was not executed successfully. Take appropriate - * // action here. - * } - * - * // Perform the rest of the key processing here. - * - * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch - * // should be performed. The syntax required to perform a context switch - * // from inside an ISR varies from port to port, and from compiler to - * // compiler. Inspect the demos for the port you are using to find the - * // actual syntax required. - * if( xHigherPriorityTaskWoken != pdFALSE ) - * { - * // Call the interrupt safe yield function here (actual function - * // depends on the FreeRTOS port being used). - * } - * } - * @endverbatim - */ -#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) - - -/** - * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, - * void *pvParameter1, - * uint32_t ulParameter2, - * BaseType_t *pxHigherPriorityTaskWoken ); - * - * - * Used from application interrupt service routines to defer the execution of a - * function to the RTOS daemon task (the timer service task, hence this function - * is implemented in timers.c and is prefixed with 'Timer'). - * - * Ideally an interrupt service routine (ISR) is kept as short as possible, but - * sometimes an ISR either has a lot of processing to do, or needs to perform - * processing that is not deterministic. In these cases - * xTimerPendFunctionCallFromISR() can be used to defer processing of a function - * to the RTOS daemon task. - * - * A mechanism is provided that allows the interrupt to return directly to the - * task that will subsequently execute the pended callback function. This - * allows the callback function to execute contiguously in time with the - * interrupt - just as if the callback had executed in the interrupt itself. - * - * @param xFunctionToPend The function to execute from the timer service/ - * daemon task. The function must conform to the PendedFunction_t - * prototype. - * - * @param pvParameter1 The value of the callback function's first parameter. - * The parameter has a void * type to allow it to be used to pass any type. - * For example, unsigned longs can be cast to a void *, or the void * can be - * used to point to a structure. - * - * @param ulParameter2 The value of the callback function's second parameter. - * - * @param pxHigherPriorityTaskWoken As mentioned above, calling this function - * will result in a message being sent to the timer daemon task. If the - * priority of the timer daemon task (which is set using - * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of - * the currently running task (the task the interrupt interrupted) then - * *pxHigherPriorityTaskWoken will be set to pdTRUE within - * xTimerPendFunctionCallFromISR(), indicating that a context switch should be - * requested before the interrupt exits. For that reason - * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the - * example code below. - * - * @return pdPASS is returned if the message was successfully sent to the - * timer daemon task, otherwise pdFALSE is returned. - * - * Example usage: - * @verbatim - * - * // The callback function that will execute in the context of the daemon task. - * // Note callback functions must all use this same prototype. - * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) - * { - * BaseType_t xInterfaceToService; - * - * // The interface that requires servicing is passed in the second - * // parameter. The first parameter is not used in this case. - * xInterfaceToService = ( BaseType_t ) ulParameter2; - * - * // ...Perform the processing here... - * } - * - * // An ISR that receives data packets from multiple interfaces - * void vAnISR( void ) - * { - * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; - * - * // Query the hardware to determine which interface needs processing. - * xInterfaceToService = prvCheckInterfaces(); - * - * // The actual processing is to be deferred to a task. Request the - * // vProcessInterface() callback function is executed, passing in the - * // number of the interface that needs processing. The interface to - * // service is passed in the second parameter. The first parameter is - * // not used in this case. - * xHigherPriorityTaskWoken = pdFALSE; - * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); - * - * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context - * // switch should be requested. The macro used is port specific and will - * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to - * // the documentation page for the port being used. - * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); - * - * } - * @endverbatim - */ -// BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - - /** - * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, - * void *pvParameter1, - * uint32_t ulParameter2, - * TickType_t xTicksToWait ); - * - * - * Used to defer the execution of a function to the RTOS daemon task (the timer - * service task, hence this function is implemented in timers.c and is prefixed - * with 'Timer'). - * - * @param xFunctionToPend The function to execute from the timer service/ - * daemon task. The function must conform to the PendedFunction_t - * prototype. - * - * @param pvParameter1 The value of the callback function's first parameter. - * The parameter has a void * type to allow it to be used to pass any type. - * For example, unsigned longs can be cast to a void *, or the void * can be - * used to point to a structure. - * - * @param ulParameter2 The value of the callback function's second parameter. - * - * @param xTicksToWait Calling this function will result in a message being - * sent to the timer daemon task on a queue. xTicksToWait is the amount of - * time the calling task should remain in the Blocked state (so not using any - * processing time) for space to become available on the timer queue if the - * queue is found to be full. - * - * @return pdPASS is returned if the message was successfully sent to the - * timer daemon task, otherwise pdFALSE is returned. - * - */ -// BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** - * const char * const pcTimerGetName( TimerHandle_t xTimer ); - * - * Returns the name that was assigned to a timer when the timer was created. - * - * @param xTimer The handle of the timer being queried. - * - * @return The name assigned to the timer specified by the xTimer parameter. - */ -// const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ -// WARNING: ^^^ this API is not available in this release - - -/** - * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); - * - * Returns the period of a timer. - * - * @param xTimer The handle of the timer being queried. - * - * @return The period of the timer in ticks. - */ -// TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - - -/** -* TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); -* -* Returns the time in ticks at which the timer will expire. If this is less -* than the current tick count then the expiry time has overflowed from the -* current time. -* -* @param xTimer The handle of the timer being queried. -* -* @return If the timer is running then the time in ticks at which the timer -* will next expire is returned. If the timer is not running then the return -* value is undefined. -*/ -TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; - -/* - * Functions beyond this part are not part of the public API and are intended - * for use by the kernel only. - */ -BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; -BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; - -#if( configUSE_TRACE_FACILITY == 1 ) - void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; - UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; -#endif - -#ifdef __cplusplus -} -#endif -#endif /* TIMERS_H */ - - - diff --git a/bundles/mesh/inc/platform_api.h b/bundles/mesh/inc/platform_api.h deleted file mode 100644 index 7c2beb8df..000000000 --- a/bundles/mesh/inc/platform_api.h +++ /dev/null @@ -1,283 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -#ifndef _STACK_API_H_ -#define _STACK_API_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct platform_ver_s -{ - unsigned short major; - char minor; - char patch; -} platform_ver_t; - -typedef struct hard_fault_info_s -{ - uint32_t r0; - uint32_t r1; - uint32_t r2; - uint32_t r3; - uint32_t r12; - uint32_t lr; - uint32_t pc; - uint32_t psr; -} hard_fault_info_t; - -typedef struct assertion_info_s -{ - const char *file_name; - int line_no; -} assertion_info_t; - -typedef enum -{ - // platform callback for putc (for logging) - // NOTE: param (void *data) is casted from char * - // example: uint32_t cb_putc(char *c, void *dummy) - PLATFORM_CB_EVT_PUTC, - - // when bluetooth protocol stack ask app to initialize - PLATFORM_CB_EVT_PROFILE_INIT, - - // periphrals need to be re-initialized after deep-sleep, user can handle this event - PLATFORM_CB_EVT_ON_DEEP_SLEEP_WAKEUP, - - // return 0 if deep sleep is not allowed now; else deep sleep is allowed - // e.g. when periphrals still have data to process (UART is tx buffer not empty) - PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, - - // when hard fault occurs - // NOTE: param (void *data) is casted from hard_fault_info_t * - // example: uint32_t cb_hard_fault(hard_fault_info_t *info, void *dummy) - // if this callback is not defined, CPU enters a dead loop - PLATFORM_CB_EVT_HARD_FAULT, - - // when software assertion fails - // NOTE: param (void *data) is casted from assertion_info_t * - // if this callback is not defined, CPU enters a dead loop - PLATFORM_CB_EVT_ASSERTION, - - // when LLE is initializing - PLATFORM_CB_LLE_INIT, - - // when allocation on FreeRTOS heap fails (heap out of memory) - // if this callback is not defined, CPU enters a dead loop - PLATFORM_CB_HEAP_OOM, - - PLATFORM_CB_EVT_MAX -} platform_evt_callback_type_t; - -typedef enum -{ - PLATFORM_CB_IRQ_RTC, - PLATFORM_CB_IRQ_TIMER0, - PLATFORM_CB_IRQ_TIMER1, - PLATFORM_CB_IRQ_TIMER2, - PLATFORM_CB_IRQ_GPIO, - PLATFORM_CB_IRQ_SPI0, - PLATFORM_CB_IRQ_SPI1, - PLATFORM_CB_IRQ_UART0, - PLATFORM_CB_IRQ_UART1, - PLATFORM_CB_IRQ_I2C0, - PLATFORM_CB_IRQ_I2C1, - - PLATFORM_CB_IRQ_MAX -} platform_irq_callback_type_t; - -typedef uint32_t (*f_platform_evt_cb)(void *data, void *user_data); -typedef uint32_t (*f_platform_irq_cb)(void *user_data); - -/** - **************************************************************************************** - * @brief register callback function for platform events - * - * @param[in] type the event - * @param[in] f the callback function - * @param[in] user_data user data that will be passed into callback function `f` - **************************************************************************************** - */ -void platform_set_evt_callback(platform_evt_callback_type_t type, f_platform_evt_cb f, void *user_data); - -/** - **************************************************************************************** - * @brief register callback function for platform interrupt requests - * - * @param[in] type the irq - * @param[in] f the callback function - * @param[in] user_data user data that will be passed into callback function `f` - **************************************************************************************** - */ -void platform_set_irq_callback(platform_irq_callback_type_t type, f_platform_irq_cb f, void *user_data); - -/** - **************************************************************************************** - * @brief Get platform version number - * - * @return version number - **************************************************************************************** - */ -const platform_ver_t *platform_get_version(void); - -/** - **************************************************************************************** - * @brief raise an assertion. This function will raise the assertion event: - * `PLATFORM_CB_EVT_ASSERTION` - * - **************************************************************************************** - */ -void platform_raise_assertion(const char *file_name, int line_no); - -// NOTE: for debug only -void sysSetPublicDeviceAddr(const unsigned char *addr); - -typedef enum -{ - PLATFORM_CFG_LOG_HCI, // default: disabled - PLATFORM_CFG_POWER_SAVING // default: disabled -} platform_cfg_item_t; - -#define PLATFORM_CFG_ENABLE 1 -#define PLATFORM_CFG_DISABLE 0 - -/** - **************************************************************************************** - * @brief platform configurations. - * - * @param[in] item Configuration item - * @param[in] flag PLATFORM_CFG_ENABLE for enable, PLATFORM_CFG_DISABLE for disable - **************************************************************************************** - */ -void platform_config(const platform_cfg_item_t item, const uint8_t flag); - -/** - **************************************************************************************** - * @brief Shutdown the whole system, and power on again after a duration - * specified by duration_ms. - * Optionally, a portion of SYS memory can be retentioned during shutdown. - * Note that: this function will NOT return except that shutdown procedure fails - * to initiate. - * - * @param[in] duration_ms Duration before power on again (in ms) - * @param[in] p_retention_data Pointer to the start of data to be retentioned - * @param[in] data_size Size of the data to be retentioned - **************************************************************************************** - */ -void platform_shutdown(const uint32_t duration_ms, const void *p_retention_data, const uint32_t data_size); - -/** - **************************************************************************************** - * @brief generate random bytes by using true hardware random-number generator - * - * @param[out] bytes random data output - * @param[in] len byte number of random data - **************************************************************************************** - */ -// void platform_hrng(uint8_t *bytes, const uint32_t len); -// WARNING: ^^^ this API is not available in this release - - -/** - **************************************************************************************** - * @brief the printf function - * - * @param[in] format format string - * @param[in] ... arguments - **************************************************************************************** - */ -void platform_printf(const char *format, ...); - -/** - **************************************************************************************** - * @brief Let platform do a self check - * Note: it is recommended to call this function in a *low priority background* - * task and reset SoC if problems are detected continously - * (e.g. restart watchdog only if no problem is detected). - * - * @return return non-0 if some problems is detected else 0 - **************************************************************************************** - */ -// uint32_t platform_self_check(void); -// WARNING: ^^^ this API is not available in this release - - -#ifdef OPTIONAL_RF_CLK -// set rf source -// 0: use external crystal -// 1: use internal clock loopback -void platform_set_rf_clk_source(const uint8_t source); - -void platform_set_rf_init_data(const uint32_t *rf_init_data); - -void platform_set_rf_power_mapping(const int16_t *rf_power_mapping); -#endif - -typedef enum coded_scheme_e -{ - BLE_CODED_S8, - BLE_CODED_S2 -} coded_scheme_t; - -/** - **************************************************************************************** - * @brief set coded scheme of a advertising set - * Note: this function should be called before the advertising set is enabled. - * Default scheme for all advertising sets are S=8 - * - * @param[in] adv_hdl handle of the advertising set - * @param[in] scheme selected scheme - **************************************************************************************** - */ -// void ll_set_adv_coded_scheme(const uint8_t adv_hdl, const coded_scheme_t scheme); -// WARNING: ^^^ this API is not available in this release - - -/** - **************************************************************************************** - * @brief set coded scheme for initiating PDU - * Note: this function should be called before initiating is enabled. - * - * @param[in] scheme selected scheme (default S=8) - **************************************************************************************** - */ -// void ll_set_initiating_coded_scheme(const coded_scheme_t scheme); -// WARNING: ^^^ this API is not available in this release - - -/** - **************************************************************************************** - * @brief Give link layer (slave role) a hint on ce_len of a connection - * - * @param[in] conn_handle handle of an existing connection - * @param[in] min_ce_len information parameter about the minimum length of connection - * event needed for this LE connection. - * Range: 0x0000 – 0xFFFF - * Time = N * 0.625 ms. - * @param[in] max_ce_len information parameter about the maximum length of connection - * event needed for this LE connection. - **************************************************************************************** - */ -// void ll_hint_on_ce_len(const uint16_t conn_handle, const uint16_t min_ce_len, const uint16_t max_ce_len); -// WARNING: ^^^ this API is not available in this release - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/bundles/mesh/inc/proxy.h b/bundles/mesh/inc/proxy.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/bundles/mesh/inc/sm.h b/bundles/mesh/inc/sm.h deleted file mode 100644 index 5415e9b28..000000000 --- a/bundles/mesh/inc/sm.h +++ /dev/null @@ -1,217 +0,0 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- - -#ifndef __SM_H -#define __SM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "compiler.h" -#include "bluetooth.h" -#include "bt_types.h" -#include "btstack_event.h" -#include "btstack_linked_list.h" - -/* API_START */ - -const static __INLINE uint8_t * sm_private_random_addr_update_get_address(const uint8_t *packet){ - return decode_event_offset(packet, uint8_t, 2); -} - -/** - * @brief persistent data for security & privacy - */ -typedef struct sm_persistent -{ - sm_key_t er; - sm_key_t ir; - bd_addr_t identity_addr; // A public device address or static random address used as identity address - // When privacy is not enabled, this should be the public device address or static random address. - // This should not be changed, once changed, paring is lost - bd_addr_type_t identity_addr_type; // Note: only PUBLIC & RANDOM are allowed -} sm_persistent_t; - -// Authorization state -typedef enum { - AUTHORIZATION_UNKNOWN, - AUTHORIZATION_PENDING, - AUTHORIZATION_DECLINED, - AUTHORIZATION_GRANTED -} authorization_state_t; - -/** - * @brief Security configurations - * - * @param[in] io_capability IO Capabilities - * @param[in] request_security Let Peripheral request an encrypted connection right after connecting - * Not used normally. Bonding is triggered by access to protected attributes in ATT Server - * @param[in] persistent persistent data for security & privacy - */ -void sm_config(const io_capability_t io_capability, - int request_security, - const sm_persistent_t *persistent); - -/** - * @brief add an sm event handler - * - * @param callback_handler the handler - */ -void sm_add_event_handler(btstack_packet_callback_registration_t * callback_handler); - -/** - * @brief Enable private random address generation - * When a new random address is generated, an SM_EVENT_PRIVATE_RANDOM_ADDR_UPDATE event is emitted - * - * @param random_address_type to use (incl. OFF) - */ -void sm_private_random_address_generation_set_mode(gap_random_address_type_t random_address_type); - - -/** - * @brief Get private random address generation mode - */ -gap_random_address_type_t sm_private_random_address_generation_get_mode(void); - -/** - * @brief Set private random address generation period - * @param period_ms generation period - */ -void sm_private_random_address_generation_set_update_period(int period_ms); - -/** - * @brief Get current private random address - * @return the address - */ -const uint8_t *sm_private_random_address_generation_get(void); - -/** - * - * @brief Registers OOB Data Callback. The callback should set the oob_data and return 1 if OOB data is availble - * @param get_oob_data_callback - */ -void sm_register_oob_data_callback( int (*get_oob_data_callback)(uint8_t addres_type, bd_addr_t addr, uint8_t * oob_data)); - -/** - * @brief Decline bonding triggered by event before - * @param addr_type and address - */ -void sm_bonding_decline(hci_con_handle_t con_handle); - -/** - * @brief Confirm Just Works bonding - * @param addr_type and address - */ -void sm_just_works_confirm(hci_con_handle_t con_handle); - -/** - * @brief Reports passkey input by user - * @param addr_type and address - * @param passkey in [0..999999] - */ -void sm_passkey_input(hci_con_handle_t con_handle, uint32_t passkey); - -/** - * @brief Limit the STK generation methods. Bonding is stopped if the resulting one isn't in the list - * @param OR combination of SM_STK_GENERATION_METHOD_ - */ -void sm_set_accepted_stk_generation_methods(uint8_t accepted_stk_generation_methods); - -/** - * @brief Set the accepted encryption key size range. Bonding is stopped if the result isn't within the range - * @param min_size (default 7) - * @param max_size (default 16) - */ -void sm_set_encryption_key_size_range(uint8_t min_size, uint8_t max_size); - -/** - * @brief Sets the requested authentication requirements, bonding yes/no, MITM yes/no - * @param OR combination of SM_AUTHREQ_ flags - */ -void sm_set_authentication_requirements(uint8_t auth_req); - -/** - * @brief Let Peripheral request an encrypted connection right after connecting - * @note Not used normally. Bonding is triggered by access to protected attributes in ATT Server - */ -// void sm_set_request_security(int enable); -// WARNING: ^^^ this API is not available in this release - - -/** - * @brief Trigger Security Request - * @note Not used normally. Bonding is triggered by access to protected attributes in ATT Server - */ -void sm_send_security_request(hci_con_handle_t con_handle); - -/** - * - * @brief Get encryption key size. - * @param addr_type and address - * @return 0 if not encrypted, 7-16 otherwise - */ -int sm_encryption_key_size(hci_con_handle_t con_handle); - -/** - * @brief Get authentication property. - * @param addr_type and address - * @return 1 if bonded with OOB/Passkey (AND MITM protection) - */ -int sm_authenticated(hci_con_handle_t con_handle); - -/** - * @brief Queries authorization state. - * @param addr_type and address - * @return authorization_state for the current session - */ -authorization_state_t sm_authorization_state(hci_con_handle_t con_handle); - -/** - * @brief Used by att_server.c to request user authorization. - * @param addr_type and address - */ -void sm_request_pairing(hci_con_handle_t con_handle); - -/** - * @brief Report user authorization decline. - * @param addr_type and address - */ -void sm_authorization_decline(hci_con_handle_t con_handle); - -/** - * @brief Report user authorization grant. - * @param addr_type and address - */ -void sm_authorization_grant(hci_con_handle_t con_handle); - -/* - * @brief Match address against bonded devices - * @return 0 if successfully added to lookup queue - * @note Triggers SM_IDENTITY_RESOLVING_* events - */ -int sm_address_resolution_lookup(uint8_t addr_type, bd_addr_t addr); - -/** - * @brief Identify device in LE Device DB. - * @param handle - * @return index from le_device_db or -1 if not found/identified - */ -int sm_le_device_key(hci_con_handle_t con_handle); - -#ifdef __cplusplus -} -#endif - -#endif // __SM_H diff --git a/bundles/mesh/inc/syscfg.h b/bundles/mesh/inc/syscfg.h deleted file mode 100644 index c4bfcc369..000000000 --- a/bundles/mesh/inc/syscfg.h +++ /dev/null @@ -1,379 +0,0 @@ -/** - * This file was generated by Apache Newt version: 1.4.0-dev - */ - -#ifndef H_MYNEWT_SYSCFG_ -#define H_MYNEWT_SYSCFG_ - -/** - * This macro exists to ensure code includes this header when needed. If code - * checks the existence of a setting directly via ifdef without including this - * header, the setting macro will silently evaluate to 0. In contrast, an - * attempt to use these macros without including this header will result in a - * compiler error. - */ - -#include "ingsoc.h" -#include "bluetooth.h" - - -//#define ASSERT_WARN(cond) do { \ -// assertDbgWarn(cond, #cond, __MODULE__, __LINE__); \ -// }while(0); - - - -//#define ASSERT_ERR(cond) do { \ -// assertDbgErr(cond, #cond, __MODULE__, __LINE__); \ -// if (!(cond)) { __disable_irq(); while(1); } \ -// }while(0); - -#define __ORDER_BIG_ENDIAN__ 0 -#define __ORDER_LITTLE_ENDIAN__ 1 - -#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ -#define MESH_PTS_TEST (1) -#define TMO_PLATFORM (MESH_PTS_TEST?0:1) -#define MESHCCM_HARDWARE_EN (0) -#define AES128_HARDWARE_EN (0) - -#ifndef INGCHIPS_PROXY_SERVER -#define INGCHIPS_PROXY_SERVER (1) -#endif - -#define MESH_BEACON_ROLE (1) -#define PROVER_ROLE_ENABLED (MESH_BEACON_ROLE?0:1) - -#define LEGACY_ADV_PDU (1) -//#define PTS_TEST -#if (INGCHIPS_MESH_ENABLED) -#undef CLIENT_ENABLED -#undef SERVER_ENABLED -#if (INGCHIPS_PROXY_SERVER) -#define SERVER_ENABLED -#else -#define CLIENT_ENABLED -#endif -#endif -#define NETWORK_TEST (0) - -#define MYNEWT_VAL(x) MYNEWT_VAL_ ## x -#define NIMBLE_BLE_SM (1) - -#ifndef MYNEWT_VAL_BLE_SM_SC -#define MYNEWT_VAL_BLE_SM_SC (1) -#endif - -/*** compiler/arm-none-eabi-m4 */ -#ifndef MYNEWT_VAL_HARDFLOAT -#define MYNEWT_VAL_HARDFLOAT (0) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_SHELL -#define MYNEWT_VAL_BLE_MESH_SHELL (0) -#endif -#ifndef MYNEWT_VAL_BLE_MESH_CFG_CLI -#define MYNEWT_VAL_BLE_MESH_CFG_CLI (0) -#endif -#ifndef MYNEWT_VAL_BLE_MESH_HEALTH_CLI -#define MYNEWT_VAL_BLE_MESH_HEALTH_CLI (0) -#endif -#ifndef MYNEWT_VAL_BLE_MESH_CFG_SRV -#define MYNEWT_VAL_BLE_MESH_CFG_SRV (1) -#endif -#ifndef MYNEWT_VAL_SHELL_CMD_ARGC_MAX -#define MYNEWT_VAL_SHELL_CMD_ARGC_MAX (5) -#endif -#ifndef MYNEWT_VAL_SHELL_CMD_ARGC_MAX -#define MYNEWT_VAL_SHELL_CMD_ARGC_MAX (5) -#endif - -#ifndef MYNEWT_VAL_MSYS_1_BLOCK_COUNT -#define MYNEWT_VAL_MSYS_1_BLOCK_COUNT (24) -#endif - -#ifndef MYNEWT_VAL_MSYS_1_BLOCK_SIZE -#define MYNEWT_VAL_MSYS_1_BLOCK_SIZE (200) -#endif - -#ifndef MYNEWT_VAL_MSYS_2_BLOCK_COUNT -#define MYNEWT_VAL_MSYS_2_BLOCK_COUNT (0) -#endif - -#ifndef MYNEWT_VAL_MSYS_2_BLOCK_SIZE -#define MYNEWT_VAL_MSYS_2_BLOCK_SIZE (0) -#endif -#ifndef MYNEWT_VAL_OS_MAIN_STACK_SIZE -#define MYNEWT_VAL_OS_MAIN_STACK_SIZE (1024) -#endif -#ifndef MYNEWT_VAL_OS_MAIN_TASK_PRIO -#define MYNEWT_VAL_OS_MAIN_TASK_PRIO (127) -#endif - -#ifndef MYNEWT_VAL_OS_MEMPOOL_CHECK -#define MYNEWT_VAL_OS_MEMPOOL_CHECK (0) -#endif - -#ifndef MYNEWT_VAL_OS_MEMPOOL_POISON -#define MYNEWT_VAL_OS_MEMPOOL_POISON (0) -#endif - -#ifndef MYNEWT_VAL_OS_SCHEDULING -#define MYNEWT_VAL_OS_SCHEDULING (1) -#endif - -#ifndef MYNEWT_VAL_OS_SYSVIEW -#define MYNEWT_VAL_OS_SYSVIEW (0) -#endif - -#ifndef MYNEWT_VAL_SANITY_INTERVAL -#define MYNEWT_VAL_SANITY_INTERVAL (15000) -#endif - -#ifndef MYNEWT_VAL_WATCHDOG_INTERVAL -#define MYNEWT_VAL_WATCHDOG_INTERVAL (30000) -#endif - -/*** libc/baselibc */ -#ifndef MYNEWT_VAL_BASELIBC_ASSERT_FILE_LINE -#define MYNEWT_VAL_BASELIBC_ASSERT_FILE_LINE (0) -#endif - -#ifndef MYNEWT_VAL_BASELIBC_PRESENT -#define MYNEWT_VAL_BASELIBC_PRESENT (1) -#endif - -/*** nimble */ -#ifndef MYNEWT_VAL_BLE_EXT_ADV -#define MYNEWT_VAL_BLE_EXT_ADV (1) -#endif - -#ifndef MYNEWT_VAL_BLE_EXT_ADV_MAX_SIZE -#define MYNEWT_VAL_BLE_EXT_ADV_MAX_SIZE (31) -#endif - -#ifndef MYNEWT_VAL_BLE_HS_DEBUG -#define MYNEWT_VAL_BLE_HS_DEBUG (0) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH -#define MYNEWT_VAL_BLE_MESH (0) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_MODEL_KEY_COUNT -#define MYNEWT_VAL_BLE_MESH_MODEL_KEY_COUNT (2) -#endif - -#ifndef MYNEWT_VAL_CONFIG_BT_MESH_MODEL_KEY_COUNT -#define MYNEWT_VAL_CONFIG_BT_MESH_MODEL_KEY_COUNT (2) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_MODEL_GROUP_COUNT -#define MYNEWT_VAL_BLE_MESH_MODEL_GROUP_COUNT (2) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_APP_KEY_COUNT -#define MYNEWT_VAL_BLE_MESH_APP_KEY_COUNT (4) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_SUBNET_COUNT -#define MYNEWT_VAL_BLE_MESH_SUBNET_COUNT (2) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_CRPL -#define MYNEWT_VAL_BLE_MESH_CRPL (2) -#endif - - -#ifndef MYNEWT_VAL_BLE_MESH_TX_SEG_MAX -#define MYNEWT_VAL_BLE_MESH_TX_SEG_MAX (6) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_TX_SEG_MSG_COUNT -#define MYNEWT_VAL_BLE_MESH_TX_SEG_MSG_COUNT (16) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_RX_SEG_MSG_COUNT -#define MYNEWT_VAL_BLE_MESH_RX_SEG_MSG_COUNT (4) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LABEL_COUNT -#define MYNEWT_VAL_BLE_MESH_LABEL_COUNT (3) -#endif - - -#ifndef MYNEWT_VAL_BLE_MESH_RELAY -#define MYNEWT_VAL_BLE_MESH_RELAY (1) -#endif - - -#ifndef MYNEWT_VAL_BLE_MESH_FRIEND -#define MYNEWT_VAL_BLE_MESH_FRIEND (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LOW_POWER -#define MYNEWT_VAL_BLE_MESH_LOW_POWER (0) -#endif - -#ifndef MYNEWT_VAL_CONFIG_BT_SETTINGS -#define MYNEWT_VAL_CONFIG_BT_SETTINGS (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_SEG_RX -#define MYNEWT_VAL_BLE_MESH_FRIEND_SEG_RX (8) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_SUB_LIST_SIZE -#define MYNEWT_VAL_BLE_MESH_FRIEND_SUB_LIST_SIZE (4) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_GROUPS -#define MYNEWT_VAL_BLE_MESH_LPN_GROUPS (2) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_LPN_COUNT -#define MYNEWT_VAL_BLE_MESH_FRIEND_LPN_COUNT (4) -#endif -#if (FLASH_ENABLE) -#ifndef MYNEWT_VAL_BLE_MESH_SETTINGS -#define MYNEWT_VAL_BLE_MESH_SETTINGS (1) -#endif -#else -#ifndef MYNEWT_VAL_BLE_MESH_SETTINGS -#define MYNEWT_VAL_BLE_MESH_SETTINGS (0) -#endif -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_TESTING -#define MYNEWT_VAL_BLE_MESH_TESTING (0) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_ADV_BUF_COUNT -#define MYNEWT_VAL_BLE_MESH_ADV_BUF_COUNT (18) -#endif - - -#ifndef MYNEWT_VAL_BLE_MESH_RX_SDU_MAX -#define MYNEWT_VAL_BLE_MESH_RX_SDU_MAX (150) -#endif - - -#ifndef MYNEWT_VAL_BLE_MESH_MSG_CACHE_SIZE -#define MYNEWT_VAL_BLE_MESH_MSG_CACHE_SIZE (4) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_IV_UPDATE_TEST -#define MYNEWT_VAL_BLE_MESH_IV_UPDATE_TEST (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_IVU_DIVIDER -#define MYNEWT_VAL_BLE_MESH_IVU_DIVIDER (2) //need to check the value -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_NODE_ID_TIMEOUT -#define MYNEWT_VAL_BLE_MESH_NODE_ID_TIMEOUT (30) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_DEVICE_NAME -#define MYNEWT_VAL_BLE_MESH_DEVICE_NAME "INGCHIPS-MESH-PROXY_SERVER" -#endif -#ifndef MYNEWT_VAL_BLE_MAX_CONNECTIONS -#define MYNEWT_VAL_BLE_MAX_CONNECTIONS (2) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_PROXY_FILTER_SIZE -#define MYNEWT_VAL_BLE_MESH_PROXY_FILTER_SIZE (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_PROV -#define MYNEWT_VAL_BLE_MESH_PROV (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_FRIEND -#define MYNEWT_VAL_BLE_MESH_FRIEND (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_MODEL -#define MYNEWT_VAL_BLE_MESH_DEBUG_MODEL (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_QUEUE_SIZE -#define MYNEWT_VAL_BLE_MESH_FRIEND_QUEUE_SIZE (16) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_RECV_WIN -#define MYNEWT_VAL_BLE_MESH_FRIEND_RECV_WIN (3) -#endif - - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_RETRY_TIMEOUT -#define MYNEWT_VAL_BLE_MESH_LPN_RETRY_TIMEOUT (20000) //todo :check the resonable value -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_ESTABLISHMENT -#define MYNEWT_VAL_BLE_MESH_LPN_ESTABLISHMENT (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_MIN_QUEUE_SIZE -#define MYNEWT_VAL_BLE_MESH_LPN_MIN_QUEUE_SIZE (2) //todo:check the resonable value -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_RSSI_FACTOR -#define MYNEWT_VAL_BLE_MESH_LPN_RSSI_FACTOR (0) //todo:check the resonable value -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_RECV_WIN_FACTOR -#define MYNEWT_VAL_BLE_MESH_LPN_RECV_WIN_FACTOR (0) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_RECV_DELAY -#define MYNEWT_VAL_BLE_MESH_LPN_RECV_DELAY (20) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_POLL_TIMEOUT -#define MYNEWT_VAL_BLE_MESH_LPN_POLL_TIMEOUT (100) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_SCAN_LATENCY -#define MYNEWT_VAL_BLE_MESH_LPN_SCAN_LATENCY (10) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_AUTO -#define MYNEWT_VAL_BLE_MESH_LPN_AUTO (0) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_LPN_INIT_POLL_TIMEOUT -#define MYNEWT_VAL_BLE_MESH_LPN_INIT_POLL_TIMEOUT (100) -#endif - -#ifndef MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES -#define MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES (2) -#endif - -#ifndef MYNEWT_VAL_TRNG -#define MYNEWT_VAL_TRNG (0) -#endif -#ifndef MYNEWT_VAL_BLE_MESH_SHELL_MODELS -#define MYNEWT_VAL_BLE_MESH_SHELL_MODELS (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_SEQ_STORE_RATE -#define MYNEWT_VAL_BLE_MESH_SEQ_STORE_RATE (1) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_RPL_STORE_TIMEOUT -#define MYNEWT_VAL_BLE_MESH_RPL_STORE_TIMEOUT (2000) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_STORE_TIMEOUT -#define MYNEWT_VAL_BLE_MESH_STORE_TIMEOUT (2000) -#endif - -#ifndef MYNEWT_VAL_BLE_MESH_DEV_UUID -#define MYNEWT_VAL_BLE_MESH_DEV_UUID ((uint8_t[16]){0xA8, 0x01, 0x61,0x00,0x04,0x20,0x30,0x75,0x9a,0x00,0x07,0xda,0x78,0x00,0x00,0x00}) -#endif - -#ifndef MYNEWT_VAL_MESH_ELEMENT_COUNT -#define MYNEWT_VAL_MESH_ELEMENT_COUNT (4) -#endif -#endif diff --git a/bundles/mesh/inc/utils.h b/bundles/mesh/inc/utils.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/bundles/typical/ING9188xx/meta.json b/bundles/typical/ING9188xx/meta.json index 878f75eb8..a9c3670d9 100644 --- a/bundles/typical/ING9188xx/meta.json +++ b/bundles/typical/ING9188xx/meta.json @@ -108,6 +108,7 @@ "hci_add_event_handler", "hci_register_acl_packet_handler", "hci_power_control", + "platform_trace_raw", "platform_set_evt_callback", "platform_set_irq_callback", "platform_get_version", @@ -117,9 +118,13 @@ "platform_switch_app", "platform_write_persistent_reg", "platform_read_persistent_reg", - "platform_config", "platform_shutdown", + "platform_config", + "platform_read_info", + "platform_calibrate_32k", "platform_hrng", + "platform_rand", + "platform_get_us_time", "platform_printf", "sysSetPublicDeviceAddr", "platform_set_rf_clk_source", @@ -206,6 +211,9 @@ "kv_value_modified", "kv_commit", "kv_visit", + "btstack_memory_pool_create", + "btstack_memory_pool_get", + "btstack_memory_pool_free", "xQueueGenericSend", "xQueuePeek", "xQueuePeekFromISR", @@ -242,6 +250,7 @@ "vTaskSuspendAll", "xTaskResumeAll", "xTaskGetTickCount", + "xTaskGetTickCountFromISR", "xTaskIncrementTick", "vTaskPlaceOnEventList", "vTaskPlaceOnEventListRestricted", @@ -261,27 +270,32 @@ "xTimerCreate", "xTimerCreateStatic", "pvTimerGetTimerID", + "xTimerGetExpiryTime", "xTimerCreateTimerTask", "xTimerGenericCommand", "pxPortInitialiseStack", "pvPortMalloc", "vPortFree", - "xPortStartScheduler" + "xPortStartScheduler", + "vPortEnterCritical", + "vPortExitCritical", + "vPortSuppressTicksAndSleep", + "vPortValidateInterruptPriority" ], "app": { "base": 155648 }, "ram": { "base": 536870912, - "size": 30488 + "size": 32536 }, "rom": { "base": 16384, - "size": 134316 + "size": 135904 }, "version": [ 1, 0, - 1 + 8 ] } \ No newline at end of file diff --git a/bundles/typical/ING9188xx/platform.bin b/bundles/typical/ING9188xx/platform.bin index d8648ba223df185a642b4f217197ffd2812949cc..6ff29c79911588425c897e2c87ad487616d5a1d9 100644 GIT binary patch delta 68519 zcma&Od3+Q_`afRXb0$oZ$w?B1&@(xhgaDI(7y`m1gw6zk1Ox=-7!GxY%L!fyqBB8` zK}7E^6>tGaPOLhD+RKU3Dh{iubr5*9fd`g{yn+-%~vS@$>!s@q^c-yQ}MX zs_Lny-p^5e>{<24e^j&C&Yf)K9mi)PH2xfe*1#{}D+X<^Mko`mdiaeTc&2INZ@QLAd5Y%f ze=n)-S;4NB z?1Lu3VStE6QiN&Gg-76ez+mA0Q(civcE)d)}T`Dzat7hS*p02 zj|u;b;Ms$w<55ZX&Q_3c1aS;`AzDvjV^uR)KRU{g&ZwR@+VY4afQ&+~qX(g%$FfL{ z5GS)Bo0h~tV7mi& zW^z{Y8{M9#+U-3*Yt2gXN;h7YJS|T_PR54y$UA9bOnCLEZvu-(o{!ecc_sN{0DqOd zm|Y&il__ts*j}x^fxsv=dh9_w|+0`LTw9`yVQXgZuo}WoePSX#L;f{TI zFX&>zgpjq#RO8C~xX%dvpC3cqFMV1Dad$iL%G8%~U6B@>Y$wuxa-Px3Era-Jd3GMz zhLR&8%%z!t54wO4(ux*d5Vh|w5;H;wz3?zX4msjd4ybR}9+dB8-;}i>@|7s(*}aHE zq$$kt*YggZj}UV^I}MSKx~`XV)c)`PxGOympG)7caz@C-Zv$2t!)y5*pmu6V4s++! zqR|(6zdg?~hx$=UHGezLeiajL4KejzrkbgVJmq8sH zf-!*&YYP(ms5J5GL<7o?3Ht;4k7OK@v1eoZ*Jr=UG70+&hcq(mOCoO5aheT>7w}^} zd47gi0{EnE)QlyeH@3pCzOsOy;(_aum@w~f`>GONU6X7o8yXcpj(Bz$Yg+cTZ}sm` zn_8+zpZ2UuHYs3C`nJBY)#!(}-b~8^zS9&F#^cFDGb=w7GySoVsxR;6XY<8FX`L08 zn2>+iv#Mk$)X7JM7bAPbiLSn_?W@{FZ7aJ!?@C<&jQ!H{Oa6TW1+a3-?@4qh%&YW!B^S^7AV* zf<2-VxfHTC^;zZK95Pl^cIe1lk>N8ujGu95cwjalk5-!wcaZ?SQ?w1H(&l7-M{*AN zJS-O@DMmhrlmzkm0*>=UmFO2A*Ic&VU46dS&Rd6OlkS+(P{!L}m@2~fP{CdDm{1?U z*@Ze5IyJ6v8uI~eDICeXjo&S-qDhwu=V@cY0rB?k>`o`NO~Tjpq-Dj7diR6Y2Y1#*aha_r>~h_=odW=>B@S zUWRtdhyxEAKD<0De7q0sD(CgQjPTLJH|}df2XEYm1Ml9rmq+o6;os#(g>^xfH`Slu z=J=kU9cDz5yVSgbObX$J#!_~82tR4GG7fyvSjE=F@TlU|1xZH@O(kAnjjAk5gDEN~ zjxrqQ*dxl9mh;8DM;8?y3*aNg)$E3Gm@TPhmg1=;!_sC&CiRRwAFGn{Oq0tR0!1_TP}P zNoG{}bpAMbr(?Ks4Kadd7{VMy(0TZl*sLSz^&8$FnuBxZ{_655jm2ZLAU~k-z(Ln zzfqS>stY!rrei9mH;cRs>mDImzxp7E-&QpqY)W$Kh(%QQp!{5rqeDn(4DJ!#u;@mn zJ(%s4kr|;B@}HoVJRM}XnD9!B(k0`v$d)6HgGmp9AJg|C%c2JF1gTCs@pD z8oIN{v{;2V3wD~0YT0Q|H9F1lut{=sqogz-lwf9U>G)5k4~CpNI)u0n4Ix_&HF1N< z@uRROLXTXll;l<1QdXF}FQh$73}@)(^)M{>f}r4>MP%S`;&F`Q0E?hmVb90xT>!C&W;l?G*dR2UJ%?AS^+33l4C zldxm#ttnB?hP(`S(x8CX|A^xE#y-iM#Z|XF%03dpM{dc=mRnM5TB>DVGF-M*#=-2s z@9wpLp3dA->KsCLg|yRU2Bh~`8Ey!9DrB|F`!!55Wj3b%ifaYRH}DDV2^JmMD=O<) zPFqIb&{Rdc5>j6lbwD`$jDb?K>wx53BK(xWQdCjJ0nI(h-HzJ zhp_HeojjLx2JpmN3!FnN$vo0Ct`w3b=8`>uEaDe!d^+4(DZk1Zx_jVU`R<{NpQEI|dk0K+Kw z;d~Ka0FY8~aTDqcu-aP!1!yqY6?uYJTyzhl7$Id_$Rn>vlUMpYxfSSNp2C%>4W_D%ib>*qt)NRJB82y-kJ!@BW#iL#^mrYoL^5R2lP z@pBT-M3**SfJa{xzdHV2_N6FJtenlRi{izVo7iXs|5*7jdpUv^PSCOcge`VLZr1l9 zz~3R;a(}aN9rUVWb(K@+ zO`SQXvd~oC1Y-MEY`CpbIUnGwbpl>?+r#YUz4)u!3`$oei_{Y^J84|*rtlBkb`ew; zk@0L7S#wgqj4|?q$(unudy?7tUJS5fPdcB-YY#F!Ymt$6gU2K|-3hg753*9)YuD4D zUhP45r-rvf6$^v%y&PQU2jy?trF=Vs>P}kPFXf}PxuudFH=bS6vo&6~MV3ICq=aJ= zaPH*XlJ{?w+Jth;q+}26$3cWCeR1mMLAtt!tH6sVm#__$_{qtW=;foyx$K`q_@~JR z76v8JypKH^!AH!7QLWGtt(65`qE&nnQPEAG<#h?RS>nf|S?e@gwRM}V#px6~9ks2GZ3PII%j{nGLV6Psn*OPD2M&CAU)p|WTX zR+HPJ|4qIyJn#S5#SO{^~U}Z>^MQaFvu{eWSxjbRg~A zO=*pyF5Y8zyg`Yz?innpLCm>DRLvF=eYN~U)LwerC zvoFfX*bo98FuG$N7wSXk+^zUuH51uqK%1MIQR#;Y`lFS*~_~K#MH#GxqoLZDy2Mrl{88mb<2r2_8t>l$?T(Ixht@y-L3!5Fn z8a_MM2Zetd2$u9k<3q?zz?1ka);s~vCjY6z~gFnvF-`@quQ61 zuK3HfmfS20-2T?@_ad~eQIR*1(#@FV~gR#r+vvj1^cp&A=Y3#3j?F=YAGp`D?nw z&i(tw^AyXI+NkiyBbnsa2yUImvty(9+%)5)55tLc>}nBt_5Fh)(;z2X0-LMRXGY$? zag&(c`sy|Yl;E)NhtP$-Z-3yLSmRH<6xMTm7U>J&Nw@1#v&a&usr~z^_zFOZBk`)+ zhvsFG2SQ~qMToo@V<5ZC|C2xchc!P;{UL|^A&6hUy(T?}3=K0KsCD@>hG*&^OH|0l zk=w_}vxqi?$4)PuokhM0v%LD&!~5E|d2CUkJ%aSN{J`wB>9WY?Q2Tb~O|*;SY4NDw zi?na&_(6soQXL%AH^^`B3w{n-zcYAvpMJ+m9VNIoi1$r5u%ATm=hG{pnaU8(n877I z5o_O;C2gTm(2J{Pq=WWg3*q@QMpb5!JHx=MzWoCfBm)8{2BernHV6LvlYYmt9jkP& zbLjajGUa#qf?<4YMiFxt?wc_pqee7)4~jB0)L`8@L@K;8fQx3X01EymfS;LZX7cbq zXAaJ24G;QBnvJbgfU5aS@=FK@XBG_0BwvQIy-ZV%_gO%=^WeAC{i=IswX7HEqryG- zw)zqBOmZNEJMYNGo9Z*zSyB9AeIBGe9Zx$`uZ4l(V5RuCs6aVGWE9;0)JIX7j?a|Z zx-W#44WppU%n+_gG)ZI{!l|woLh#Zn$UZ?wN z5MO90f-3w$oH45aZrXx);;bU=uR(dg6;TNs72faKeJfr!YgFc}KUSXQ3Vc zc~)N5LtS9-0%+N?4a|)jDPqqgQ-kJFnUliY{DUyzA&=a|^VR<+-aWfEc_kMXj^b@|hpBk zHK35N9@vI#vV1vcz!tD){5?9{LC5fiaK{?6uHzozCxn1;UcU2j_Ut`4Z+=$xkQm_j zriN|{tooxMf2{W;dP2hb7@j_VHro)xp7|Lplz4CcB=)~i;G7JcxPW8NL~-eYds#3= zP+od_K{>mg-d3=S;(12hm7AR!l_QytYs!YTD8gD4d+6-i!q|FO7AppD(_PbP&40aX zRQ6+`{HA5@LdQKWwsSmei!h*7ndF%sthqavS%HV&J;v~Bt9TB&^I-)4`EG+DE!yD)`xTef zwy|2TS!AKw*#s!P+V!sYy*CHJ=2LExDo@MR%Pi{vs+Rj6W`@5#KN!ZOCpdFz`nl)4@T6jmT3-bZMsi%dWHh6|3ziHWH97p- zpo|Z9dDSnJhzjjHx{iG%BIAj9(x6_IxHZX9&ipfDQ=LIv;3X=BKo|LOr4e{k*@Udgke_>iTn#TTj#5@T1n8 z%)dlsi1jh06V6rny9avnJl<p$aKDlfxYFmcCDwWR<=X!OZ=C_>%(B(@EU_)OFJH3ef%~Ys z+cpItRSo>60_x=P!z;$JZBhL8ipq*lE0lgsU5Aaicno>2B5huU()~r>|BpKI?pfK8 zPBH?@e8!;ACs@)+FrcpUiWT~uVr6Reg%;54S$&IRlVtZwC$}F)Xf)U^Xw@&-P^S~!;dJos;Ou*K3YuGu>+i|LGw(f=7!=xq9G_197{qD! zm9SzHo^;%ERZj)F5R=q4yVaYay0pie& zQ&}hH(n-mobI{n$V@1ch@O6a1B&V-(F^;On;{d4@jygI`f0tG7t2HkNm13YRhFUwcx<(4$EBdTz1 za?l+=jhu%(EK)$8p#Un9c||@8hC&78+7MMjE{`Z{i03?WR4(QFeO>mO>iPicl1X{m z`?KX9`Bhiht@w-8x0`b-GqHG>7TeG{=02YBXG8{%E)&jnyX(zxI=BTCP@2G`>FwTHUYUMDa+e6r})?oUd zAlJ--jX1^MAsSj??bfoebuaGXR#r9Z3CFi2c{#FAY5Ppgb3%UZ`{bCC9WjzrSOgYo|S&-fl z!T)h&k3A6)$L9FiPfR&lLqOOa(T+`nCpC$&rksHAbOi2@+HcBXKWX8$B2yX=Hb!to zvaU8vjTQ^FcPG0ZEwsl7OylY+M;_sqr*n2{PKZ^7BY`#O3{MOl&~-A8^I3e^6@mQB(SnAUl-d{UrhD836d=Yd-p#c zy^U6#xM5P(EU+rmYUs#ziuVqTEMB}}QpR9#JJ;-EO4UBF=7Yy3C_ER$og3zX=5|j2 zCq7nUPN#l)m^+7=A&(pZ12`xxAlq8)gfv`(%0rj7wtJNJl4xOCBFP zHa}L;4aRvxa+$n88HvJ>nA%H)d3@#Dz>_4iu(mXB6-C*Nr1gAmVsYC6Vi1do6jXH7~*MKtzsz)U< zA9xIwvKB4))WHD*7P5sa={RUW0e>0C9?x8y!n=6N?di~lB3O0FU2eYC!f4^?r$EYd z*tm3su39gxh2y(wIk)*zq|6Nfm2+>N8xy)>$Xn>*+{(JmbB~J%wsp!|seb|3540^@ ziSKfjuoI$qi_^p!qPWYcVt8oFYnooFW__vILLVJOgcd`7nZ;~JM!ja3mShyC?bCt7;SK=pKp5i^sG~W={q2gDsV8Q3Q9kWIz=! zci~el#<34VU+6Bfk#FO7g4G3qo&;VKu!}qyQy_&egKP}kPZ*Wio93_L3xQP}L0qtr z%i0-}qjKMLy(mP&)No#afZ>Hv0a%4Lq=KWv(+ z2i6QUO7fPKP&Pu2Epx+Nl6?CxjW^@Qi;uXn$<}j%C}^EdgPxxDHxUqh$D- zfRg$X!ET>M-icz(7Q<~Ri~+^ZQ_7A8n6_H=tf@+J2@iX#=tQSla(Hc zOWvT+gja1Dp7k{>MH@8zZTR^1_G-D0-k%8Ljx9xnJ>ewj)zPqmZ*d!7w-JT!VjXTz zHPdV4C-u;*FX78uCZvdAB}(ws@RRFk+7^7<*1^Uvj?(+b!pt-6)r#Kg?T4z_UXwR5 z-yqewFpP}9_6CJ(VZ34M^dwQ394s4{jfwc|))|SD2I&1JgiGDe={^XlK{*KuABNcc zskWutSMrHmM=ecxBZR+mm#U6{oC^wtICa}?s;{Ef?O{QI=WZLO{P2Bk&y|UI{kBO{ z_lFpLr5}++q1XNU0BGGIQF~h`O`>QrM6{TFV3-ieh|)exk*eMoqW6Pw zWZMwt37qrfaOZ+x#o@719kF115Sfs9yQlhYX%K&cb#SFODy$58yy*ZYM_8glM|cKp z**sh-^(J zxnYB0O7f!k)RU94AD8Ic0p&jJMPz?4+LHmR5}YD=PgNR@22{}e+Gt$Lg@o>IFfqaF zE3g9pejK4MyYTv_7J}0A#Z$wEDZ9xU9^cgoG<3qiP9U)-` z9{Tj6oIN4dui!R|RcNzV?MTd5y@~X4kOe0&e!5ou?~oamn>U32^>jtq^8r+-k~+}_ zW}jAZB;)%cOmKy#^vPjjH{;v4uQHl~Ux^@@OTY3d^O1g~1e8`w z??*zZzx3WK1yz9w_`B_uIoSbJq?MY;3CN*|iOAx$ZjTC2;Ie1Zhh7$u@qDj#1}Z>D z=Za&I%d5C}QdQAx^+ts|@zQ5TunqU)XP(KWmp7j&F%1si>ecgEFvMwLJGBnA1cloJ zfQx)jyFPJ!YHbmOAiRPH?<`}5 zD4w>nl=Vk()6SBVl`*<2ei?hrZ`&RbKEU3c!X0ZevH(i)+6AN0mGY=mG0CgD-6{S;n{*K0=y8oWrK z;2+Oxpzm7(Sj0vq0qb{9&bTbXmOLE!+2JLC!Rc#=`+9Jt*(I7YVH?bj3Q8Rm@r%z+XH2;7+5ANi2=%l0gcUX?s^1;oF1Lun zI+6NTDenh_Nk<+82}zB*F@Xo?cQHQ*s#q$bQms$Vr-Hy83QIpAv__KQ{woku6dO1I z8w7<)eBX0B8m@q#Sg03-*MfzPb0X3%wRVXRfze`yQm=+ssYXG#6076WJt^e*sMbLD znM5QA_XO`-5fxg)$zIfEvU2>#eGo^GkNM|kr_|iWqQbQZ9ot7O+%Mrbo*%|MjsN!i zRHtwxyCQ{j9tE`$f+RA1g7BYkqNPDBMDx8Z%}lYn*CTE*n=du$r%!3Qzr7lLdGbC= zups>FeFtpm#`ORJ^jb0!Yy#AboCV6M3iOm_*h5WLg>S0Y)6`L|2EV@wCW!${>XV=z zOMru`zfwPCT|&DkY!2UJ`%{y@saW$wH99Bb6T0iKprsTCk}8EkOIo1v8+MR;?DtaL zoHnN6SsE<)Xyn_8-jI=R2e=I+ z)Xo5~Xuh7J5KY^ZvWWzzdKF!RviLZgEzl8Mfa4*34;L{LX z8SXqFy}mwL2h0z?;}7}lg&=PF!zj5RFd}~Q4+ZS6G3@)ps8J=BZG6d0pEw~E?Q9h% zGuwg5(b0M0aIM0?TpF2b`q@~h% zrUSit^>WHsDDkn`%A_+-te^JS^2-W#+CwetPpnU^DRdgVp-Y$9P;9YGafT#JL+$l}b&(FH}^tTrpC1PR%KSCqC;-9Lb!Mb50Otka;33;+S4d8b$w7 zkKNdf^c4^&`cura)Z+EqE4-fN?e>ps*2{V9M^=v=`4jy-y$*#a>#!OSuyuKS`KiE> zJkax7OapzF_@X$$H>hc&bNOW@yYZ1!kr`n#T@!vi;us|LSp$&>o53Fc$4N!oniKYy zjz#)SVv$zwR1-~zYdIh$A^oH38ne!|kEXGJuU@t|$3wKX(xtNK`3zGE$qmWjE(`85 zVNIlvC!eh=pPViiTDzw zGl2?q^}3lZzLZBt?*t>CWq&JJE*1TZB0-gZ=J?%Bv0|>brFp!!ys1@eLmd~vsZ#^I zpk_H0c_+rARNqcF!|AWYW|_-&x`yggAJ`}+xweR`t9>83DCbbVjC2QA=+veE{92Mr zpfAzUyTag4U(Pn|Ldkrh=}%$`>affDHS+OIs2LF%>u6$$FJg6c*qb5c*yR@11Sx-m z5cXHf2HTepn zV7m4e^(!*6BUs1zA86MtAt2cMHL`3`#wE@%>ynJZ*NFRGbhKI>!yWa6QU6_(yOiW0 z#Ko5_ELk|qe5^l(HS5~vXpPst=J``RytgXJYw(_mkzCkyZp!7H(^Y--Yq`I8;cvyn zuTM!uo{ku)0Ra{gV%27Z)Mh#x8dw!ib|QTemqL0&AVBq6xceBQz&S%z9n*15Fh)FX z2#-@9yIiY9!&>&eBPz9@h{@J2dxhx}F%5kpW;J{w=2|}y^IT4CF>?-vND`&J>&n{& zz$IUZos7}?ym){yHg-4n??=RmjE!CPmen7EsrVTDO+Z?`85Uk{gweZ2M$6F&L1r)& zx85sL@zD{4(VNnFkyU?tUOneq2v8Z`d_csBo`u8UMZFR{%bns!U^Htq zpb#6{*@?Jp$9&g&;x4?^GdUxdfjbUY|LGztV?L8zb&c6~KmN)yCs7w6`w@tY#3-(4 zFHamELDJ)YBKX1feCB@K)?TS{Bdg;*aU1@!eRNipovuXPOa-sz=7H2|7z;6kVVw7B zu4-heerc;%h9|#TSTVBdgqUQ;VwvfV2a6?}4a#T9PvB3EuMO?Njm@Y8Y(4!Aa+lbq z?G&FvD$*9iFTct=T{ey&Gs9Om?@}^nVKvtxo4Z=*rB*l7!Hug>exgR6%44muP9w)p+3TQ{XSyWq!J4 z0ROrGqu^gi3UtB0rnhz_PiQw1l=&TUq=q{e-)9Z zLsY^~4ZlQ>qMsX7t}Kh1fO)jY)aYpD2!|Yv9V<=Nx0n6A5_SK& z%(x15k6Jz-B>E)qPQ;d66V~@&*Pe{oi=r<6H9NzN9EvW&#;i{vKLxv>sSID4?WAZ- zEoTv-QB3@&jx5ps??R>vhylfhVC4TVGq~{5blY_#*N@@*HeL zX7wh~fNYOJpfn=uXc$4PUd6j?+dEOeJfRgF5Ny9Dv7VqogF0m7afrD{;!-<-njNTM zyQnnN)CWRTPe<2;cLOF^yeUX!l+X2b+CPCk zrt>M4UkP1HB*R3;1}R#X`yDYA3>YflvGk~;`B(yl6wiz0XglDAIty*0LDV-OP67Pb z(J1GPE9QfybWM08fH%CJ>zrt56{j+r#A)b@^E&3_c_q^(ssJ#^*cU_)u$NnyEO66I z378{y>{E&}30WzKi1D^TXL<8%e;;*{&YudJK^FZF` z#Wi&K>d{4{t*Ge~>yUqoWr}|p7(ItV$7_OZK(w3WQffHJ=%y)}x8EyA&@qWeu@N^SAZGwB2OCtXhHhSg#ZWaU_ z1eKqPQP8r6focKBJIs_BCw0?i(|J@Z_t7ZIY#7(KyC|Ln$+cwc^f@AT>?LuP9+fQV zebQZz$9JSNm3T(S*rA8M7dN!B7pqkX7q=?MtbYrXcHodDsSua&P8WW;Bg>fpXUG
    m8Eb5xpJX=N$0CzoMf8W#M%9gvpLba^PCEE2+ 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 PsY(=87sOPdUpe`Io#eC$ delta 67805 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 ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 -0x00006329 T att_dispatch_client_can_send_now -0x0000632f T att_dispatch_client_request_can_send_now_event -0x00006335 T att_dispatch_register_client -0x00006349 T att_dispatch_register_server -0x0000635d T att_dispatch_server_can_send_now -0x00006363 T att_dispatch_server_request_can_send_now_event -0x00006421 T att_emit_general_event -0x00006b59 T att_server_can_send_packet_now -0x00006b5d T att_server_get_mtu -0x00006bd1 T att_server_indicate -0x00006c55 T att_server_init -0x00006c91 T att_server_notify -0x00006d79 T att_server_register_packet_handler -0x00006d85 T att_server_request_can_send_now_event -0x00006da1 T att_set_db -0x00006db5 T att_set_read_callback -0x00006dc1 T att_set_write_callback -0x00006f05 T bd_addr_cmp -0x00006f0b T bd_addr_copy -0x00006f15 T bd_addr_to_str -0x00006f4d T big_endian_read_16 -0x00006f55 T big_endian_read_32 -0x00006f69 T big_endian_store_16 -0x00006f75 T big_endian_store_32 -0x000072f9 T btstack_push_user_msg -0x00007565 T char_for_nibble -0x000077f5 T eTaskConfirmSleepModeStatus -0x00007e99 T gap_add_dev_to_periodic_list -0x00007eb1 T gap_add_whitelist -0x00007ec5 T gap_aes_encrypt -0x00007eed T gap_clear_white_lists -0x00007efd T gap_clr_adv_set -0x00007f0d T gap_clr_periodic_adv_list -0x00007f39 T gap_create_connection_cancel -0x00007f49 T gap_default_periodic_adv_sync_transfer_param -0x00007f61 T gap_disconnect -0x00007f8d T gap_disconnect_all -0x00008035 T gap_ext_create_connection -0x000080f9 T gap_get_connection_parameter_range -0x00008135 T gap_le_read_channel_map -0x000081a9 T gap_periodic_adv_create_sync -0x000081cd T gap_periodic_adv_create_sync_cancel -0x000081dd T gap_periodic_adv_set_info_transfer -0x000081f5 T gap_periodic_adv_sync_transfer -0x0000820d T gap_periodic_adv_sync_transfer_param -0x00008229 T gap_periodic_adv_term_sync -0x000082bd T gap_read_antenna_info -0x000082cd T gap_read_periodic_adv_list_size -0x000082dd T gap_read_phy -0x000082f1 T gap_read_remote_info -0x00008305 T gap_read_remote_used_features -0x00008319 T gap_read_rssi -0x0000832d T gap_remove_whitelist -0x000083b9 T gap_rmv_adv_set -0x000083cd T gap_rmv_dev_from_periodic_list -0x0000840d T gap_set_adv_set_random_addr -0x00008459 T gap_set_connection_cte_request_enable -0x00008475 T gap_set_connection_cte_response_enable -0x00008489 T gap_set_connection_cte_rx_param -0x000084e5 T gap_set_connection_cte_tx_param -0x00008539 T gap_set_connection_parameter_range -0x00008551 T gap_set_connectionless_cte_tx_enable -0x00008565 T gap_set_connectionless_cte_tx_param -0x000085c5 T gap_set_connectionless_iq_sampling_enable -0x00008629 T gap_set_def_phy -0x00008641 T gap_set_ext_adv_data -0x00008659 T gap_set_ext_adv_enable -0x000086d5 T gap_set_ext_adv_para -0x000087b5 T gap_set_ext_scan_enable -0x000087cd T gap_set_ext_scan_para -0x00008875 T gap_set_ext_scan_response_data -0x0000888d T gap_set_host_channel_classification -0x000088a1 T gap_set_periodic_adv_data -0x00008915 T gap_set_periodic_adv_enable -0x00008929 T gap_set_periodic_adv_para -0x00008941 T gap_set_periodic_adv_rx_enable -0x00008955 T gap_set_phy -0x00008971 T gap_set_random_device_address -0x000089d5 T gap_start_ccm -0x00008a09 T gap_update_connection_parameters -0x00008ef1 T gatt_client_cancel_write -0x00008f17 T gatt_client_discover_characteristic_descriptors -0x00008f59 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x00008fa9 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x00008ff9 T gatt_client_discover_characteristics_for_service -0x0000902f T gatt_client_discover_primary_services -0x00009061 T gatt_client_discover_primary_services_by_uuid128 -0x000090a5 T gatt_client_discover_primary_services_by_uuid16 -0x000090e1 T gatt_client_execute_write -0x00009107 T gatt_client_find_included_services_for_service -0x00009135 T gatt_client_get_mtu -0x000091dd T gatt_client_is_ready -0x000091f3 T gatt_client_listen_for_characteristic_value_updates -0x00009217 T gatt_client_prepare_write -0x00009255 T gatt_client_pts_suppress_mtu_exchange -0x00009261 T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x0000928b T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x00009291 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x000092bf T gatt_client_read_long_value_of_characteristic_using_value_handle -0x000092c5 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x000092f3 T gatt_client_read_multiple_characteristic_values -0x00009323 T gatt_client_read_value_of_characteristic_using_value_handle -0x00009351 T gatt_client_read_value_of_characteristics_by_uuid128 -0x0000939d T gatt_client_read_value_of_characteristics_by_uuid16 -0x000093e9 T gatt_client_register_handler -0x000093f5 T gatt_client_reliable_write_long_value_of_characteristic -0x00009821 T gatt_client_signed_write_without_response -0x000098e5 T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x0000991f T gatt_client_write_client_characteristic_configuration -0x00009971 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x00009981 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x000099bd T gatt_client_write_long_value_of_characteristic -0x000099cd T gatt_client_write_long_value_of_characteristic_with_offset -0x00009a09 T gatt_client_write_value_of_characteristic -0x00009a3f T gatt_client_write_value_of_characteristic_without_response -0x0000af19 T hci_add_event_handler -0x0000b6c9 T hci_power_control -0x0000b87d T hci_register_acl_packet_handler -0x0000bec1 T kv_commit -0x0000bef9 T kv_get -0x0000bf11 T kv_init -0x0000bf61 T kv_put -0x0000bfd9 T kv_remove -0x0000c015 T kv_remove_all -0x0000c059 T kv_value_modified -0x0000c05d T kv_visit -0x0000c11d T l2cap_can_send_fixed_channel_packet_now -0x0000c121 T l2cap_can_send_packet_now -0x0000c2d9 T l2cap_create_channel -0x0000c411 T l2cap_disconnect -0x0000c6b5 T l2cap_get_remote_mtu_for_local_cid -0x0000cb35 T l2cap_init -0x0000cb7d T l2cap_le_send_flow_control_credit -0x0000cde1 T l2cap_max_le_mtu -0x0000cde5 T l2cap_max_mtu -0x0000cde9 T l2cap_next_local_cid -0x0000cdf9 T l2cap_next_sig_id -0x0000ce91 T l2cap_register_fixed_channel -0x0000cead T l2cap_register_packet_handler -0x0000ceb9 T l2cap_register_service -0x0000cfa1 T l2cap_request_can_send_fix_channel_now_event -0x0000cfc5 T l2cap_request_can_send_now_event -0x0000cfdf T l2cap_request_connection_parameter_update -0x0000d011 T l2cap_require_security_level_2_for_outgoing_sdp -0x0000d3d5 T l2cap_send -0x0000d44d T l2cap_send_connectionless -0x0000d4dd T l2cap_send_connectionless3 -0x0000d575 T l2cap_send_echo_request -0x0000d5d9 T l2cap_send_signaling_le -0x0000d631 T l2cap_unregister_service -0x0000d815 T ll_hint_on_ce_len -0x0000daf9 T ll_set_adv_coded_scheme -0x0000db29 T ll_set_def_antenna -0x0000db45 T ll_set_initiating_coded_scheme -0x0001d925 T nibble_for_char -0x0001d9c9 T platform_config -0x0001da31 T platform_get_heap_status -0x0001da49 T platform_get_version -0x0001da51 T platform_hrng -0x0001da59 T platform_patch_rf_init_data -0x0001da75 T platform_printf -0x0001da89 T platform_raise_assertion -0x0001da9d T platform_read_persistent_reg -0x0001daad T platform_reset -0x0001dae1 T platform_set_evt_callback -0x0001daf5 T platform_set_irq_callback -0x0001db2d T platform_set_rf_clk_source -0x0001db39 T platform_set_rf_init_data -0x0001db45 T platform_set_rf_power_mapping -0x0001db51 T platform_shutdown -0x0001db55 T platform_switch_app -0x0001db81 T platform_write_persistent_reg -0x0001db91 T printf_hexdump -0x0001e68d T pvPortMalloc -0x0001e775 T pvTaskIncrementMutexHeldCount -0x0001e78d T pvTimerGetTimerID -0x0001e7b9 T pxPortInitialiseStack -0x0001e979 T reverse_128 -0x0001e97f T reverse_24 -0x0001e985 T reverse_48 -0x0001e98b T reverse_56 -0x0001e991 T reverse_64 -0x0001e997 T reverse_bd_addr -0x0001e99d T reverse_bytes -0x0001eb41 T sm_add_event_handler -0x0001ec6d T sm_address_resolution_lookup -0x0001ed47 T sm_authenticated -0x0001ed55 T sm_authorization_decline -0x0001ed75 T sm_authorization_grant -0x0001ed95 T sm_authorization_state -0x0001edb1 T sm_bonding_decline -0x0001f189 T sm_config -0x0001f295 T sm_encryption_key_size -0x0001fa65 T sm_just_works_confirm -0x0001fcb5 T sm_le_device_key -0x0001fd4d T sm_passkey_input -0x000200d9 T sm_private_random_address_generation_get -0x000200e1 T sm_private_random_address_generation_get_mode -0x000200ed T sm_private_random_address_generation_set_mode -0x00020115 T sm_private_random_address_generation_set_update_period -0x0002014d T sm_register_oob_data_callback -0x00020159 T sm_request_pairing -0x00020b93 T sm_send_security_request -0x00020bb9 T sm_set_accepted_stk_generation_methods -0x00020bc5 T sm_set_authentication_requirements -0x00020bd1 T sm_set_encryption_key_size_range -0x00020ea5 T sscanf_bd_addr -0x000211f9 T sysSetPublicDeviceAddr -0x000217c9 T uuid128_to_str -0x00021821 T uuid_add_bluetooth_prefix -0x00021841 T uuid_has_bluetooth_prefix -0x00021885 T uxQueueMessagesWaiting -0x000218ad T uxQueueMessagesWaitingFromISR -0x000218c9 T uxQueueSpacesAvailable -0x000219f9 T vPortFree -0x00021bb9 T vQueueDelete -0x00021be5 T vQueueWaitForMessageRestricted -0x00021c2d T vTaskDelay -0x00021c79 T vTaskInternalSetTimeOutState -0x00021c89 T vTaskMissedYield -0x00021c95 T vTaskPlaceOnEventList -0x00021ccd T vTaskPlaceOnEventListRestricted -0x00021d0d T vTaskPriorityDisinheritAfterTimeout -0x00021db9 T vTaskStartScheduler -0x00021e49 T vTaskStepTick -0x00021e79 T vTaskSuspendAll -0x00021e89 T vTaskSwitchContext -0x00021f31 T xPortStartScheduler -0x00021fed T xQueueAddToSet -0x00022011 T xQueueCreateCountingSemaphore -0x0002204d T xQueueCreateCountingSemaphoreStatic -0x00022091 T xQueueCreateMutex -0x000220a7 T xQueueCreateMutexStatic -0x000220c1 T xQueueCreateSet -0x000220c9 T xQueueGenericCreate -0x00022115 T xQueueGenericCreateStatic -0x0002217d T xQueueGenericReset -0x00022209 T xQueueGenericSend -0x00022375 T xQueueGenericSendFromISR -0x00022435 T xQueueGiveFromISR -0x000224d9 T xQueueGiveMutexRecursive -0x00022519 T xQueueIsQueueEmptyFromISR -0x0002253d T xQueueIsQueueFullFromISR -0x00022565 T xQueuePeek -0x0002268d T xQueuePeekFromISR -0x000226f9 T xQueueReceive -0x00022825 T xQueueReceiveFromISR -0x000228b9 T xQueueRemoveFromSet -0x000228db T xQueueSelectFromSet -0x000228ed T xQueueSelectFromSetFromISR -0x00022901 T xQueueSemaphoreTake -0x00022a6d T xQueueTakeMutexRecursive -0x00022ab1 T xTaskCheckForTimeOut -0x00022b21 T xTaskCreate -0x00022b7d T xTaskCreateStatic -0x00022bed T xTaskGetCurrentTaskHandle -0x00022bf9 T xTaskGetSchedulerState -0x00022c15 T xTaskGetTickCount -0x00022c21 T xTaskIncrementTick -0x00022ced T xTaskPriorityDisinherit -0x00022d81 T xTaskPriorityInherit -0x00022e15 T xTaskRemoveFromEventList -0x00022e95 T xTaskResumeAll -0x00022f5d T xTimerCreate -0x00022f91 T xTimerCreateStatic -0x00022fc9 T xTimerCreateTimerTask -0x00023035 T xTimerGenericCommand +0x00005ab9 T att_dispatch_client_can_send_now +0x00005abf T att_dispatch_client_request_can_send_now_event +0x00005ac5 T att_dispatch_register_client +0x00005ad9 T att_dispatch_register_server +0x00005aed T att_dispatch_server_can_send_now +0x00005af3 T att_dispatch_server_request_can_send_now_event +0x00005bb1 T att_emit_general_event +0x000062e9 T att_server_can_send_packet_now +0x000062ed T att_server_get_mtu +0x00006361 T att_server_indicate +0x000063e5 T att_server_init +0x00006421 T att_server_notify +0x00006509 T att_server_register_packet_handler +0x00006515 T att_server_request_can_send_now_event +0x00006531 T att_set_db +0x00006545 T att_set_read_callback +0x00006551 T att_set_write_callback +0x00006695 T bd_addr_cmp +0x0000669b T bd_addr_copy +0x000066a5 T bd_addr_to_str +0x000066dd T big_endian_read_16 +0x000066e5 T big_endian_read_32 +0x000066f9 T big_endian_store_16 +0x00006705 T big_endian_store_32 +0x000069d9 T btstack_memory_pool_create +0x00006a01 T btstack_memory_pool_free +0x00006a61 T btstack_memory_pool_get +0x00006a89 T btstack_push_user_msg +0x00006d01 T char_for_nibble +0x00006f91 T eTaskConfirmSleepModeStatus +0x000076a5 T gap_add_dev_to_periodic_list +0x000076bd T gap_add_whitelist +0x000076d1 T gap_aes_encrypt +0x000076f9 T gap_clear_white_lists +0x00007709 T gap_clr_adv_set +0x00007719 T gap_clr_periodic_adv_list +0x00007745 T gap_create_connection_cancel +0x00007755 T gap_default_periodic_adv_sync_transfer_param +0x0000776d T gap_disconnect +0x00007799 T gap_disconnect_all +0x00007841 T gap_ext_create_connection +0x00007905 T gap_get_connection_parameter_range +0x00007941 T gap_le_read_channel_map +0x000079b5 T gap_periodic_adv_create_sync +0x000079d9 T gap_periodic_adv_create_sync_cancel +0x000079e9 T gap_periodic_adv_set_info_transfer +0x00007a01 T gap_periodic_adv_sync_transfer +0x00007a19 T gap_periodic_adv_sync_transfer_param +0x00007a35 T gap_periodic_adv_term_sync +0x00007ac9 T gap_read_antenna_info +0x00007ad9 T gap_read_periodic_adv_list_size +0x00007ae9 T gap_read_phy +0x00007afd T gap_read_remote_info +0x00007b11 T gap_read_remote_used_features +0x00007b25 T gap_read_rssi +0x00007b39 T gap_remove_whitelist +0x00007bc5 T gap_rmv_adv_set +0x00007bd9 T gap_rmv_dev_from_periodic_list +0x00007c19 T gap_set_adv_set_random_addr +0x00007c65 T gap_set_connection_cte_request_enable +0x00007c81 T gap_set_connection_cte_response_enable +0x00007c95 T gap_set_connection_cte_rx_param +0x00007cf1 T gap_set_connection_cte_tx_param +0x00007d45 T gap_set_connection_parameter_range +0x00007d5d T gap_set_connectionless_cte_tx_enable +0x00007d71 T gap_set_connectionless_cte_tx_param +0x00007dd1 T gap_set_connectionless_iq_sampling_enable +0x00007e35 T gap_set_def_phy +0x00007e4d T gap_set_ext_adv_data +0x00007e65 T gap_set_ext_adv_enable +0x00007ee1 T gap_set_ext_adv_para +0x00007fc1 T gap_set_ext_scan_enable +0x00007fd9 T gap_set_ext_scan_para +0x00008081 T gap_set_ext_scan_response_data +0x00008099 T gap_set_host_channel_classification +0x000080ad T gap_set_periodic_adv_data +0x00008121 T gap_set_periodic_adv_enable +0x00008135 T gap_set_periodic_adv_para +0x0000814d T gap_set_periodic_adv_rx_enable +0x00008161 T gap_set_phy +0x0000817d T gap_set_random_device_address +0x000081e1 T gap_start_ccm +0x00008215 T gap_update_connection_parameters +0x000086fd T gatt_client_cancel_write +0x00008723 T gatt_client_discover_characteristic_descriptors +0x00008765 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 +0x000087b5 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 +0x00008805 T gatt_client_discover_characteristics_for_service +0x0000883b T gatt_client_discover_primary_services +0x0000886d T gatt_client_discover_primary_services_by_uuid128 +0x000088b1 T gatt_client_discover_primary_services_by_uuid16 +0x000088ed T gatt_client_execute_write +0x00008913 T gatt_client_find_included_services_for_service +0x00008941 T gatt_client_get_mtu +0x000089e9 T gatt_client_is_ready +0x000089ff T gatt_client_listen_for_characteristic_value_updates +0x00008a23 T gatt_client_prepare_write +0x00008a61 T gatt_client_pts_suppress_mtu_exchange +0x00008a6d T gatt_client_read_characteristic_descriptor_using_descriptor_handle +0x00008a97 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle +0x00008a9d T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00008acb T gatt_client_read_long_value_of_characteristic_using_value_handle +0x00008ad1 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset +0x00008aff T gatt_client_read_multiple_characteristic_values +0x00008b2f T gatt_client_read_value_of_characteristic_using_value_handle +0x00008b5d T gatt_client_read_value_of_characteristics_by_uuid128 +0x00008ba9 T gatt_client_read_value_of_characteristics_by_uuid16 +0x00008bf5 T gatt_client_register_handler +0x00008c01 T gatt_client_reliable_write_long_value_of_characteristic +0x0000902d T gatt_client_signed_write_without_response +0x000090f1 T gatt_client_write_characteristic_descriptor_using_descriptor_handle +0x0000912b T gatt_client_write_client_characteristic_configuration +0x0000917d T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle +0x0000918d T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x000091c9 T gatt_client_write_long_value_of_characteristic +0x000091d9 T gatt_client_write_long_value_of_characteristic_with_offset +0x00009215 T gatt_client_write_value_of_characteristic +0x0000924b T gatt_client_write_value_of_characteristic_without_response +0x0000a725 T hci_add_event_handler +0x0000aed5 T hci_power_control +0x0000b089 T hci_register_acl_packet_handler +0x0000b6d5 T kv_commit +0x0000b72d T kv_get +0x0000b745 T kv_init +0x0000b7ad T kv_put +0x0000b825 T kv_remove +0x0000b861 T kv_remove_all +0x0000b8a5 T kv_value_modified +0x0000b8a9 T kv_visit +0x0000b969 T l2cap_can_send_fixed_channel_packet_now +0x0000b96d T l2cap_can_send_packet_now +0x0000bb25 T l2cap_create_channel +0x0000bc5d T l2cap_disconnect +0x0000bf01 T l2cap_get_remote_mtu_for_local_cid +0x0000c381 T l2cap_init +0x0000c3c9 T l2cap_le_send_flow_control_credit +0x0000c62d T l2cap_max_le_mtu +0x0000c631 T l2cap_max_mtu +0x0000c635 T l2cap_next_local_cid +0x0000c645 T l2cap_next_sig_id +0x0000c6dd T l2cap_register_fixed_channel +0x0000c6f9 T l2cap_register_packet_handler +0x0000c705 T l2cap_register_service +0x0000c7ed T l2cap_request_can_send_fix_channel_now_event +0x0000c811 T l2cap_request_can_send_now_event +0x0000c82b T l2cap_request_connection_parameter_update +0x0000c85d T l2cap_require_security_level_2_for_outgoing_sdp +0x0000cc21 T l2cap_send +0x0000cc99 T l2cap_send_connectionless +0x0000cd29 T l2cap_send_connectionless3 +0x0000cdc1 T l2cap_send_echo_request +0x0000ce25 T l2cap_send_signaling_le +0x0000ce7d T l2cap_unregister_service +0x0000d061 T ll_hint_on_ce_len +0x0000d345 T ll_set_adv_coded_scheme +0x0000d375 T ll_set_def_antenna +0x0000d391 T ll_set_initiating_coded_scheme +0x0001daa1 T nibble_for_char +0x0001db57 T platform_calibrate_32k +0x0001db5d T platform_config +0x0001dc05 T platform_get_heap_status +0x0001dc1d T platform_get_us_time +0x0001dc21 T platform_get_version +0x0001dc29 T platform_hrng +0x0001dc31 T platform_patch_rf_init_data +0x0001dc3d T platform_printf +0x0001dc51 T platform_raise_assertion +0x0001dc65 T platform_rand +0x0001dc69 T platform_read_info +0x0001dc85 T platform_read_persistent_reg +0x0001dc95 T platform_reset +0x0001dcc9 T platform_set_evt_callback +0x0001dcdd T platform_set_irq_callback +0x0001dd15 T platform_set_rf_clk_source +0x0001dd21 T platform_set_rf_init_data +0x0001dd2d T platform_set_rf_power_mapping +0x0001dd39 T platform_shutdown +0x0001dd3d T platform_switch_app +0x0001dd69 T platform_trace_raw +0x0001dd7d T platform_write_persistent_reg +0x0001dd8d T printf_hexdump +0x0001e889 T pvPortMalloc +0x0001e971 T pvTaskIncrementMutexHeldCount +0x0001e989 T pvTimerGetTimerID +0x0001e9b5 T pxPortInitialiseStack +0x0001eb95 T reverse_128 +0x0001eb9b T reverse_24 +0x0001eba1 T reverse_48 +0x0001eba7 T reverse_56 +0x0001ebad T reverse_64 +0x0001ebb3 T reverse_bd_addr +0x0001ebb9 T reverse_bytes +0x0001ee59 T sm_add_event_handler +0x0001ef85 T sm_address_resolution_lookup +0x0001f05f T sm_authenticated +0x0001f06d T sm_authorization_decline +0x0001f08d T sm_authorization_grant +0x0001f0ad T sm_authorization_state +0x0001f0c9 T sm_bonding_decline +0x0001f4a1 T sm_config +0x0001f5ad T sm_encryption_key_size +0x0001fd7d T sm_just_works_confirm +0x0001ffcd T sm_le_device_key +0x00020065 T sm_passkey_input +0x000203f1 T sm_private_random_address_generation_get +0x000203f9 T sm_private_random_address_generation_get_mode +0x00020405 T sm_private_random_address_generation_set_mode +0x0002042d T sm_private_random_address_generation_set_update_period +0x00020465 T sm_register_oob_data_callback +0x00020471 T sm_request_pairing +0x00020eab T sm_send_security_request +0x00020ed1 T sm_set_accepted_stk_generation_methods +0x00020edd T sm_set_authentication_requirements +0x00020ee9 T sm_set_encryption_key_size_range +0x000211e5 T sscanf_bd_addr +0x00021501 T sysSetPublicDeviceAddr +0x00021bdd T uuid128_to_str +0x00021c35 T uuid_add_bluetooth_prefix +0x00021c55 T uuid_has_bluetooth_prefix +0x00021c99 T uxQueueMessagesWaiting +0x00021cc1 T uxQueueMessagesWaitingFromISR +0x00021cdd T uxQueueSpacesAvailable +0x00021da1 T vPortEnterCritical +0x00021de1 T vPortExitCritical +0x00021e0d T vPortFree +0x00021ea1 T vPortSuppressTicksAndSleep +0x00021f79 T vPortValidateInterruptPriority +0x00021fcd T vQueueDelete +0x00021ff9 T vQueueWaitForMessageRestricted +0x00022041 T vTaskDelay +0x0002208d T vTaskInternalSetTimeOutState +0x0002209d T vTaskMissedYield +0x000220a9 T vTaskPlaceOnEventList +0x000220e1 T vTaskPlaceOnEventListRestricted +0x00022121 T vTaskPriorityDisinheritAfterTimeout +0x000221cd T vTaskStartScheduler +0x0002225d T vTaskStepTick +0x0002228d T vTaskSuspendAll +0x0002229d T vTaskSwitchContext +0x00022345 T xPortStartScheduler +0x00022401 T xQueueAddToSet +0x00022425 T xQueueCreateCountingSemaphore +0x00022461 T xQueueCreateCountingSemaphoreStatic +0x000224a5 T xQueueCreateMutex +0x000224bb T xQueueCreateMutexStatic +0x000224d5 T xQueueCreateSet +0x000224dd T xQueueGenericCreate +0x00022529 T xQueueGenericCreateStatic +0x00022591 T xQueueGenericReset +0x0002261d T xQueueGenericSend +0x00022789 T xQueueGenericSendFromISR +0x00022849 T xQueueGiveFromISR +0x000228ed T xQueueGiveMutexRecursive +0x0002292d T xQueueIsQueueEmptyFromISR +0x00022951 T xQueueIsQueueFullFromISR +0x00022979 T xQueuePeek +0x00022aa1 T xQueuePeekFromISR +0x00022b0d T xQueueReceive +0x00022c39 T xQueueReceiveFromISR +0x00022ccd T xQueueRemoveFromSet +0x00022cef T xQueueSelectFromSet +0x00022d01 T xQueueSelectFromSetFromISR +0x00022d15 T xQueueSemaphoreTake +0x00022e81 T xQueueTakeMutexRecursive +0x00022ec5 T xTaskCheckForTimeOut +0x00022f35 T xTaskCreate +0x00022f91 T xTaskCreateStatic +0x00023001 T xTaskGetCurrentTaskHandle +0x0002300d T xTaskGetSchedulerState +0x00023029 T xTaskGetTickCount +0x00023035 T xTaskGetTickCountFromISR +0x00023045 T xTaskIncrementTick +0x00023111 T xTaskPriorityDisinherit +0x000231a5 T xTaskPriorityInherit +0x00023239 T xTaskRemoveFromEventList +0x000232b9 T xTaskResumeAll +0x00023381 T xTimerCreate +0x000233b5 T xTimerCreateStatic +0x000233ed T xTimerCreateTimerTask +0x00023459 T xTimerGenericCommand +0x000234c9 T xTimerGetExpiryTime diff --git a/bundles/typical/ING9188xx/symdefs.s b/bundles/typical/ING9188xx/symdefs.s index 384075cd2..0804fa498 100644 --- a/bundles/typical/ING9188xx/symdefs.s +++ b/bundles/typical/ING9188xx/symdefs.s @@ -1,267 +1,281 @@ ---defsym:att_dispatch_client_can_send_now=0x00006329 ---defsym:att_dispatch_client_request_can_send_now_event=0x0000632f ---defsym:att_dispatch_register_client=0x00006335 ---defsym:att_dispatch_register_server=0x00006349 ---defsym:att_dispatch_server_can_send_now=0x0000635d ---defsym:att_dispatch_server_request_can_send_now_event=0x00006363 ---defsym:att_emit_general_event=0x00006421 ---defsym:att_server_can_send_packet_now=0x00006b59 ---defsym:att_server_get_mtu=0x00006b5d ---defsym:att_server_indicate=0x00006bd1 ---defsym:att_server_init=0x00006c55 ---defsym:att_server_notify=0x00006c91 ---defsym:att_server_register_packet_handler=0x00006d79 ---defsym:att_server_request_can_send_now_event=0x00006d85 ---defsym:att_set_db=0x00006da1 ---defsym:att_set_read_callback=0x00006db5 ---defsym:att_set_write_callback=0x00006dc1 ---defsym:bd_addr_cmp=0x00006f05 ---defsym:bd_addr_copy=0x00006f0b ---defsym:bd_addr_to_str=0x00006f15 ---defsym:big_endian_read_16=0x00006f4d ---defsym:big_endian_read_32=0x00006f55 ---defsym:big_endian_store_16=0x00006f69 ---defsym:big_endian_store_32=0x00006f75 ---defsym:btstack_push_user_msg=0x000072f9 ---defsym:char_for_nibble=0x00007565 ---defsym:eTaskConfirmSleepModeStatus=0x000077f5 ---defsym:gap_add_dev_to_periodic_list=0x00007e99 ---defsym:gap_add_whitelist=0x00007eb1 ---defsym:gap_aes_encrypt=0x00007ec5 ---defsym:gap_clear_white_lists=0x00007eed ---defsym:gap_clr_adv_set=0x00007efd ---defsym:gap_clr_periodic_adv_list=0x00007f0d ---defsym:gap_create_connection_cancel=0x00007f39 ---defsym:gap_default_periodic_adv_sync_transfer_param=0x00007f49 ---defsym:gap_disconnect=0x00007f61 ---defsym:gap_disconnect_all=0x00007f8d ---defsym:gap_ext_create_connection=0x00008035 ---defsym:gap_get_connection_parameter_range=0x000080f9 ---defsym:gap_le_read_channel_map=0x00008135 ---defsym:gap_periodic_adv_create_sync=0x000081a9 ---defsym:gap_periodic_adv_create_sync_cancel=0x000081cd ---defsym:gap_periodic_adv_set_info_transfer=0x000081dd ---defsym:gap_periodic_adv_sync_transfer=0x000081f5 ---defsym:gap_periodic_adv_sync_transfer_param=0x0000820d ---defsym:gap_periodic_adv_term_sync=0x00008229 ---defsym:gap_read_antenna_info=0x000082bd ---defsym:gap_read_periodic_adv_list_size=0x000082cd ---defsym:gap_read_phy=0x000082dd ---defsym:gap_read_remote_info=0x000082f1 ---defsym:gap_read_remote_used_features=0x00008305 ---defsym:gap_read_rssi=0x00008319 ---defsym:gap_remove_whitelist=0x0000832d ---defsym:gap_rmv_adv_set=0x000083b9 ---defsym:gap_rmv_dev_from_periodic_list=0x000083cd ---defsym:gap_set_adv_set_random_addr=0x0000840d ---defsym:gap_set_connection_cte_request_enable=0x00008459 ---defsym:gap_set_connection_cte_response_enable=0x00008475 ---defsym:gap_set_connection_cte_rx_param=0x00008489 ---defsym:gap_set_connection_cte_tx_param=0x000084e5 ---defsym:gap_set_connection_parameter_range=0x00008539 ---defsym:gap_set_connectionless_cte_tx_enable=0x00008551 ---defsym:gap_set_connectionless_cte_tx_param=0x00008565 ---defsym:gap_set_connectionless_iq_sampling_enable=0x000085c5 ---defsym:gap_set_def_phy=0x00008629 ---defsym:gap_set_ext_adv_data=0x00008641 ---defsym:gap_set_ext_adv_enable=0x00008659 ---defsym:gap_set_ext_adv_para=0x000086d5 ---defsym:gap_set_ext_scan_enable=0x000087b5 ---defsym:gap_set_ext_scan_para=0x000087cd ---defsym:gap_set_ext_scan_response_data=0x00008875 ---defsym:gap_set_host_channel_classification=0x0000888d ---defsym:gap_set_periodic_adv_data=0x000088a1 ---defsym:gap_set_periodic_adv_enable=0x00008915 ---defsym:gap_set_periodic_adv_para=0x00008929 ---defsym:gap_set_periodic_adv_rx_enable=0x00008941 ---defsym:gap_set_phy=0x00008955 ---defsym:gap_set_random_device_address=0x00008971 ---defsym:gap_start_ccm=0x000089d5 ---defsym:gap_update_connection_parameters=0x00008a09 ---defsym:gatt_client_cancel_write=0x00008ef1 ---defsym:gatt_client_discover_characteristic_descriptors=0x00008f17 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00008f59 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00008fa9 ---defsym:gatt_client_discover_characteristics_for_service=0x00008ff9 ---defsym:gatt_client_discover_primary_services=0x0000902f ---defsym:gatt_client_discover_primary_services_by_uuid128=0x00009061 ---defsym:gatt_client_discover_primary_services_by_uuid16=0x000090a5 ---defsym:gatt_client_execute_write=0x000090e1 ---defsym:gatt_client_find_included_services_for_service=0x00009107 ---defsym:gatt_client_get_mtu=0x00009135 ---defsym:gatt_client_is_ready=0x000091dd ---defsym:gatt_client_listen_for_characteristic_value_updates=0x000091f3 ---defsym:gatt_client_prepare_write=0x00009217 ---defsym:gatt_client_pts_suppress_mtu_exchange=0x00009255 ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00009261 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x0000928b ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009291 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x000092bf ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x000092c5 ---defsym:gatt_client_read_multiple_characteristic_values=0x000092f3 ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00009323 ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00009351 ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x0000939d ---defsym:gatt_client_register_handler=0x000093e9 ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x000093f5 ---defsym:gatt_client_signed_write_without_response=0x00009821 ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x000098e5 ---defsym:gatt_client_write_client_characteristic_configuration=0x0000991f ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009971 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009981 ---defsym:gatt_client_write_long_value_of_characteristic=0x000099bd ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x000099cd ---defsym:gatt_client_write_value_of_characteristic=0x00009a09 ---defsym:gatt_client_write_value_of_characteristic_without_response=0x00009a3f ---defsym:hci_add_event_handler=0x0000af19 ---defsym:hci_power_control=0x0000b6c9 ---defsym:hci_register_acl_packet_handler=0x0000b87d ---defsym:kv_commit=0x0000bec1 ---defsym:kv_get=0x0000bef9 ---defsym:kv_init=0x0000bf11 ---defsym:kv_put=0x0000bf61 ---defsym:kv_remove=0x0000bfd9 ---defsym:kv_remove_all=0x0000c015 ---defsym:kv_value_modified=0x0000c059 ---defsym:kv_visit=0x0000c05d ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c11d ---defsym:l2cap_can_send_packet_now=0x0000c121 ---defsym:l2cap_create_channel=0x0000c2d9 ---defsym:l2cap_disconnect=0x0000c411 ---defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c6b5 ---defsym:l2cap_init=0x0000cb35 ---defsym:l2cap_le_send_flow_control_credit=0x0000cb7d ---defsym:l2cap_max_le_mtu=0x0000cde1 ---defsym:l2cap_max_mtu=0x0000cde5 ---defsym:l2cap_next_local_cid=0x0000cde9 ---defsym:l2cap_next_sig_id=0x0000cdf9 ---defsym:l2cap_register_fixed_channel=0x0000ce91 ---defsym:l2cap_register_packet_handler=0x0000cead ---defsym:l2cap_register_service=0x0000ceb9 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0000cfa1 ---defsym:l2cap_request_can_send_now_event=0x0000cfc5 ---defsym:l2cap_request_connection_parameter_update=0x0000cfdf ---defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d011 ---defsym:l2cap_send=0x0000d3d5 ---defsym:l2cap_send_connectionless=0x0000d44d ---defsym:l2cap_send_connectionless3=0x0000d4dd ---defsym:l2cap_send_echo_request=0x0000d575 ---defsym:l2cap_send_signaling_le=0x0000d5d9 ---defsym:l2cap_unregister_service=0x0000d631 ---defsym:ll_hint_on_ce_len=0x0000d815 ---defsym:ll_set_adv_coded_scheme=0x0000daf9 ---defsym:ll_set_def_antenna=0x0000db29 ---defsym:ll_set_initiating_coded_scheme=0x0000db45 ---defsym:nibble_for_char=0x0001d925 ---defsym:platform_config=0x0001d9c9 ---defsym:platform_get_heap_status=0x0001da31 ---defsym:platform_get_version=0x0001da49 ---defsym:platform_hrng=0x0001da51 ---defsym:platform_patch_rf_init_data=0x0001da59 ---defsym:platform_printf=0x0001da75 ---defsym:platform_raise_assertion=0x0001da89 ---defsym:platform_read_persistent_reg=0x0001da9d ---defsym:platform_reset=0x0001daad ---defsym:platform_set_evt_callback=0x0001dae1 ---defsym:platform_set_irq_callback=0x0001daf5 ---defsym:platform_set_rf_clk_source=0x0001db2d ---defsym:platform_set_rf_init_data=0x0001db39 ---defsym:platform_set_rf_power_mapping=0x0001db45 ---defsym:platform_shutdown=0x0001db51 ---defsym:platform_switch_app=0x0001db55 ---defsym:platform_write_persistent_reg=0x0001db81 ---defsym:printf_hexdump=0x0001db91 ---defsym:pvPortMalloc=0x0001e68d ---defsym:pvTaskIncrementMutexHeldCount=0x0001e775 ---defsym:pvTimerGetTimerID=0x0001e78d ---defsym:pxPortInitialiseStack=0x0001e7b9 ---defsym:reverse_128=0x0001e979 ---defsym:reverse_24=0x0001e97f ---defsym:reverse_48=0x0001e985 ---defsym:reverse_56=0x0001e98b ---defsym:reverse_64=0x0001e991 ---defsym:reverse_bd_addr=0x0001e997 ---defsym:reverse_bytes=0x0001e99d ---defsym:sm_add_event_handler=0x0001eb41 ---defsym:sm_address_resolution_lookup=0x0001ec6d ---defsym:sm_authenticated=0x0001ed47 ---defsym:sm_authorization_decline=0x0001ed55 ---defsym:sm_authorization_grant=0x0001ed75 ---defsym:sm_authorization_state=0x0001ed95 ---defsym:sm_bonding_decline=0x0001edb1 ---defsym:sm_config=0x0001f189 ---defsym:sm_encryption_key_size=0x0001f295 ---defsym:sm_just_works_confirm=0x0001fa65 ---defsym:sm_le_device_key=0x0001fcb5 ---defsym:sm_passkey_input=0x0001fd4d ---defsym:sm_private_random_address_generation_get=0x000200d9 ---defsym:sm_private_random_address_generation_get_mode=0x000200e1 ---defsym:sm_private_random_address_generation_set_mode=0x000200ed ---defsym:sm_private_random_address_generation_set_update_period=0x00020115 ---defsym:sm_register_oob_data_callback=0x0002014d ---defsym:sm_request_pairing=0x00020159 ---defsym:sm_send_security_request=0x00020b93 ---defsym:sm_set_accepted_stk_generation_methods=0x00020bb9 ---defsym:sm_set_authentication_requirements=0x00020bc5 ---defsym:sm_set_encryption_key_size_range=0x00020bd1 ---defsym:sscanf_bd_addr=0x00020ea5 ---defsym:sysSetPublicDeviceAddr=0x000211f9 ---defsym:uuid128_to_str=0x000217c9 ---defsym:uuid_add_bluetooth_prefix=0x00021821 ---defsym:uuid_has_bluetooth_prefix=0x00021841 ---defsym:uxQueueMessagesWaiting=0x00021885 ---defsym:uxQueueMessagesWaitingFromISR=0x000218ad ---defsym:uxQueueSpacesAvailable=0x000218c9 ---defsym:vPortFree=0x000219f9 ---defsym:vQueueDelete=0x00021bb9 ---defsym:vQueueWaitForMessageRestricted=0x00021be5 ---defsym:vTaskDelay=0x00021c2d ---defsym:vTaskInternalSetTimeOutState=0x00021c79 ---defsym:vTaskMissedYield=0x00021c89 ---defsym:vTaskPlaceOnEventList=0x00021c95 ---defsym:vTaskPlaceOnEventListRestricted=0x00021ccd ---defsym:vTaskPriorityDisinheritAfterTimeout=0x00021d0d ---defsym:vTaskStartScheduler=0x00021db9 ---defsym:vTaskStepTick=0x00021e49 ---defsym:vTaskSuspendAll=0x00021e79 ---defsym:vTaskSwitchContext=0x00021e89 ---defsym:xPortStartScheduler=0x00021f31 ---defsym:xQueueAddToSet=0x00021fed ---defsym:xQueueCreateCountingSemaphore=0x00022011 ---defsym:xQueueCreateCountingSemaphoreStatic=0x0002204d ---defsym:xQueueCreateMutex=0x00022091 ---defsym:xQueueCreateMutexStatic=0x000220a7 ---defsym:xQueueCreateSet=0x000220c1 ---defsym:xQueueGenericCreate=0x000220c9 ---defsym:xQueueGenericCreateStatic=0x00022115 ---defsym:xQueueGenericReset=0x0002217d ---defsym:xQueueGenericSend=0x00022209 ---defsym:xQueueGenericSendFromISR=0x00022375 ---defsym:xQueueGiveFromISR=0x00022435 ---defsym:xQueueGiveMutexRecursive=0x000224d9 ---defsym:xQueueIsQueueEmptyFromISR=0x00022519 ---defsym:xQueueIsQueueFullFromISR=0x0002253d ---defsym:xQueuePeek=0x00022565 ---defsym:xQueuePeekFromISR=0x0002268d ---defsym:xQueueReceive=0x000226f9 ---defsym:xQueueReceiveFromISR=0x00022825 ---defsym:xQueueRemoveFromSet=0x000228b9 ---defsym:xQueueSelectFromSet=0x000228db ---defsym:xQueueSelectFromSetFromISR=0x000228ed ---defsym:xQueueSemaphoreTake=0x00022901 ---defsym:xQueueTakeMutexRecursive=0x00022a6d ---defsym:xTaskCheckForTimeOut=0x00022ab1 ---defsym:xTaskCreate=0x00022b21 ---defsym:xTaskCreateStatic=0x00022b7d ---defsym:xTaskGetCurrentTaskHandle=0x00022bed ---defsym:xTaskGetSchedulerState=0x00022bf9 ---defsym:xTaskGetTickCount=0x00022c15 ---defsym:xTaskIncrementTick=0x00022c21 ---defsym:xTaskPriorityDisinherit=0x00022ced ---defsym:xTaskPriorityInherit=0x00022d81 ---defsym:xTaskRemoveFromEventList=0x00022e15 ---defsym:xTaskResumeAll=0x00022e95 ---defsym:xTimerCreate=0x00022f5d ---defsym:xTimerCreateStatic=0x00022f91 ---defsym:xTimerCreateTimerTask=0x00022fc9 ---defsym:xTimerGenericCommand=0x00023035 +--defsym:att_dispatch_client_can_send_now=0x00005ab9 +--defsym:att_dispatch_client_request_can_send_now_event=0x00005abf +--defsym:att_dispatch_register_client=0x00005ac5 +--defsym:att_dispatch_register_server=0x00005ad9 +--defsym:att_dispatch_server_can_send_now=0x00005aed +--defsym:att_dispatch_server_request_can_send_now_event=0x00005af3 +--defsym:att_emit_general_event=0x00005bb1 +--defsym:att_server_can_send_packet_now=0x000062e9 +--defsym:att_server_get_mtu=0x000062ed +--defsym:att_server_indicate=0x00006361 +--defsym:att_server_init=0x000063e5 +--defsym:att_server_notify=0x00006421 +--defsym:att_server_register_packet_handler=0x00006509 +--defsym:att_server_request_can_send_now_event=0x00006515 +--defsym:att_set_db=0x00006531 +--defsym:att_set_read_callback=0x00006545 +--defsym:att_set_write_callback=0x00006551 +--defsym:bd_addr_cmp=0x00006695 +--defsym:bd_addr_copy=0x0000669b +--defsym:bd_addr_to_str=0x000066a5 +--defsym:big_endian_read_16=0x000066dd +--defsym:big_endian_read_32=0x000066e5 +--defsym:big_endian_store_16=0x000066f9 +--defsym:big_endian_store_32=0x00006705 +--defsym:btstack_memory_pool_create=0x000069d9 +--defsym:btstack_memory_pool_free=0x00006a01 +--defsym:btstack_memory_pool_get=0x00006a61 +--defsym:btstack_push_user_msg=0x00006a89 +--defsym:char_for_nibble=0x00006d01 +--defsym:eTaskConfirmSleepModeStatus=0x00006f91 +--defsym:gap_add_dev_to_periodic_list=0x000076a5 +--defsym:gap_add_whitelist=0x000076bd +--defsym:gap_aes_encrypt=0x000076d1 +--defsym:gap_clear_white_lists=0x000076f9 +--defsym:gap_clr_adv_set=0x00007709 +--defsym:gap_clr_periodic_adv_list=0x00007719 +--defsym:gap_create_connection_cancel=0x00007745 +--defsym:gap_default_periodic_adv_sync_transfer_param=0x00007755 +--defsym:gap_disconnect=0x0000776d +--defsym:gap_disconnect_all=0x00007799 +--defsym:gap_ext_create_connection=0x00007841 +--defsym:gap_get_connection_parameter_range=0x00007905 +--defsym:gap_le_read_channel_map=0x00007941 +--defsym:gap_periodic_adv_create_sync=0x000079b5 +--defsym:gap_periodic_adv_create_sync_cancel=0x000079d9 +--defsym:gap_periodic_adv_set_info_transfer=0x000079e9 +--defsym:gap_periodic_adv_sync_transfer=0x00007a01 +--defsym:gap_periodic_adv_sync_transfer_param=0x00007a19 +--defsym:gap_periodic_adv_term_sync=0x00007a35 +--defsym:gap_read_antenna_info=0x00007ac9 +--defsym:gap_read_periodic_adv_list_size=0x00007ad9 +--defsym:gap_read_phy=0x00007ae9 +--defsym:gap_read_remote_info=0x00007afd +--defsym:gap_read_remote_used_features=0x00007b11 +--defsym:gap_read_rssi=0x00007b25 +--defsym:gap_remove_whitelist=0x00007b39 +--defsym:gap_rmv_adv_set=0x00007bc5 +--defsym:gap_rmv_dev_from_periodic_list=0x00007bd9 +--defsym:gap_set_adv_set_random_addr=0x00007c19 +--defsym:gap_set_connection_cte_request_enable=0x00007c65 +--defsym:gap_set_connection_cte_response_enable=0x00007c81 +--defsym:gap_set_connection_cte_rx_param=0x00007c95 +--defsym:gap_set_connection_cte_tx_param=0x00007cf1 +--defsym:gap_set_connection_parameter_range=0x00007d45 +--defsym:gap_set_connectionless_cte_tx_enable=0x00007d5d +--defsym:gap_set_connectionless_cte_tx_param=0x00007d71 +--defsym:gap_set_connectionless_iq_sampling_enable=0x00007dd1 +--defsym:gap_set_def_phy=0x00007e35 +--defsym:gap_set_ext_adv_data=0x00007e4d +--defsym:gap_set_ext_adv_enable=0x00007e65 +--defsym:gap_set_ext_adv_para=0x00007ee1 +--defsym:gap_set_ext_scan_enable=0x00007fc1 +--defsym:gap_set_ext_scan_para=0x00007fd9 +--defsym:gap_set_ext_scan_response_data=0x00008081 +--defsym:gap_set_host_channel_classification=0x00008099 +--defsym:gap_set_periodic_adv_data=0x000080ad +--defsym:gap_set_periodic_adv_enable=0x00008121 +--defsym:gap_set_periodic_adv_para=0x00008135 +--defsym:gap_set_periodic_adv_rx_enable=0x0000814d +--defsym:gap_set_phy=0x00008161 +--defsym:gap_set_random_device_address=0x0000817d +--defsym:gap_start_ccm=0x000081e1 +--defsym:gap_update_connection_parameters=0x00008215 +--defsym:gatt_client_cancel_write=0x000086fd +--defsym:gatt_client_discover_characteristic_descriptors=0x00008723 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00008765 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x000087b5 +--defsym:gatt_client_discover_characteristics_for_service=0x00008805 +--defsym:gatt_client_discover_primary_services=0x0000883b +--defsym:gatt_client_discover_primary_services_by_uuid128=0x0000886d +--defsym:gatt_client_discover_primary_services_by_uuid16=0x000088b1 +--defsym:gatt_client_execute_write=0x000088ed +--defsym:gatt_client_find_included_services_for_service=0x00008913 +--defsym:gatt_client_get_mtu=0x00008941 +--defsym:gatt_client_is_ready=0x000089e9 +--defsym:gatt_client_listen_for_characteristic_value_updates=0x000089ff +--defsym:gatt_client_prepare_write=0x00008a23 +--defsym:gatt_client_pts_suppress_mtu_exchange=0x00008a61 +--defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00008a6d +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00008a97 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00008a9d +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00008acb +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00008ad1 +--defsym:gatt_client_read_multiple_characteristic_values=0x00008aff +--defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00008b2f +--defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00008b5d +--defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00008ba9 +--defsym:gatt_client_register_handler=0x00008bf5 +--defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00008c01 +--defsym:gatt_client_signed_write_without_response=0x0000902d +--defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x000090f1 +--defsym:gatt_client_write_client_characteristic_configuration=0x0000912b +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x0000917d +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x0000918d +--defsym:gatt_client_write_long_value_of_characteristic=0x000091c9 +--defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x000091d9 +--defsym:gatt_client_write_value_of_characteristic=0x00009215 +--defsym:gatt_client_write_value_of_characteristic_without_response=0x0000924b +--defsym:hci_add_event_handler=0x0000a725 +--defsym:hci_power_control=0x0000aed5 +--defsym:hci_register_acl_packet_handler=0x0000b089 +--defsym:kv_commit=0x0000b6d5 +--defsym:kv_get=0x0000b72d +--defsym:kv_init=0x0000b745 +--defsym:kv_put=0x0000b7ad +--defsym:kv_remove=0x0000b825 +--defsym:kv_remove_all=0x0000b861 +--defsym:kv_value_modified=0x0000b8a5 +--defsym:kv_visit=0x0000b8a9 +--defsym:l2cap_can_send_fixed_channel_packet_now=0x0000b969 +--defsym:l2cap_can_send_packet_now=0x0000b96d +--defsym:l2cap_create_channel=0x0000bb25 +--defsym:l2cap_disconnect=0x0000bc5d +--defsym:l2cap_get_remote_mtu_for_local_cid=0x0000bf01 +--defsym:l2cap_init=0x0000c381 +--defsym:l2cap_le_send_flow_control_credit=0x0000c3c9 +--defsym:l2cap_max_le_mtu=0x0000c62d +--defsym:l2cap_max_mtu=0x0000c631 +--defsym:l2cap_next_local_cid=0x0000c635 +--defsym:l2cap_next_sig_id=0x0000c645 +--defsym:l2cap_register_fixed_channel=0x0000c6dd +--defsym:l2cap_register_packet_handler=0x0000c6f9 +--defsym:l2cap_register_service=0x0000c705 +--defsym:l2cap_request_can_send_fix_channel_now_event=0x0000c7ed +--defsym:l2cap_request_can_send_now_event=0x0000c811 +--defsym:l2cap_request_connection_parameter_update=0x0000c82b +--defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000c85d +--defsym:l2cap_send=0x0000cc21 +--defsym:l2cap_send_connectionless=0x0000cc99 +--defsym:l2cap_send_connectionless3=0x0000cd29 +--defsym:l2cap_send_echo_request=0x0000cdc1 +--defsym:l2cap_send_signaling_le=0x0000ce25 +--defsym:l2cap_unregister_service=0x0000ce7d +--defsym:ll_hint_on_ce_len=0x0000d061 +--defsym:ll_set_adv_coded_scheme=0x0000d345 +--defsym:ll_set_def_antenna=0x0000d375 +--defsym:ll_set_initiating_coded_scheme=0x0000d391 +--defsym:nibble_for_char=0x0001daa1 +--defsym:platform_calibrate_32k=0x0001db57 +--defsym:platform_config=0x0001db5d +--defsym:platform_get_heap_status=0x0001dc05 +--defsym:platform_get_us_time=0x0001dc1d +--defsym:platform_get_version=0x0001dc21 +--defsym:platform_hrng=0x0001dc29 +--defsym:platform_patch_rf_init_data=0x0001dc31 +--defsym:platform_printf=0x0001dc3d +--defsym:platform_raise_assertion=0x0001dc51 +--defsym:platform_rand=0x0001dc65 +--defsym:platform_read_info=0x0001dc69 +--defsym:platform_read_persistent_reg=0x0001dc85 +--defsym:platform_reset=0x0001dc95 +--defsym:platform_set_evt_callback=0x0001dcc9 +--defsym:platform_set_irq_callback=0x0001dcdd +--defsym:platform_set_rf_clk_source=0x0001dd15 +--defsym:platform_set_rf_init_data=0x0001dd21 +--defsym:platform_set_rf_power_mapping=0x0001dd2d +--defsym:platform_shutdown=0x0001dd39 +--defsym:platform_switch_app=0x0001dd3d +--defsym:platform_trace_raw=0x0001dd69 +--defsym:platform_write_persistent_reg=0x0001dd7d +--defsym:printf_hexdump=0x0001dd8d +--defsym:pvPortMalloc=0x0001e889 +--defsym:pvTaskIncrementMutexHeldCount=0x0001e971 +--defsym:pvTimerGetTimerID=0x0001e989 +--defsym:pxPortInitialiseStack=0x0001e9b5 +--defsym:reverse_128=0x0001eb95 +--defsym:reverse_24=0x0001eb9b +--defsym:reverse_48=0x0001eba1 +--defsym:reverse_56=0x0001eba7 +--defsym:reverse_64=0x0001ebad +--defsym:reverse_bd_addr=0x0001ebb3 +--defsym:reverse_bytes=0x0001ebb9 +--defsym:sm_add_event_handler=0x0001ee59 +--defsym:sm_address_resolution_lookup=0x0001ef85 +--defsym:sm_authenticated=0x0001f05f +--defsym:sm_authorization_decline=0x0001f06d +--defsym:sm_authorization_grant=0x0001f08d +--defsym:sm_authorization_state=0x0001f0ad +--defsym:sm_bonding_decline=0x0001f0c9 +--defsym:sm_config=0x0001f4a1 +--defsym:sm_encryption_key_size=0x0001f5ad +--defsym:sm_just_works_confirm=0x0001fd7d +--defsym:sm_le_device_key=0x0001ffcd +--defsym:sm_passkey_input=0x00020065 +--defsym:sm_private_random_address_generation_get=0x000203f1 +--defsym:sm_private_random_address_generation_get_mode=0x000203f9 +--defsym:sm_private_random_address_generation_set_mode=0x00020405 +--defsym:sm_private_random_address_generation_set_update_period=0x0002042d +--defsym:sm_register_oob_data_callback=0x00020465 +--defsym:sm_request_pairing=0x00020471 +--defsym:sm_send_security_request=0x00020eab +--defsym:sm_set_accepted_stk_generation_methods=0x00020ed1 +--defsym:sm_set_authentication_requirements=0x00020edd +--defsym:sm_set_encryption_key_size_range=0x00020ee9 +--defsym:sscanf_bd_addr=0x000211e5 +--defsym:sysSetPublicDeviceAddr=0x00021501 +--defsym:uuid128_to_str=0x00021bdd +--defsym:uuid_add_bluetooth_prefix=0x00021c35 +--defsym:uuid_has_bluetooth_prefix=0x00021c55 +--defsym:uxQueueMessagesWaiting=0x00021c99 +--defsym:uxQueueMessagesWaitingFromISR=0x00021cc1 +--defsym:uxQueueSpacesAvailable=0x00021cdd +--defsym:vPortEnterCritical=0x00021da1 +--defsym:vPortExitCritical=0x00021de1 +--defsym:vPortFree=0x00021e0d +--defsym:vPortSuppressTicksAndSleep=0x00021ea1 +--defsym:vPortValidateInterruptPriority=0x00021f79 +--defsym:vQueueDelete=0x00021fcd +--defsym:vQueueWaitForMessageRestricted=0x00021ff9 +--defsym:vTaskDelay=0x00022041 +--defsym:vTaskInternalSetTimeOutState=0x0002208d +--defsym:vTaskMissedYield=0x0002209d +--defsym:vTaskPlaceOnEventList=0x000220a9 +--defsym:vTaskPlaceOnEventListRestricted=0x000220e1 +--defsym:vTaskPriorityDisinheritAfterTimeout=0x00022121 +--defsym:vTaskStartScheduler=0x000221cd +--defsym:vTaskStepTick=0x0002225d +--defsym:vTaskSuspendAll=0x0002228d +--defsym:vTaskSwitchContext=0x0002229d +--defsym:xPortStartScheduler=0x00022345 +--defsym:xQueueAddToSet=0x00022401 +--defsym:xQueueCreateCountingSemaphore=0x00022425 +--defsym:xQueueCreateCountingSemaphoreStatic=0x00022461 +--defsym:xQueueCreateMutex=0x000224a5 +--defsym:xQueueCreateMutexStatic=0x000224bb +--defsym:xQueueCreateSet=0x000224d5 +--defsym:xQueueGenericCreate=0x000224dd +--defsym:xQueueGenericCreateStatic=0x00022529 +--defsym:xQueueGenericReset=0x00022591 +--defsym:xQueueGenericSend=0x0002261d +--defsym:xQueueGenericSendFromISR=0x00022789 +--defsym:xQueueGiveFromISR=0x00022849 +--defsym:xQueueGiveMutexRecursive=0x000228ed +--defsym:xQueueIsQueueEmptyFromISR=0x0002292d +--defsym:xQueueIsQueueFullFromISR=0x00022951 +--defsym:xQueuePeek=0x00022979 +--defsym:xQueuePeekFromISR=0x00022aa1 +--defsym:xQueueReceive=0x00022b0d +--defsym:xQueueReceiveFromISR=0x00022c39 +--defsym:xQueueRemoveFromSet=0x00022ccd +--defsym:xQueueSelectFromSet=0x00022cef +--defsym:xQueueSelectFromSetFromISR=0x00022d01 +--defsym:xQueueSemaphoreTake=0x00022d15 +--defsym:xQueueTakeMutexRecursive=0x00022e81 +--defsym:xTaskCheckForTimeOut=0x00022ec5 +--defsym:xTaskCreate=0x00022f35 +--defsym:xTaskCreateStatic=0x00022f91 +--defsym:xTaskGetCurrentTaskHandle=0x00023001 +--defsym:xTaskGetSchedulerState=0x0002300d +--defsym:xTaskGetTickCount=0x00023029 +--defsym:xTaskGetTickCountFromISR=0x00023035 +--defsym:xTaskIncrementTick=0x00023045 +--defsym:xTaskPriorityDisinherit=0x00023111 +--defsym:xTaskPriorityInherit=0x000231a5 +--defsym:xTaskRemoveFromEventList=0x00023239 +--defsym:xTaskResumeAll=0x000232b9 +--defsym:xTimerCreate=0x00023381 +--defsym:xTimerCreateStatic=0x000233b5 +--defsym:xTimerCreateTimerTask=0x000233ed +--defsym:xTimerGenericCommand=0x00023459 +--defsym:xTimerGetExpiryTime=0x000234c9 diff --git a/bundles/typical/inc/kv_storage.h b/bundles/typical/inc/kv_storage.h index 83c62ed53..4eb849740 100644 --- a/bundles/typical/inc/kv_storage.h +++ b/bundles/typical/inc/kv_storage.h @@ -14,7 +14,7 @@ #include /** - * @brief Bluetooth + * @brief Bluetooth * @defgroup Bluetooth_NVM * @ingroup bluetooth_stack * @{ @@ -133,8 +133,10 @@ void kv_value_modified(void); /** * @brief commited whole db to nvm immediately + * @param[in] flag_always if signaled, always write to nvm no matter if modified or not. + * Otherwise, do not write to nvm if not modified. */ -void kv_commit(void); +void kv_commit(int flag_always_write); /** * @brief traverse each k-v pair diff --git a/bundles/typical/inc/os/task.h b/bundles/typical/inc/os/task.h index c1a941879..08b49b360 100644 --- a/bundles/typical/inc/os/task.h +++ b/bundles/typical/inc/os/task.h @@ -1390,9 +1390,7 @@ TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR * \ingroup TaskUtils */ -// TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; /** * task. h diff --git a/bundles/typical/inc/os/timers.h b/bundles/typical/inc/os/timers.h index 746ed29b2..4c30b9615 100644 --- a/bundles/typical/inc/os/timers.h +++ b/bundles/typical/inc/os/timers.h @@ -1288,9 +1288,7 @@ void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; * will next expire is returned. If the timer is not running then the return * value is undefined. */ -// TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /* * Functions beyond this part are not part of the public API and are intended diff --git a/bundles/typical/inc/platform_api.h b/bundles/typical/inc/platform_api.h index b300a5e72..489b60b14 100644 --- a/bundles/typical/inc/platform_api.h +++ b/bundles/typical/inc/platform_api.h @@ -126,9 +126,21 @@ typedef enum PLATFORM_TRACE_ID_HCI_CMD = 1, PLATFORM_TRACE_ID_HCI_EVENT = 2, PLATFORM_TRACE_ID_HCI_ACL = 3, - PLATFORM_TRACE_ID_LLCP = 4 + PLATFORM_TRACE_ID_LLCP = 4, + PLATFORM_TRACE_ID_RAW = 5, + PLATFORM_TRACE_ID_EVENT_ERROR = 6, } platform_trace_item_t; +/** + **************************************************************************************** + * @brief Output a block of raw data to TRACE. ID is PLATFORM_TRACE_ID_RAW + * + * @param[in] buffer data buffer + * @param[in] byte_len length of data buffer in bytes + **************************************************************************************** + */ +void platform_trace_raw(const void *buffer, const int byte_len); + /** **************************************************************************************** * @brief register callback function for platform events @@ -222,14 +234,37 @@ void platform_write_persistent_reg(const uint8_t value); */ uint8_t platform_read_persistent_reg(void); +/** + **************************************************************************************** + * @brief Shutdown the whole system, and power on again after a duration + * specified by duration_cycles. + * Optionally, a portion of SYS memory can be retentioned during shutdown. + * + * @param[in] duration_cycles Duration before power on again (measured in cycles of 32k clock) + * Mininum value: 825 cycles (about 25.18ms) + * @param[in] p_retention_data Pointer to the start of data to be retentioned + * @param[in] data_size Size of the data to be retentioned + **************************************************************************************** + */ +void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); + typedef enum { PLATFORM_CFG_LOG_HCI, // flag is ENABLE or DISABLE. default: DISABLE PLATFORM_CFG_POWER_SAVING, // flag is ENABLE or DISABLE. default: DISABLE PLATFORM_CFG_TRACE_MASK, // flag is bitmap of platform_trace_item_t. default: 0 + PLATFORM_CFG_RC32K_EN, // Enable/Disable RC 32k clock. Default: Enable + PLATFORM_CFG_OSC32K_EN, // Enable/Disable 32k crystal oscillator. Default: Enable PLATFORM_CFG_32K_CLK, // 32k clock selection. flag is platform_32k_clk_src_t. default: PLATFORM_32K_RC + // Note: When modifying this configuration, both RC32K and OSC32K should be ENABLED and *run*. + // For OSC32K, wait until status of OSC32K is OK; + // For RC32K, wait 100us after enabled. + // Note: Wait another 100us before disabling the unused clock. + PLATFORM_CFG_32K_CLK_ACC, // Configure 32k clock accurary in ppm. + PLATFORM_CFG_32K_CALI_PERIOD, // 32K clock auto-calibartion period in seconds. Default: 3600 * 2 PLATFORM_CFG_PS_DBG_0, // debugging parameter PLATFORM_CFG_PS_DBG_1, // debugging parameter + PLATFORM_CFG_CTE_IQ_DBG, // debugging parameter } platform_cfg_item_t; typedef enum @@ -251,19 +286,30 @@ typedef enum */ void platform_config(const platform_cfg_item_t item, const uint32_t flag); +typedef enum +{ + PLATFORM_INFO_OSC32K_STATUS, // Read status of 32k crystal oscillator. (0: not OK; Non-0: OK) + PLATFORM_INFO_32K_CALI_VALUE, // Read current 32k clock calibaration result. +} platform_info_item_t; + /** **************************************************************************************** - * @brief Shutdown the whole system, and power on again after a duration - * specified by duration_cycles. - * Optionally, a portion of SYS memory can be retentioned during shutdown. + * @brief read platform information. * - * @param[in] duration_cycles Duration before power on again (measured in cycles of 32k clock) - * Mininum value: 825 cycles (about 25.18ms) - * @param[in] p_retention_data Pointer to the start of data to be retentioned - * @param[in] data_size Size of the data to be retentioned + * @param[in] item Information item + * @return Information. **************************************************************************************** */ -void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); +uint32_t platform_read_info(const platform_info_item_t item); + +/** + **************************************************************************************** + * @brief Do 32k clock calibration and get the calibration valie. + * + * @return Calibration value. + **************************************************************************************** + */ +uint32_t platform_calibrate_32k(void); /** **************************************************************************************** @@ -275,6 +321,26 @@ void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_d */ void platform_hrng(uint8_t *bytes, const uint32_t len); +/** + **************************************************************************************** + * @brief generate a pseudo random integer by internal PRNG whose seed initialized by HRNG + * at startup. + * + * @return a pseudo random integer in range of 0 to RAND_MAX + **************************************************************************************** + */ +int platform_rand(void); + +/** + **************************************************************************************** + * @brief Read the internal timer counting from initialization. + * Note: This timer restarts after shutdown, while RTC timer does not. + * + * @return internal timer counting at 1us. + **************************************************************************************** + */ +int64_t platform_get_us_time(void); + /** **************************************************************************************** * @brief the printf function diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw index a66554ebf..14336a7f9 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\/Program Files(2)\/gcc-arm-none-eabi-8-2018-q4-major-win32\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld index 97127bbe5..4540d30f6 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536901400, LENGTH = 35048 + RAM (rwx) : ORIGIN = 536903448, LENGTH = 33000 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index d50ca7c00..a44929ca3 100644 --- a/examples-iar/peripheral_ibeacon/generic_cortex.icf +++ b/examples-iar/peripheral_ibeacon/generic_cortex.icf @@ -2,9 +2,9 @@ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ /*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 155648; +define symbol __ICFEDIT_intvec_start__ = 155648; /*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 155648; +define symbol __ICFEDIT_region_IROM1_start__ = 155648; define symbol __ICFEDIT_region_IROM1_end__ = 0x00084000; define symbol __ICFEDIT_region_IROM2_start__ = 0x0; define symbol __ICFEDIT_region_IROM2_end__ = 0x0; @@ -14,7 +14,7 @@ define symbol __ICFEDIT_region_EROM2_start__ = 0x0; define symbol __ICFEDIT_region_EROM2_end__ = 0x0; define symbol __ICFEDIT_region_EROM3_start__ = 0x0; define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 536901400; +define symbol __ICFEDIT_region_IRAM1_start__ = 536903448; define symbol __ICFEDIT_region_IRAM1_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; diff --git a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw index b27de92e6..c7d798df0 100644 --- a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\/Program Files (x86)\/IAR Systems\/Embedded Workbench 8.2\/common\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/peripheral_battery/peripheral_battery.ingw b/examples-nim/peripheral_battery/peripheral_battery.ingw index 3b3ecfbae..88f2bee40 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ingw +++ b/examples-nim/peripheral_battery/peripheral_battery.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\projects\\nim-1.0.0\\bin", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/peripheral_battery/peripheral_battery.ld b/examples-nim/peripheral_battery/peripheral_battery.ld index 97127bbe5..4540d30f6 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ld +++ b/examples-nim/peripheral_battery/peripheral_battery.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536901400, LENGTH = 35048 + RAM (rwx) : ORIGIN = 536903448, LENGTH = 33000 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-nim/smart_home_hub/smart_home_hub.ingw b/examples-nim/smart_home_hub/smart_home_hub.ingw index 8735e0c5e..af85627e5 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ingw +++ b/examples-nim/smart_home_hub/smart_home_hub.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\projects\\nim-1.0.0\\bin", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/smart_home_hub/smart_home_hub.ld b/examples-nim/smart_home_hub/smart_home_hub.ld index 97127bbe5..4540d30f6 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ld +++ b/examples-nim/smart_home_hub/smart_home_hub.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536901400, LENGTH = 35048 + RAM (rwx) : ORIGIN = 536903448, LENGTH = 33000 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-rowley/ING918xx.elf b/examples-rowley/ING918xx.elf index e2b4b2ee9aa40e97fffc0c13a045db61b24d1eab..65fb70ec766c138c4616f08a1eec6415bf14ab27 100644 GIT binary patch literal 15364 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 literal 15188 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 diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp index a730d1083..3bb5c5bfb 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp @@ -2,7 +2,7 @@ - + diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw index b18132668..662233bdd 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\/Program Files(2)\/Crossworks\/bin", "ide_ver": "", @@ -50,8 +50,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "rowley": true, "uart_log": true, "ota_ver_patch": "0", diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject index dfa7c5af3..9e1791618 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject @@ -2,7 +2,7 @@ - + diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw index 4d68d2ff2..af51c1fb3 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\/Program Files (x86)\/SEGGER\/SEGGER Embedded Studio for ARM 4.50\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_mas/anti_lost_mas.ingw b/examples/anti_lost_mas/anti_lost_mas.ingw index c8f8807be..fde2bb7d0 100644 --- a/examples/anti_lost_mas/anti_lost_mas.ingw +++ b/examples/anti_lost_mas/anti_lost_mas.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_mas/anti_lost_mas.uvproj b/examples/anti_lost_mas/anti_lost_mas.uvproj index c96bbba0d..1e8c90b06 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvproj +++ b/examples/anti_lost_mas/anti_lost_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/anti_lost_mas/anti_lost_mas.uvprojx b/examples/anti_lost_mas/anti_lost_mas.uvprojx index 731f076e6..0444eebc6 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvprojx +++ b/examples/anti_lost_mas/anti_lost_mas.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/anti_lost_sla/anti_lost_sla.ingw b/examples/anti_lost_sla/anti_lost_sla.ingw index ec087bcec..0c94f7119 100644 --- a/examples/anti_lost_sla/anti_lost_sla.ingw +++ b/examples/anti_lost_sla/anti_lost_sla.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_sla/anti_lost_sla.uvproj b/examples/anti_lost_sla/anti_lost_sla.uvproj index 053a9b7ba..c3aa3534b 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvproj +++ b/examples/anti_lost_sla/anti_lost_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/anti_lost_sla/anti_lost_sla.uvprojx b/examples/anti_lost_sla/anti_lost_sla.uvprojx index b9bbbb282..3e2174779 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvprojx +++ b/examples/anti_lost_sla/anti_lost_sla.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/central_throughput/README.md b/examples/central_throughput/README.md index 870de490a..3efc8c27a 100644 --- a/examples/central_throughput/README.md +++ b/examples/central_throughput/README.md @@ -13,4 +13,4 @@ This example demonstrates how to: Note: 1. This example works with `peripheral_throughput`; 1. To use command `loopback`, `peripheral_throughput` should be - build with `LOOPBACK` defined. + running in `LOOPBACK` mode. diff --git a/examples/central_throughput/central_throughput.ingw b/examples/central_throughput/central_throughput.ingw index dd6172d1d..f4641e902 100644 --- a/examples/central_throughput/central_throughput.ingw +++ b/examples/central_throughput/central_throughput.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/central_throughput/central_throughput.uvopt b/examples/central_throughput/central_throughput.uvopt index e26e81117..54c375000 100644 --- a/examples/central_throughput/central_throughput.uvopt +++ b/examples/central_throughput/central_throughput.uvopt @@ -195,8 +195,8 @@ 0 18 0 - 6 - 7 + 0 + 0 0 .\src\main.c main.c @@ -211,8 +211,8 @@ 0 38 0 - 354 - 367 + 0 + 0 0 .\src\profile.c profile.c @@ -227,8 +227,8 @@ 0 0 0 - 6 - 19 + 0 + 0 0 .\src\uart_console.c uart_console.c @@ -270,7 +270,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -355,6 +355,22 @@ 0 0 + + 4 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + @@ -365,7 +381,7 @@ 0 5 - 10 + 11 1 0 0 @@ -379,6 +395,22 @@ 0 0 + + 5 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\Tools\trace.c + trace.c + 0 + 0 + diff --git a/examples/central_throughput/central_throughput.uvoptx b/examples/central_throughput/central_throughput.uvoptx index 90672e8d1..9c78f69bb 100644 --- a/examples/central_throughput/central_throughput.uvoptx +++ b/examples/central_throughput/central_throughput.uvoptx @@ -117,7 +117,7 @@ 0 DLGUARM - d + / 0 @@ -145,7 +145,40 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) - + + + 0 + 0 + 14 + 1 +

    0
    + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\Tools\trace.c + + + + + 1 + 0 + 74 + 1 +
    0
    + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\Tools\trace.c + + +
    + 0 @@ -322,6 +355,18 @@ 0 0 + + 4 + 10 + 1 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + @@ -332,7 +377,7 @@ 0 5 - 10 + 11 1 0 0 @@ -342,6 +387,18 @@ 0 0 + + 5 + 12 + 1 + 0 + 0 + 0 + ..\..\src\Tools\trace.c + trace.c + 0 + 0 + diff --git a/examples/central_throughput/central_throughput.uvproj b/examples/central_throughput/central_throughput.uvproj index 9a44fc985..fc7d3f826 100644 --- a/examples/central_throughput/central_throughput.uvproj +++ b/examples/central_throughput/central_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -447,6 +447,11 @@ 1 ..\..\src\FWlib\peripheral_rtc.c + + peripheral_pinctrl.c + 1 + ..\..\src\FWlib\peripheral_pinctrl.c + @@ -457,6 +462,11 @@ 1 ../..\src\Tools\ad_parser.c + + trace.c + 1 + ..\..\src\Tools\trace.c + diff --git a/examples/central_throughput/central_throughput.uvprojx b/examples/central_throughput/central_throughput.uvprojx index a9b06e27c..07999a147 100644 --- a/examples/central_throughput/central_throughput.uvprojx +++ b/examples/central_throughput/central_throughput.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -434,6 +434,11 @@ 1 ..\..\src\FWlib\peripheral_rtc.c + + peripheral_pinctrl.c + 1 + ..\..\src\FWlib\peripheral_pinctrl.c + @@ -444,6 +449,11 @@ 1 ../..\src\Tools\ad_parser.c + + trace.c + 1 + ..\..\src\Tools\trace.c + diff --git a/examples/central_throughput/src/main.c b/examples/central_throughput/src/main.c index adda67053..b261777d0 100644 --- a/examples/central_throughput/src/main.c +++ b/examples/central_throughput/src/main.c @@ -4,6 +4,7 @@ #include "platform_api.h" #include "FreeRTOS.h" #include "task.h" +#include "trace.h" #include #include "uart_console.h" @@ -18,6 +19,9 @@ uint32_t cb_hard_fault(hard_fault_info_t *info, void *_) } #define PRINT_PORT APB_UART0 +#define TRACE_PORT APB_UART1 + +trace_uart_t trace_ctx = {.port = TRACE_PORT}; uint32_t cb_putc(char *c, void *dummy) { @@ -51,15 +55,22 @@ void config_uart(uint32_t freq, uint32_t baud) config.BaudRate = baud; apUART_Initialize(PRINT_PORT, &config, 1 << bsUART_RECEIVE_INTENAB); + config.BaudRate = 921600; + apUART_Initialize(TRACE_PORT, &config, 1 << bsUART_TRANSMIT_INTENAB); } void setup_peripherals(void) -{ +{ + SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_TMR1) | (1 << SYSCTRL_ClkGate_APB_UART1) | (1 << SYSCTRL_ClkGate_APB_PinCtrl)); config_uart(OSC_CLK_FREQ, 115200); - SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_TMR1)); TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ); TMR_SetOpMode(APB_TMR1, TMR_CTL_OP_MODE_WRAPPING); TMR_IntEnable(APB_TMR1); + + // uart1: 4, 5 + PINCTRL_SetPadMux(5, IO_SOURCE_GENERAL); + PINCTRL_SelUartRxdIn(UART_PORT_1, 5); + PINCTRL_SetPadMux(4, IO_SOURCE_UART1_TXD); } uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) @@ -78,6 +89,13 @@ uint32_t query_deep_sleep_allowed(void *dummy, void *user_data) return 0; } +uint32_t cb_lle_init(void *dummy, void *user_data) +{ + (void)(dummy); + (void)(user_data); + return 0; +} + uint32_t uart_isr(void *user_data) { uint32_t status; @@ -126,6 +144,7 @@ int app_main() platform_set_evt_callback(PLATFORM_CB_EVT_ON_DEEP_SLEEP_WAKEUP, on_deep_sleep_wakeup, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, query_deep_sleep_allowed, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); + platform_set_evt_callback(PLATFORM_CB_EVT_LLE_INIT, cb_lle_init, NULL); setup_peripherals(); @@ -133,6 +152,13 @@ int app_main() platform_set_irq_callback(PLATFORM_CB_IRQ_UART0, uart_isr, NULL); cmd_help(NULL); + + trace_uart_init(&trace_ctx); + platform_set_evt_callback(PLATFORM_CB_EVT_TRACE, (f_platform_evt_cb)cb_trace_uart, &trace_ctx); + platform_set_irq_callback(PLATFORM_CB_IRQ_UART1, (f_platform_irq_cb)trace_uart_isr, &trace_ctx); + trace_uart_isr(&trace_ctx); + + // platform_config(PLATFORM_CFG_TRACE_MASK, 0xff); return 0; } diff --git a/examples/hid_keyboard/README.md b/examples/hid_keyboard/README.md index f00db00aa..7fbe6735d 100644 --- a/examples/hid_keyboard/README.md +++ b/examples/hid_keyboard/README.md @@ -10,4 +10,4 @@ This example demonstrates how to: Note: * Use Key1/Key2/Key3 to input `1`, `2` and '3'. * Windows & Android: Works; - * MacOS: Not work. + * MacOS/iOS: Not work. diff --git a/examples/hid_keyboard/data/advertising.adv b/examples/hid_keyboard/data/advertising.adv index a4047f24f..f40a978a3 100644 --- a/examples/hid_keyboard/data/advertising.adv +++ b/examples/hid_keyboard/data/advertising.adv @@ -10,9 +10,8 @@ 3, 0x19, 0xC1, 0x03, -// 0xFF - «Manufacturer Specific Data» -15, 0xFF, -0x06, 0x00, 0x03, 0x00, 0x80, 0x49, 0x4E, 0x47, -0x20, 0x4D, 0x6F, 0x75, 0x73, 0x65, +// 0x09 - «Complete Local Name» +7, 0x09, +0x49, 0x4E, 0x47, 0x20, 0x4B, 0x42, -// Total size = 27 bytes +// Total size = 19 bytes diff --git a/examples/hid_keyboard/hid_keyboard.ingw b/examples/hid_keyboard/hid_keyboard.ingw index dbc7bdfe1..f7f8e166e 100644 --- a/examples/hid_keyboard/hid_keyboard.ingw +++ b/examples/hid_keyboard/hid_keyboard.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -58,8 +58,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/hid_keyboard/hid_keyboard.uvproj b/examples/hid_keyboard/hid_keyboard.uvproj index ae782915a..e00111165 100644 --- a/examples/hid_keyboard/hid_keyboard.uvproj +++ b/examples/hid_keyboard/hid_keyboard.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/hid_keyboard/hid_keyboard.uvprojx b/examples/hid_keyboard/hid_keyboard.uvprojx index f3ed2e30d..708547ae7 100644 --- a/examples/hid_keyboard/hid_keyboard.uvprojx +++ b/examples/hid_keyboard/hid_keyboard.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/hid_keyboard/src/main.c b/examples/hid_keyboard/src/main.c index d3a30c304..b4ac76550 100644 --- a/examples/hid_keyboard/src/main.c +++ b/examples/hid_keyboard/src/main.c @@ -69,7 +69,7 @@ void config_uart(uint32_t freq, uint32_t baud) void setup_peripherals(void) { - config_uart(OSC_CLK_FREQ, 115200); + config_uart(OSC_CLK_FREQ, 921600); SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) | (1 << SYSCTRL_ClkGate_APB_PinCtrl)); @@ -139,7 +139,6 @@ int app_main() platform_set_irq_callback(PLATFORM_CB_IRQ_GPIO, gpio_isr, NULL); setup_peripherals(); - sysSetPublicDeviceAddr((uint8_t *)0x2a100); // platform_config(PLATFORM_CFG_LOG_HCI, PLATFORM_CFG_ENABLE); platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); diff --git a/examples/hid_keyboard/src/profile.c b/examples/hid_keyboard/src/profile.c index bf7ce13fb..8d317de71 100644 --- a/examples/hid_keyboard/src/profile.c +++ b/examples/hid_keyboard/src/profile.c @@ -18,6 +18,13 @@ #define HANDLE_DEVICE_NAME 3 #define HANDLE_APPEARANCE 5 +const sm_persistent_t sm_persistent = +{ + .er = {1, 2, 3}, + .ir = {4, 5, 6}, + .identity_addr_type = BD_ADDR_TYPE_LE_RANDOM, + .identity_addr = {0xC3, 0x82, 0x63, 0xc4, 0x35, 0x6a} +}; const static uint8_t adv_data[] = { #include "../data/advertising.adv" @@ -157,7 +164,6 @@ uint8_t *init_service(void); static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) { - const static bd_addr_t rand_addr = {1,2,3,1,2,3}; // TODO: random address generation const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; uint8_t event = hci_event_packet_get_type(packet); const btstack_user_msg_t *p_user_msg; @@ -169,12 +175,12 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) break; - gap_set_adv_set_random_addr(0, rand_addr); + gap_set_adv_set_random_addr(0, sm_persistent.identity_addr); gap_set_ext_adv_para(0, CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max PRIMARY_ADV_ALL_CHANNELS, // Primary_Advertising_Channel_Map - BD_ADDR_TYPE_LE_PUBLIC, // Own_Address_Type + BD_ADDR_TYPE_LE_RANDOM, // Own_Address_Type BD_ADDR_TYPE_LE_PUBLIC, // Peer_Address_Type (ignore) NULL, // Peer_Address (ignore) ADV_FILTER_ALLOW_ALL, // Advertising_Filter_Policy @@ -346,14 +352,6 @@ uint8_t *init_service() return att_db_util_get_address(); } -const sm_persistent_t sm_persistent = -{ - .er = {1, 2, 3}, - .ir = {4, 5, 6}, - .identity_addr_type = BD_ADDR_TYPE_LE_RANDOM, - .identity_addr = {0xC3, 2, 3, 4, 5, 6} -}; - static void sm_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) { uint8_t event = hci_event_packet_get_type(packet); diff --git a/examples/hid_mouse/README.md b/examples/hid_mouse/README.md index 466dad616..24e0ea0a4 100644 --- a/examples/hid_mouse/README.md +++ b/examples/hid_mouse/README.md @@ -8,4 +8,4 @@ This example demonstrates how to: Note: * Windows & Android: Works; - * MacOS: Not work. + * MacOS/iOS: Not work. diff --git a/examples/hid_mouse/data/advertising.adv b/examples/hid_mouse/data/advertising.adv index 256cdf022..ca0d1a9ee 100644 --- a/examples/hid_mouse/data/advertising.adv +++ b/examples/hid_mouse/data/advertising.adv @@ -10,4 +10,9 @@ 3, 0x19, 0xC2, 0x03, -// Total size = 11 bytes +// 0x09 - «Complete Local Name» +10, 0x09, +0x49, 0x4E, 0x47, 0x20, 0x4D, 0x6F, 0x75, 0x73, +0x65, + +// Total size = 22 bytes diff --git a/examples/hid_mouse/flash_download.ini b/examples/hid_mouse/flash_download.ini index 9db6946f7..83f5db4af 100644 --- a/examples/hid_mouse/flash_download.ini +++ b/examples/hid_mouse/flash_download.ini @@ -26,8 +26,8 @@ Address=155648 FileName=hid_mouse.bin [uart] -Port=3 -Baud=115200 +Port=COM3 +Baud=921600 Parity= DataBits=8 StopBits=1 @@ -36,7 +36,7 @@ AsyncIO=1 [main] timeout=10000 MIN_ADDR=16384 -MAX_ADDR=540672 +MAX_ADDR=540671 [bin-2] Name=Burn Bin #3 diff --git a/examples/hid_mouse/hid_mouse.ingw b/examples/hid_mouse/hid_mouse.ingw index bd6d11136..7c164cd31 100644 --- a/examples/hid_mouse/hid_mouse.ingw +++ b/examples/hid_mouse/hid_mouse.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -58,8 +58,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/hid_mouse/hid_mouse.uvoptx b/examples/hid_mouse/hid_mouse.uvoptx index eaf87e217..e34c50076 100644 --- a/examples/hid_mouse/hid_mouse.uvoptx +++ b/examples/hid_mouse/hid_mouse.uvoptx @@ -186,7 +186,7 @@ APP - 0 + 1 0 0 0 @@ -214,18 +214,6 @@ 0 0 - - 1 - 3 - 1 - 0 - 0 - 0 - ..\anti_lost_sla\src\dev_info.c - dev_info.c - 0 - 0 - @@ -236,7 +224,7 @@ 0 2 - 4 + 3 2 0 0 @@ -248,12 +236,12 @@ 2 - 5 + 4 3 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -266,6 +254,18 @@ 0 0 0 + + 3 + 5 + 1 + 0 + 0 + 0 + ../..\src\BSP\eflash.c + eflash.c + 0 + 0 + @@ -305,20 +305,8 @@ 0 0 0 - ..\..\src\FWlib\peripheral_pinctrl.c - peripheral_pinctrl.c - 0 - 0 - - - 4 - 9 - 1 - 0 - 0 - 0 - ..\..\src\FWlib\peripheral_pwm.c - peripheral_pwm.c + ..\..\src\FWlib\peripheral_timer.c + peripheral_timer.c 0 0 @@ -332,25 +320,13 @@ 0 5 - 10 - 1 - 0 - 0 - 0 - ../..\src\Tools\ad_parser.c - ad_parser.c - 0 - 0 - - - 5 - 11 + 9 1 0 0 0 - ..\..\src\Tools\blink.c - blink.c + ../..\src\Tools\att_db_util.c + att_db_util.c 0 0 @@ -364,4 +340,4 @@ 1 - \ No newline at end of file + diff --git a/examples/hid_mouse/hid_mouse.uvproj b/examples/hid_mouse/hid_mouse.uvproj index aef102ae9..7512ae17c 100644 --- a/examples/hid_mouse/hid_mouse.uvproj +++ b/examples/hid_mouse/hid_mouse.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/hid_mouse/hid_mouse.uvprojx b/examples/hid_mouse/hid_mouse.uvprojx index 5b6e4a339..ca4f4c855 100644 --- a/examples/hid_mouse/hid_mouse.uvprojx +++ b/examples/hid_mouse/hid_mouse.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/hid_mouse/src/main.c b/examples/hid_mouse/src/main.c index a829e77a9..b4f503d24 100644 --- a/examples/hid_mouse/src/main.c +++ b/examples/hid_mouse/src/main.c @@ -103,7 +103,7 @@ int app_main() platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER1, timer_isr, NULL); setup_peripherals(); - //platform_config(PLATFORM_CFG_LOG_HCI, PLATFORM_CFG_ENABLE); + // platform_config(PLATFORM_CFG_LOG_HCI, PLATFORM_CFG_ENABLE); platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_HARD_FAULT, (f_platform_evt_cb)cb_hard_fault, NULL); diff --git a/examples/hid_mouse/src/profile.c b/examples/hid_mouse/src/profile.c index 475947dbb..7defb89db 100644 --- a/examples/hid_mouse/src/profile.c +++ b/examples/hid_mouse/src/profile.c @@ -182,7 +182,7 @@ const sm_persistent_t sm_persistent = .er = {1, 2, 3}, .ir = {4, 5, 6}, .identity_addr_type = BD_ADDR_TYPE_LE_RANDOM, - .identity_addr = {0xC3, 2, 3, 4, 5, 6} + .identity_addr = {0xC3, 0x32, 0x33, 0x4e, 0x5d, 0x7c} }; uint8_t *init_service(void); @@ -198,9 +198,9 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin case BTSTACK_EVENT_STATE: if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) break; - sm_private_random_address_generation_set_mode(GAP_RANDOM_ADDRESS_RESOLVABLE); - //gap_set_adv_set_random_addr(0, sm_persistent.identity_addr); - //setup_adv(); + //sm_private_random_address_generation_set_mode(GAP_RANDOM_ADDRESS_RESOLVABLE); + gap_set_adv_set_random_addr(0, sm_persistent.identity_addr); + setup_adv(); break; case HCI_EVENT_LE_META: diff --git a/examples/ibeacon_scanner/ibeacon_scanner.ingw b/examples/ibeacon_scanner/ibeacon_scanner.ingw index b6fb92444..f57a5d9b8 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.ingw +++ b/examples/ibeacon_scanner/ibeacon_scanner.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -44,8 +44,8 @@ "role": "central", "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvoptx b/examples/ibeacon_scanner/ibeacon_scanner.uvoptx index 2fef396e2..02704d068 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvoptx +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvoptx @@ -253,7 +253,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvproj b/examples/ibeacon_scanner/ibeacon_scanner.uvproj index b7ec95ef4..2fa1ce763 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvproj +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx index 6f9d39789..353fdab1a 100644 --- a/examples/ibeacon_scanner/ibeacon_scanner.uvprojx +++ b/examples/ibeacon_scanner/ibeacon_scanner.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/io_over_ble_mas/io_over_ble_mas.ingw b/examples/io_over_ble_mas/io_over_ble_mas.ingw index 9d9893b78..a81caaf1b 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.ingw +++ b/examples/io_over_ble_mas/io_over_ble_mas.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvproj b/examples/io_over_ble_mas/io_over_ble_mas.uvproj index 9f66b6609..60c10a81b 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvproj +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx index c690ef432..7fac57099 100644 --- a/examples/io_over_ble_mas/io_over_ble_mas.uvprojx +++ b/examples/io_over_ble_mas/io_over_ble_mas.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/io_over_ble_sla/io_over_ble_sla.ingw b/examples/io_over_ble_sla/io_over_ble_sla.ingw index 7cdd38cb9..71a144c39 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.ingw +++ b/examples/io_over_ble_sla/io_over_ble_sla.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvproj b/examples/io_over_ble_sla/io_over_ble_sla.uvproj index 13e0d9bc1..906bbf7dd 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvproj +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx index d33bc7a89..0398e3179 100644 --- a/examples/io_over_ble_sla/io_over_ble_sla.uvprojx +++ b/examples/io_over_ble_sla/io_over_ble_sla.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/mesh-light/flash_download.ini b/examples/mesh-light/flash_download.ini index da50cc796..1dbf405d8 100644 --- a/examples/mesh-light/flash_download.ini +++ b/examples/mesh-light/flash_download.ini @@ -1,5 +1,5 @@ [bin-0] -FileName=../../bundles/mesh/ING9188xx/platform.bin +FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 Name=Burn Bin #1 Checked=1 diff --git a/examples/mesh-light/mesh-light.ingw b/examples/mesh-light/mesh-light.ingw index 838975513..6e4bfb706 100644 --- a/examples/mesh-light/mesh-light.ingw +++ b/examples/mesh-light/mesh-light.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 135180, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, - "base": 536880176 + "size": 32536, + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","kv_commit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -38,14 +38,14 @@ "pb_gatt": false, "deep_sleep": true, "proj_dir": "C:\/projects\/svn\/SDK_Release\/examples\\mesh-light", - "bundle": "mesh", + "bundle": "typical", "app_rom_size": "385024", "app_rom_addr": "155648", "role": "light", "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/mesh-light/mesh-light.uvoptx b/examples/mesh-light/mesh-light.uvoptx index b4ab54a83..72e9707ac 100644 --- a/examples/mesh-light/mesh-light.uvoptx +++ b/examples/mesh-light/mesh-light.uvoptx @@ -241,7 +241,7 @@ 0 0 0 - ..\..\bundles\mesh\ING9188xx\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -369,7 +369,7 @@ 0 0 0 - ..\..\bundles\mesh\Mesh.lib + ..\..\src\mesh\Mesh.lib Mesh.lib 0 0 diff --git a/examples/mesh-light/mesh-light.uvproj b/examples/mesh-light/mesh-light.uvproj index 28c64eba0..f08a591da 100644 --- a/examples/mesh-light/mesh-light.uvproj +++ b/examples/mesh-light/mesh-light.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536903448 + 33000 0 @@ -348,7 +348,7 @@ --gnu USE_STDPERIPH_DRIVER - ../../bundles/mesh/inc;../../bundles/mesh/inc/os;../../bundles/mesh/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src;../../src/Mesh + ../../bundles/mesh/inc;../../bundles/mesh/inc/os;../../bundles/mesh/inc/os/portable/RVDS/ARM_CM3;../../src/Mesh;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src diff --git a/examples/mesh-light/mesh-light.uvprojx b/examples/mesh-light/mesh-light.uvprojx index 2e794053f..5cb9829ac 100644 --- a/examples/mesh-light/mesh-light.uvprojx +++ b/examples/mesh-light/mesh-light.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536903448 + 33000 0 @@ -332,7 +332,7 @@ --gnu USE_STDPERIPH_DRIVER - ../../bundles/mesh/inc;../../bundles/mesh/inc/os;../../bundles/mesh/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src;../../src/Mesh + ../../src/Mesh;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -399,7 +399,7 @@ symdefs.m 3 - ..\..\bundles\mesh\ING9188xx\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m @@ -455,7 +455,7 @@ Mesh.lib 4 - ..\..\bundles\mesh\Mesh.lib + ..\..\src\mesh\Mesh.lib diff --git a/examples/mesh-light/src/profile.c b/examples/mesh-light/src/profile.c index e5f740dd3..bd28ae594 100644 --- a/examples/mesh-light/src/profile.c +++ b/examples/mesh-light/src/profile.c @@ -1,8 +1,8 @@ #include #include "syscfg.h" -#include "glue.h" -#include "main.h" +//#include "glue.h" +//#include "main.h" #include "mesh_api.h" diff --git a/examples/periodic_advertiser/flash_download.ini b/examples/periodic_advertiser/flash_download.ini index 5954ef04b..62500f307 100644 --- a/examples/periodic_advertiser/flash_download.ini +++ b/examples/periodic_advertiser/flash_download.ini @@ -26,7 +26,7 @@ Address=155648 FileName=periodic_advertiser.bin [uart] -Port=COM4 +Port=COM3 Baud=921600 Parity= DataBits=8 diff --git a/examples/periodic_advertiser/periodic_advertiser.ingw b/examples/periodic_advertiser/periodic_advertiser.ingw index bf1df86af..7ef86c2b8 100644 --- a/examples/periodic_advertiser/periodic_advertiser.ingw +++ b/examples/periodic_advertiser/periodic_advertiser.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/periodic_advertiser/periodic_advertiser.uvproj b/examples/periodic_advertiser/periodic_advertiser.uvproj index 8b4db1a71..c578335c9 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvproj +++ b/examples/periodic_advertiser/periodic_advertiser.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/periodic_advertiser/periodic_advertiser.uvprojx b/examples/periodic_advertiser/periodic_advertiser.uvprojx index 91c0e62d6..f5580a5e7 100644 --- a/examples/periodic_advertiser/periodic_advertiser.uvprojx +++ b/examples/periodic_advertiser/periodic_advertiser.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/periodic_scanner/flash_download.ini b/examples/periodic_scanner/flash_download.ini index 24f2aee1d..a9eba7344 100644 --- a/examples/periodic_scanner/flash_download.ini +++ b/examples/periodic_scanner/flash_download.ini @@ -26,7 +26,7 @@ Address=155648 FileName=periodic_scanner.bin [uart] -Port=COM16 +Port=COM3 Baud=921600 Parity= DataBits=8 diff --git a/examples/periodic_scanner/periodic_scanner.ingw b/examples/periodic_scanner/periodic_scanner.ingw index c429ad622..1f02af326 100644 --- a/examples/periodic_scanner/periodic_scanner.ingw +++ b/examples/periodic_scanner/periodic_scanner.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/periodic_scanner/periodic_scanner.uvproj b/examples/periodic_scanner/periodic_scanner.uvproj index c9319ee44..2a690a2d8 100644 --- a/examples/periodic_scanner/periodic_scanner.uvproj +++ b/examples/periodic_scanner/periodic_scanner.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/periodic_scanner/periodic_scanner.uvprojx b/examples/periodic_scanner/periodic_scanner.uvprojx index 707f776e0..31d855131 100644 --- a/examples/periodic_scanner/periodic_scanner.uvprojx +++ b/examples/periodic_scanner/periodic_scanner.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
    ### uVision Project, (C) Keil Software
    + Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o periodic_scanner.bin ./output/periodic_scanner.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536901400 - 35048 + 0x20007f18 + 0x80e8 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -331,7 +334,7 @@ --gnu USE_STDPERIPH_DRIVER,CTE - + ..\ibeacon_scanner\src;../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -452,11 +455,12 @@ + - + @@ -464,4 +468,5 @@ +
    diff --git a/examples/periodic_scanner/src/main.c b/examples/periodic_scanner/src/main.c index 0c9b2a15c..1795284d5 100644 --- a/examples/periodic_scanner/src/main.c +++ b/examples/periodic_scanner/src/main.c @@ -76,7 +76,7 @@ uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) uint32_t cb_lle_init(char *c, void *dummy) { volatile uint32_t *reg = (volatile uint32_t *)0x40090200; - ll_set_def_antenna(1); + ll_set_def_antenna(0); *reg = (*reg & ~(0x1f << 15)) | (0 << 15); return 0; } diff --git a/examples/periodic_scanner/src/profile.c b/examples/periodic_scanner/src/profile.c index fe4cc3e00..11423590a 100644 --- a/examples/periodic_scanner/src/profile.c +++ b/examples/periodic_scanner/src/profile.c @@ -275,7 +275,7 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin prd_adv_data_offset = 0; #ifdef CTE { - static const uint8_t ant_ids[] = {1, 2}; + static const uint8_t ant_ids[] = {0, 1}; gap_set_connectionless_iq_sampling_enable(established->handle, 1, 2, diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw index d52de7d1f..ced2d3567 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.ingw +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x16, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x41, 0x6C, 0x6C, 0x20, \r\n0x49, 0x6E, 0x20, 0x4F, 0x6E, 0x65, \r\n\r\n\/\/ Service Battery Service: 180F\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0F, 0x18, \r\n\/\/ Characteristic Battery Level: 2A19\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0x19, 0x2A, \r\n0x09, 0x00, 0x02, 0x00, 0x06, 0x00, 0x19, 0x2A,\r\n0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28,\r\n0x10, 0x09, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x09, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x0A, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x03, 0x28,\r\n0x02, 0x0C, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x03, 0x28,\r\n0x06, 0x0F, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x0F, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x28,\r\n0x04, 0x11, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x04, 0x03, 0x11, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x13, 0x00, 0x03, 0x28,\r\n0x06, 0x14, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x03, 0x14, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 353\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_BATTERY_LEVEL=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=9\r\n\/\/ HANDLE_RSC_FEATURE=12\r\n\/\/ HANDLE_ETAG_CONTROL=15\r\n\/\/ HANDLE_ETAG_DATA=17\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=20\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_BATTERY_LEVEL_OFFSET=76\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=108\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=149\r\n\/\/ HANDLE_ETAG_CONTROL_OFFSET=224\r\n\/\/ HANDLE_ETAG_DATA_OFFSET=274\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=348\r\n", diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj index 24d3608b6..773de9b12 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx index 300182aaf..a17622a60 100644 --- a/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx +++ b/examples/peripheral_all_in_one/peripheral_all_in_one.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_ancs/peripheral_ancs.ingw b/examples/peripheral_ancs/peripheral_ancs.ingw index 2eeb34bf2..bb5901467 100644 --- a/examples/peripheral_ancs/peripheral_ancs.ingw +++ b/examples/peripheral_ancs/peripheral_ancs.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_ancs/peripheral_ancs.uvopt b/examples/peripheral_ancs/peripheral_ancs.uvopt index c08982f03..9d138c5f9 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvopt +++ b/examples/peripheral_ancs/peripheral_ancs.uvopt @@ -193,10 +193,10 @@ 1 0 0 - 40 + 1 0 152 - 167 + 153 0 .\src\main.c main.c @@ -211,7 +211,7 @@ 0 17 0 - 190 + 192 206 0 .\src\profile.c @@ -379,22 +379,6 @@ 0 0 0 - - 5 - 11 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - ..\..\src\Tools\SEGGER_RTT.c - SEGGER_RTT.c - 0 - 0 - diff --git a/examples/peripheral_ancs/peripheral_ancs.uvoptx b/examples/peripheral_ancs/peripheral_ancs.uvoptx index 513a0ee7f..1786dc259 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvoptx +++ b/examples/peripheral_ancs/peripheral_ancs.uvoptx @@ -349,18 +349,6 @@ 0 0 0 - - 5 - 11 - 1 - 0 - 0 - 0 - ..\..\src\Tools\SEGGER_RTT.c - SEGGER_RTT.c - 0 - 0 - diff --git a/examples/peripheral_ancs/peripheral_ancs.uvproj b/examples/peripheral_ancs/peripheral_ancs.uvproj index 7738145d7..da6206abe 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvproj +++ b/examples/peripheral_ancs/peripheral_ancs.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -458,13 +458,6 @@ Tools - - - SEGGER_RTT.c - 1 - ..\..\src\Tools\SEGGER_RTT.c - - diff --git a/examples/peripheral_ancs/peripheral_ancs.uvprojx b/examples/peripheral_ancs/peripheral_ancs.uvprojx index fbe553d18..b4923ab10 100644 --- a/examples/peripheral_ancs/peripheral_ancs.uvprojx +++ b/examples/peripheral_ancs/peripheral_ancs.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -445,13 +445,6 @@ Tools - - - SEGGER_RTT.c - 1 - ..\..\src\Tools\SEGGER_RTT.c - - ::CMSIS diff --git a/examples/peripheral_ancs/src/main.c b/examples/peripheral_ancs/src/main.c index 37279455d..e5adb33b8 100644 --- a/examples/peripheral_ancs/src/main.c +++ b/examples/peripheral_ancs/src/main.c @@ -10,7 +10,6 @@ #include "eflash.h" #include -#include "SEGGER_RTT.h" uint32_t cb_hard_fault(hard_fault_info_t *info, void *_) { @@ -153,17 +152,6 @@ int db_read_from_flash(void *db, const int max_size) return KV_OK; } -uint32_t cb_trace_rtt(const platform_evt_trace_t *trace, void *user_data) -{ - int free_size = SEGGER_RTT_GetAvailWriteSpace(0); - if (trace->len1 + trace->len2 < free_size) - { - SEGGER_RTT_Write(0, trace->data1, trace->len1); - SEGGER_RTT_Write(0, trace->data2, trace->len2); - } - return 0; -} - int app_main() { // If there are *three* crystals on board, *uncomment* below line. @@ -190,10 +178,6 @@ int app_main() platform_config(PLATFORM_CFG_32K_CLK, PLATFORM_32K_OSC); - SEGGER_RTT_Init(); - platform_set_evt_callback(PLATFORM_CB_EVT_TRACE, (f_platform_evt_cb)cb_trace_rtt, NULL); - platform_config(PLATFORM_CFG_TRACE_MASK, 0xff); - return 0; } diff --git a/examples/peripheral_band/peripheral_band.ingw b/examples/peripheral_band/peripheral_band.ingw index 65b9327a8..b0a2cd0c4 100644 --- a/examples/peripheral_band/peripheral_band.ingw +++ b/examples/peripheral_band/peripheral_band.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x42, 0x61, 0x6E, 0x64, \r\n\r\n\/\/ Service Heart Rate: 180D\r\n0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x0D, 0x18, \r\n\/\/ Characteristic Heart Rate Measurement: 2A37\r\n0x0D, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x10, 0x06, 0x00, 0x37, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x06, 0x00, 0x37, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x07, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x10, 0x0A, 0x00, 0x53, 0x2A, \r\n0x08, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x53, 0x2A,\r\n0x0A, 0x00, 0x0A, 0x01, 0x0B, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x03, 0x28,\r\n0x02, 0x0D, 0x00, 0x54, 0x2A, \r\n0x08, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x54, 0x2A,\r\n\r\n0x00,0x00\r\n\/\/ total size = 144\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT=6\r\n\/\/ HANDLE_RSC_MEASUREMENT=10\r\n\/\/ HANDLE_RSC_FEATURE=13\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_HEART_RATE_MEASUREMENT_OFFSET=70\r\n\/\/ HANDLE_RSC_MEASUREMENT_OFFSET=111\r\n\/\/ HANDLE_RSC_FEATURE_OFFSET=142\r\n", diff --git a/examples/peripheral_band/peripheral_band.uvproj b/examples/peripheral_band/peripheral_band.uvproj index 676475575..aa2c5737d 100644 --- a/examples/peripheral_band/peripheral_band.uvproj +++ b/examples/peripheral_band/peripheral_band.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_band/peripheral_band.uvprojx b/examples/peripheral_band/peripheral_band.uvprojx index c04f15701..8d3f4b86d 100644 --- a/examples/peripheral_band/peripheral_band.uvprojx +++ b/examples/peripheral_band/peripheral_band.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_battery/peripheral_battery.ingw b/examples/peripheral_battery/peripheral_battery.ingw index 898973063..eb03e2bc8 100644 --- a/examples/peripheral_battery/peripheral_battery.ingw +++ b/examples/peripheral_battery/peripheral_battery.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -49,8 +49,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n" diff --git a/examples/peripheral_battery/peripheral_battery.uvproj b/examples/peripheral_battery/peripheral_battery.uvproj index b8d651c03..cf900e619 100644 --- a/examples/peripheral_battery/peripheral_battery.uvproj +++ b/examples/peripheral_battery/peripheral_battery.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_battery/peripheral_battery.uvprojx b/examples/peripheral_battery/peripheral_battery.uvprojx index d2b36b0ef..c484b4eee 100644 --- a/examples/peripheral_battery/peripheral_battery.uvprojx +++ b/examples/peripheral_battery/peripheral_battery.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_console/flash_download.ini b/examples/peripheral_console/flash_download.ini index d8e6ef1ee..2a6e992a0 100644 --- a/examples/peripheral_console/flash_download.ini +++ b/examples/peripheral_console/flash_download.ini @@ -15,7 +15,7 @@ protection.unlock=0 [bin-0] Name=Burn Bin #1 -Checked=1 +Checked=0 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 diff --git a/examples/peripheral_console/peripheral_console.ingw b/examples/peripheral_console/peripheral_console.ingw index d987377fc..b2a514ecd 100644 --- a/examples/peripheral_console/peripheral_console.ingw +++ b/examples/peripheral_console/peripheral_console.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x43, 0x6D, 0x64, \r\n\r\n\/\/ Service INGChips Generic I\/O Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 172\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=160\r\n", diff --git a/examples/peripheral_console/peripheral_console.uvopt b/examples/peripheral_console/peripheral_console.uvopt index 0dcbd03d4..d68b96eb5 100644 --- a/examples/peripheral_console/peripheral_console.uvopt +++ b/examples/peripheral_console/peripheral_console.uvopt @@ -146,24 +146,7 @@ -UV0MCU118 -O70 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO2 -FD20000000 -FC8000 -FN1 -FF0ING91800 -FS04000 -FL080000 - - - 0 - 0 - 57 - 1 -
    0
    - 0 - 0 - 0 - 0 - 0 - 0 - C:\projects\svn\SDK_Release\examples\peripheral_console\src\main.c - - -
    -
    + 0 @@ -224,10 +207,10 @@ 1 0 0 - 4 + 2 0 - 55 - 109 + 0 + 0 0 .\src\main.c main.c @@ -240,10 +223,10 @@ 1 0 0 - 66 + 6 0 - 143 - 153 + 0 + 0 0 .\src\profile.c profile.c @@ -258,8 +241,8 @@ 0 53 0 - 16 - 38 + 0 + 0 0 .\src\service_console.c service_console.c @@ -301,7 +284,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 @@ -330,14 +313,46 @@ 0 20 0 - 1 - 2 + 0 + 0 0 ../..\src\FWlib\peripheral_uart.c peripheral_uart.c 0 0 + + 4 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + + + 4 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_sysctrl.c + peripheral_sysctrl.c + 0 + 0 +
    @@ -348,4 +363,4 @@ 0 - \ No newline at end of file + diff --git a/examples/peripheral_console/peripheral_console.uvoptx b/examples/peripheral_console/peripheral_console.uvoptx index 28a1091c3..0078e43ff 100644 --- a/examples/peripheral_console/peripheral_console.uvoptx +++ b/examples/peripheral_console/peripheral_console.uvoptx @@ -278,7 +278,7 @@ FWlib - 0 + 1 0 0 0 @@ -294,6 +294,30 @@ 0 0 + + 4 + 7 + 1 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_sysctrl.c + peripheral_sysctrl.c + 0 + 0 + + + 4 + 8 + 1 + 0 + 0 + 0 + ..\..\src\FWlib\peripheral_pinctrl.c + peripheral_pinctrl.c + 0 + 0 + diff --git a/examples/peripheral_console/peripheral_console.uvproj b/examples/peripheral_console/peripheral_console.uvproj index 6a898ae99..7b4952a87 100644 --- a/examples/peripheral_console/peripheral_console.uvproj +++ b/examples/peripheral_console/peripheral_console.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -432,6 +432,16 @@ 1 ../..\src\FWlib\peripheral_uart.c + + peripheral_pinctrl.c + 1 + ..\..\src\FWlib\peripheral_pinctrl.c + + + peripheral_sysctrl.c + 1 + ..\..\src\FWlib\peripheral_sysctrl.c + diff --git a/examples/peripheral_console/peripheral_console.uvprojx b/examples/peripheral_console/peripheral_console.uvprojx index f61c1ccaf..bc4fe7e72 100644 --- a/examples/peripheral_console/peripheral_console.uvprojx +++ b/examples/peripheral_console/peripheral_console.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -419,6 +419,16 @@ 1 ../..\src\FWlib\peripheral_uart.c + + peripheral_sysctrl.c + 1 + ..\..\src\FWlib\peripheral_sysctrl.c + + + peripheral_pinctrl.c + 1 + ..\..\src\FWlib\peripheral_pinctrl.c + diff --git a/examples/peripheral_console/src/main.c b/examples/peripheral_console/src/main.c index 99ca1d59f..927ec11cb 100644 --- a/examples/peripheral_console/src/main.c +++ b/examples/peripheral_console/src/main.c @@ -41,11 +41,25 @@ void config_uart(uint32_t freq, uint32_t baud) apUART_Initialize(PRINT_PORT, &config, 0); } +uint32_t on_lle_reset(void *dummy, void *user_data) +{ + (void)(dummy); + (void)(user_data); + *(uint32_t *)(0x40090064) = 0x400; + *(uint32_t *)(0x4007005c) = 0x80; + + return 0; +} + void setup_peripherals(void) { + int i; + SYSCTRL_SetClkGateMulti((1 << SYSCTRL_ClkGate_APB_UART0)); config_uart(OSC_CLK_FREQ, 115200); - // *(uint32_t*)(0x4007005c) = 0x81; - // *(uint32_t*)(0x40090064) = 0x400; + + for (i = 8; i <= 15; i++) + PINCTRL_SetPadMux(i, IO_SOURCE_DEBUG_BUS); + on_lle_reset(NULL, NULL); } #define w32(a,b) *(volatile uint32_t*)(a) = (uint32_t)(b) @@ -55,30 +69,6 @@ uint32_t on_deep_sleep_wakeup(void *dummy, void *user_data) { (void)(dummy); (void)(user_data); -/* - w32(0x40004000,0x0);//ie0 - w32(0x40004004,0x0);//ie1 - w32(0x40004008,0x0);//is0 - w32(0x4000400c,0x0);//is1 - w32(0x40004010,0x0);//pe0 - w32(0x40004014,0x0);//pe1 - w32(0x40004018,0x0);//ps0 - w32(0x4000401c,0x0);//ps1 - w32(0x40004030,0x0);//ds0 - w32(0x40004034,0x0);//ds1 - - w32(0x40070058,0xffffffff);//peri input select - w32(0x40070048,0x0);//gpio output enable - w32(0x4007004c,0x0);//gpio output enable - w32(0x40070050,0x0);//gpio output enable - - w32(0x40070054,0xffffffc3);//peri input select - w32(0x40070044,0x400);//gpio output enable - - w32(0x40070050,0x0);//gpio output enable - - w32(0x40040094,r32(0x40040094) | 0x1); //gpio output enable -*/ setup_peripherals(); return 0; @@ -101,11 +91,21 @@ const int16_t power_mapping[] = { 4600, 4700, 4800, 4900, 5000, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300}; +//#define USE_OSC32K + int app_main() { // If there are *three* crystals on board, *uncomment* below line. // Otherwise, below line should be kept commented out. // platform_set_rf_clk_source(0); + +#ifdef USE_OSC32K + platform_config(PLATFORM_CFG_32K_CLK, PLATFORM_32K_OSC); +#else + platform_config(PLATFORM_CFG_OSC32K_EN, PLATFORM_CFG_DISABLE); + platform_config(PLATFORM_CFG_32K_CLK_ACC, 500); + platform_config(PLATFORM_CFG_32K_CALI_PERIOD, 4); +#endif setup_peripherals(); sysSetPublicDeviceAddr((const unsigned char *)(0x2a010)); @@ -118,14 +118,15 @@ int app_main() // setup deep sleep handlers platform_set_evt_callback(PLATFORM_CB_EVT_ON_DEEP_SLEEP_WAKEUP, on_deep_sleep_wakeup, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, query_deep_sleep_allowed, NULL); - + platform_set_evt_callback(PLATFORM_CB_EVT_LLE_INIT, on_lle_reset, NULL); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); // setup putc handle platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); - platform_config(PLATFORM_CFG_32K_CLK, PLATFORM_32K_OSC); platform_config(PLATFORM_CFG_POWER_SAVING, PLATFORM_CFG_ENABLE); + + w32(0x40040014,(r32(0x40040014) & (~(0x1f << 8))) | (0xc << 8)); return 0; } diff --git a/examples/peripheral_console/src/profile.c b/examples/peripheral_console/src/profile.c index 70de20204..4ae33948f 100644 --- a/examples/peripheral_console/src/profile.c +++ b/examples/peripheral_console/src/profile.c @@ -83,7 +83,6 @@ static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) bd_addr_t null_addr = {0xAB, 0x89, 0x67, 0x45, 0x23, 0x01}; extern int adv_tx_power; -int kkk = 0; static void setup_adv() { diff --git a/examples/peripheral_etag/peripheral_etag.ingw b/examples/peripheral_etag/peripheral_etag.ingw index 5e3730dcf..dd5631a45 100644 --- a/examples/peripheral_etag/peripheral_etag.ingw +++ b/examples/peripheral_etag/peripheral_etag.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_ETAG_DATA", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x10, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x65, 0x54, 0x61, 0x67, \r\n\r\n\/\/ Service INGChips eTag Service: {1145c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x11, \r\n\/\/ Characteristic eTag Control: {1145c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x11, \r\n0x17, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x11, \r\n0x00, \r\n\/\/ Characteristic eTag Data: {1145c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x04, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x11, \r\n0x16, 0x00, 0x04, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x11, \r\n\r\n0x00,0x00\r\n\/\/ total size = 164\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_ETAG_CONTROL=6\r\n\/\/ HANDLE_ETAG_DATA=8\r\n", diff --git a/examples/peripheral_etag/peripheral_etag.uvproj b/examples/peripheral_etag/peripheral_etag.uvproj index 3aa25878f..354904884 100644 --- a/examples/peripheral_etag/peripheral_etag.uvproj +++ b/examples/peripheral_etag/peripheral_etag.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_etag/peripheral_etag.uvprojx b/examples/peripheral_etag/peripheral_etag.uvprojx index 7874da13d..59f7aae9e 100644 --- a/examples/peripheral_etag/peripheral_etag.uvprojx +++ b/examples/peripheral_etag/peripheral_etag.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw index 1fa03c203..0ee4fa155 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -51,8 +51,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj index f8af2ecb3..1ec05eef7 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx index d74b651cf..ef3469b0a 100644 --- a/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx +++ b/examples/peripheral_ibeacon/peripheral_ibeacon.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_irc/peripheral_irc.ingw b/examples/peripheral_irc/peripheral_irc.ingw index 50d6027a0..c7b654cf3 100644 --- a/examples/peripheral_irc/peripheral_irc.ingw +++ b/examples/peripheral_irc/peripheral_irc.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/peripheral_irc/peripheral_irc.uvproj b/examples/peripheral_irc/peripheral_irc.uvproj index 9760936ca..c44564e96 100644 --- a/examples/peripheral_irc/peripheral_irc.uvproj +++ b/examples/peripheral_irc/peripheral_irc.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_irc/peripheral_irc.uvprojx b/examples/peripheral_irc/peripheral_irc.uvprojx index d54029b58..78cc41026 100644 --- a/examples/peripheral_irc/peripheral_irc.uvprojx +++ b/examples/peripheral_irc/peripheral_irc.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_led/flash_download.ini b/examples/peripheral_led/flash_download.ini index 76d7a1a33..b527526e4 100644 --- a/examples/peripheral_led/flash_download.ini +++ b/examples/peripheral_led/flash_download.ini @@ -27,7 +27,7 @@ FileName=peripheral_led.bin [uart] PortNumber=3 -Baud=115200 +Baud=921600 Parity= DataBits=8 StopBits=1 diff --git a/examples/peripheral_led/peripheral_led.ingw b/examples/peripheral_led/peripheral_led.ingw index 48a36fdac..f233b5083 100644 --- a/examples/peripheral_led/peripheral_led.ingw +++ b/examples/peripheral_led/peripheral_led.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -53,8 +53,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RGB_LIGHTING_CONTROL", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x4C, 0x45, 0x44, \r\n\r\n\/\/ Service INGChips RGB Lighting Service: {6a33a526-e004-4793-a084-8a1dc49b84fd}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xFD, 0x84, 0x9B, 0xC4, 0x1D, 0x8A, 0x84, 0xA0, \r\n0x93, 0x47, 0x04, 0xE0, 0x26, 0xA5, 0x33, 0x6A, \r\n\/\/ Characteristic RGB Lighting Control: {1c190e92-37dd-4ac4-8154-0444c69274c2}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0xC2, 0x74, 0x92, 0xC6, 0x44, \r\n0x04, 0x54, 0x81, 0xC4, 0x4A, 0xDD, 0x37, 0x92, \r\n0x0E, 0x19, 0x1C, \r\n0x19, 0x00, 0x06, 0x02, 0x06, 0x00,\r\n0xC2, 0x74, 0x92, 0xC6, 0x44, 0x04, 0x54, 0x81, \r\n0xC4, 0x4A, 0xDD, 0x37, 0x92, 0x0E, 0x19, 0x1C, \r\n0x00, 0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 116\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_RGB_LIGHTING_CONTROL_OFFSET=111\r\n", diff --git a/examples/peripheral_led/peripheral_led.uvoptx b/examples/peripheral_led/peripheral_led.uvoptx index ce8964e17..837fb950f 100644 --- a/examples/peripheral_led/peripheral_led.uvoptx +++ b/examples/peripheral_led/peripheral_led.uvoptx @@ -117,7 +117,7 @@ 0 DLGUARM - d + / 0 @@ -151,7 +151,7 @@ 0 64 1 -
    156122
    +
    156150
    0 0 0 @@ -163,6 +163,14 @@ \\peripheral_led\src/main.c\64 + + + 1 + 2 + 0x400a0000 + 0 + + 0 diff --git a/examples/peripheral_led/peripheral_led.uvproj b/examples/peripheral_led/peripheral_led.uvproj index 3ba51efcb..10efeb93e 100644 --- a/examples/peripheral_led/peripheral_led.uvproj +++ b/examples/peripheral_led/peripheral_led.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_led/peripheral_led.uvprojx b/examples/peripheral_led/peripheral_led.uvprojx index 9f0912c57..d48b08777 100644 --- a/examples/peripheral_led/peripheral_led.uvprojx +++ b/examples/peripheral_led/peripheral_led.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_pedometer/peripheral_pedometer.ingw b/examples/peripheral_pedometer/peripheral_pedometer.ingw index 239281089..b196df2a0 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.ingw +++ b/examples/peripheral_pedometer/peripheral_pedometer.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -51,8 +51,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_RSC_FEATURE", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x15, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x65, 0x64, 0x6F, \r\n0x6D, 0x65, 0x74, 0x65, 0x72, \r\n\/\/ Characteristic Appearance: 2A01\r\n0x0D, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x28,\r\n0x02, 0x05, 0x00, 0x01, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x05, 0x00, 0x01, 0x2A,\r\n0x40, 0x04, \r\n\r\n\/\/ Service Running Speed and Cadence: 1814\r\n0x0A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x28,\r\n0x14, 0x18, \r\n\/\/ Characteristic RSC Measurement: 2A53\r\n0x0D, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x53, 0x2A, \r\n0x12, 0x00, 0x10, 0x00, 0x08, 0x00, 0x53, 0x2A,\r\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r\n0x00, 0x00, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\/\/ Characteristic RSC Feature: 2A54\r\n0x0D, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x03, 0x28,\r\n0x02, 0x0B, 0x00, 0x54, 0x2A, \r\n0x0A, 0x00, 0x02, 0x00, 0x0B, 0x00, 0x54, 0x2A,\r\n0x07, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 143\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_APPEARANCE=5\r\n\/\/ HANDLE_RSC_MEASUREMENT=8\r\n\/\/ HANDLE_RSC_FEATURE=11\r\n" diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvproj b/examples/peripheral_pedometer/peripheral_pedometer.uvproj index b8bcc19a9..ea1f35fd8 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvproj +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx index b935a02f4..452e7e127 100644 --- a/examples/peripheral_pedometer/peripheral_pedometer.uvprojx +++ b/examples/peripheral_pedometer/peripheral_pedometer.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_piano/peripheral_piano.ingw b/examples/peripheral_piano/peripheral_piano.ingw index 48b9aed35..201e753cc 100644 --- a/examples/peripheral_piano/peripheral_piano.ingw +++ b/examples/peripheral_piano/peripheral_piano.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_KEY_INPUT", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x11, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x50, 0x69, 0x61, 0x6E, \r\n0x6F, \r\n\r\n\/\/ Service INGChips Piano Service: {00000002-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x02, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Key Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 115\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_KEY_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_KEY_INPUT_OFFSET=113\r\n", diff --git a/examples/peripheral_piano/peripheral_piano.uvproj b/examples/peripheral_piano/peripheral_piano.uvproj index 8f6e75e76..710b65564 100644 --- a/examples/peripheral_piano/peripheral_piano.uvproj +++ b/examples/peripheral_piano/peripheral_piano.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_piano/peripheral_piano.uvprojx b/examples/peripheral_piano/peripheral_piano.uvprojx index 30e06763f..d27a8ce34 100644 --- a/examples/peripheral_piano/peripheral_piano.uvprojx +++ b/examples/peripheral_piano/peripheral_piano.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_throughput/flash_download.ini b/examples/peripheral_throughput/flash_download.ini index 0c37786a8..1f5a8530c 100644 --- a/examples/peripheral_throughput/flash_download.ini +++ b/examples/peripheral_throughput/flash_download.ini @@ -31,7 +31,7 @@ Baud=921600 Parity= DataBits=8 StopBits=1 -Port=COM3 +Port=COM14 AsyncIO=0 [main] diff --git a/examples/peripheral_throughput/peripheral_throughput.ingw b/examples/peripheral_throughput/peripheral_throughput.ingw index 7f54846b1..8fc302341 100644 --- a/examples/peripheral_throughput/peripheral_throughput.ingw +++ b/examples/peripheral_throughput/peripheral_throughput.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x0F, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x54, 0x70, 0x74, \r\n\r\n\/\/ Service INGChips Throughput Service: {2445314a-a1d4-4874-b4d1-fdfb6f501485}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x85, 0x14, 0x50, 0x6F, 0xFB, 0xFD, 0xD1, 0xB4, \r\n0x74, 0x48, 0xD4, 0xA1, 0x4A, 0x31, 0x45, 0x24, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x04, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x04, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\r\n0x00,0x00\r\n\/\/ total size = 113\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=111\r\n", diff --git a/examples/peripheral_throughput/peripheral_throughput.uvproj b/examples/peripheral_throughput/peripheral_throughput.uvproj index b140ccef9..cf3a6aee0 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvproj +++ b/examples/peripheral_throughput/peripheral_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/peripheral_throughput/peripheral_throughput.uvprojx b/examples/peripheral_throughput/peripheral_throughput.uvprojx index 8a45cc162..7317b32b7 100644 --- a/examples/peripheral_throughput/peripheral_throughput.uvprojx +++ b/examples/peripheral_throughput/peripheral_throughput.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/secondary_fota/secondary_fota.ingw b/examples/secondary_fota/secondary_fota.ingw index 999a11995..9ae379de4 100644 --- a/examples/secondary_fota/secondary_fota.ingw +++ b/examples/secondary_fota/secondary_fota.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -64,8 +64,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "1", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x1A, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x65, 0x63, 0x6F, \r\n0x6E, 0x64, 0x61, 0x72, 0x79, 0x20, 0x46, 0x4F, \r\n0x54, 0x41, \r\n\r\n\/\/ Service INGChips FOTA Service: {3345c2f0-6f36-45c5-8541-92f56728d5f3}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF0, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Version: {3345c2f1-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x02, 0x06, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF1, \r\n0xC2, 0x45, 0x33, \r\n0x1E, 0x00, 0x02, 0x02, 0x06, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF1, 0xC2, 0x45, 0x33, \r\n0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x28, 0x01, \r\n\/\/ Characteristic FOTA Control: {3345c2f2-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x06, 0x08, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF2, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x06, 0x03, 0x08, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF2, 0xC2, 0x45, 0x33, \r\n\/\/ Characteristic FOTA Data: {3345c2f3-6f36-45c5-8541-92f56728d5f3}\r\n0x1B, 0x00, 0x02, 0x00, 0x09, 0x00, 0x03, 0x28,\r\n0x04, 0x0A, 0x00, 0xF3, 0xD5, 0x28, 0x67, 0xF5, \r\n0x92, 0x41, 0x85, 0xC5, 0x45, 0x36, 0x6F, 0xF3, \r\n0xC2, 0x45, 0x33, \r\n0x16, 0x00, 0x04, 0x03, 0x0A, 0x00,\r\n0xF3, 0xD5, 0x28, 0x67, 0xF5, 0x92, 0x41, 0x85, \r\n0xC5, 0x45, 0x36, 0x6F, 0xF3, 0xC2, 0x45, 0x33, \r\n\r\n0x00,0x00\r\n\/\/ total size = 230\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_FOTA_VERSION=6\r\n\/\/ HANDLE_FOTA_CONTROL=8\r\n\/\/ HANDLE_FOTA_DATA=10\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_FOTA_VERSION_OFFSET=122\r\n\/\/ HANDLE_FOTA_CONTROL_OFFSET=179\r\n\/\/ HANDLE_FOTA_DATA_OFFSET=228\r\n", diff --git a/examples/secondary_fota/secondary_fota.uvoptx b/examples/secondary_fota/secondary_fota.uvoptx index 1beafd33f..db9a2f14c 100644 --- a/examples/secondary_fota/secondary_fota.uvoptx +++ b/examples/secondary_fota/secondary_fota.uvoptx @@ -218,7 +218,7 @@ 1 3 1 - 0 + 1 0 0 .\src\ota_service.c diff --git a/examples/secondary_fota/secondary_fota.uvproj b/examples/secondary_fota/secondary_fota.uvproj index bc9764f28..fb5fde6ad 100644 --- a/examples/secondary_fota/secondary_fota.uvproj +++ b/examples/secondary_fota/secondary_fota.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/secondary_fota/secondary_fota.uvprojx b/examples/secondary_fota/secondary_fota.uvprojx index 48c2a5ed7..78dc85e30 100644 --- a/examples/secondary_fota/secondary_fota.uvprojx +++ b/examples/secondary_fota/secondary_fota.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/secondary_fota/src/ota_service.c b/examples/secondary_fota/src/ota_service.c index 75a76c248..dbab7b71e 100644 --- a/examples/secondary_fota/src/ota_service.c +++ b/examples/secondary_fota/src/ota_service.c @@ -20,7 +20,9 @@ #define EFLASH_BASE ((uint32_t)0x00004000UL) #define EFLASH_SIZE ((uint32_t)0x00080000UL) //512k byte -#include "eflash.c" +#define EFLASH_END (EFLASH_BASE + EFLASH_SIZE) + +#include "eflash.inc" uint32_t ClkFreq; //0:16M 1:24M @@ -86,7 +88,16 @@ int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t else ota_ctrl[0] = OTA_STATUS_OK; EflashProgramEnable(); - EraseEFlashPage(((ota_addr - EFLASH_BASE) >> 13) & 0x3f); + if (ota_addr >= EFLASH_END) + { + *(volatile uint32_t *)(0xc40a0) = 0x4; + EraseEFlashPage(ota_addr >= EFLASH_END + PAGE_SIZE ? 1 : 0); + *(volatile uint32_t *)(0xc40a0) = 0x0; + } + else + { + EraseEFlashPage(((ota_addr - EFLASH_BASE) >> 13) & 0x3f); + } ota_downloading = 1; ota_start_addr = ota_addr; break; @@ -94,8 +105,20 @@ int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t EflashProgramDisable(); ota_downloading = 0; ota_addr = 0; - if (crc((uint8_t *)ota_start_addr, *(uint16_t *)(buffer + 1)) != *(uint16_t *)(buffer + 3)) - ota_ctrl[0] = OTA_STATUS_ERROR; + { + uint16_t len = *(uint16_t *)(buffer + 1); + uint16_t crc_value = *(uint16_t *)(buffer + 3); + if (ota_addr - ota_start_addr < len) + { + ota_ctrl[0] = OTA_STATUS_WAIT_DATA; + break; + } + + if (crc((uint8_t *)ota_start_addr, len) != crc_value) + ota_ctrl[0] = OTA_STATUS_ERROR; + else + ota_ctrl[0] = OTA_STATUS_OK; + } break; case OTA_CTRL_READ_PAGE: if (ota_downloading) diff --git a/examples/secondary_fota/src/ota_service.h b/examples/secondary_fota/src/ota_service.h deleted file mode 100644 index 0c2bb5fc1..000000000 --- a/examples/secondary_fota/src/ota_service.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -* Copyright (C) INGCHIPS. All rights reserved. -* This code is INGCHIPS proprietary and confidential. -* Any use of the code for whatever purpose is subject to -* specific written permission of INGCHIPS. -*/ - -#ifndef _ota_service_h -#define _ota_service_h - -#include - -typedef struct prog_ver -{ - short major; - char minor; - char patch; -} prog_ver_t; - -typedef struct ota_ver -{ - prog_ver_t stack; - prog_ver_t app; -} ota_ver_t; - -#define OTA_CTRL_START 0xAA // param: no -#define OTA_CTRL_PAGE_BEGIN 0xB0 // param: page address (32 bit), following DATA contains the data -#define OTA_CTRL_PAGE_END 0xB1 // param: size (16bit), crc (16bit) -#define OTA_CTRL_READ_PAGE 0xC0 // param: page address, following DATA reading contains the data -#define OTA_CTRL_REBOOT 0xFF // param: no - -#define OTA_STATUS_DISABLED 0 -#define OTA_STATUS_OK 1 -#define OTA_STATUS_ERROR 2 - -int ota_write_callback(uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size); -int ota_read_callback(uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size); - -#endif diff --git a/examples/smart_meter/smart_meter.ingw b/examples/smart_meter/smart_meter.ingw index 0f7be4668..f37754a42 100644 --- a/examples/smart_meter/smart_meter.ingw +++ b/examples/smart_meter/smart_meter.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -55,8 +55,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_GENERIC_INPUT", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x17, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x53, 0x6D, 0x61, 0x72, \r\n0x74, 0x20, 0x4D, 0x65, 0x74, 0x65, 0x72, \r\n\r\n\/\/ Service INGChips Console Service: {43f4b114-ca67-48e8-a46f-9a8ffeb7146a}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x6A, 0x14, 0xB7, 0xFE, 0x8F, 0x9A, 0x6F, 0xA4, \r\n0xE8, 0x48, 0x67, 0xCA, 0x14, 0xB1, 0xF4, 0x43, \r\n\/\/ Characteristic Generic Input: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Generic Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 180\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_GENERIC_INPUT=6\r\n\/\/ HANDLE_GENERIC_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_GENERIC_INPUT_OFFSET=119\r\n\/\/ HANDLE_GENERIC_OUTPUT_OFFSET=168\r\n", diff --git a/examples/smart_meter/smart_meter.uvopt b/examples/smart_meter/smart_meter.uvopt index 99c914b95..ff673aff0 100644 --- a/examples/smart_meter/smart_meter.uvopt +++ b/examples/smart_meter/smart_meter.uvopt @@ -397,8 +397,8 @@ 0 0 0 - ..\..\src\Tools\SEGGER_RTT.c - SEGGER_RTT.c + ..\..\src\Tools\trace.c + trace.c 0 0 diff --git a/examples/smart_meter/smart_meter.uvoptx b/examples/smart_meter/smart_meter.uvoptx index 93c88d605..c9544d0f2 100644 --- a/examples/smart_meter/smart_meter.uvoptx +++ b/examples/smart_meter/smart_meter.uvoptx @@ -349,8 +349,8 @@ 0 0 0 - ..\..\src\Tools\SEGGER_RTT.c - SEGGER_RTT.c + ..\..\src\Tools\trace.c + trace.c 0 0 diff --git a/examples/smart_meter/smart_meter.uvproj b/examples/smart_meter/smart_meter.uvproj index e26ce9e25..5be152357 100644 --- a/examples/smart_meter/smart_meter.uvproj +++ b/examples/smart_meter/smart_meter.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -458,9 +458,9 @@ ..\..\src\Tools\ad_parser.c - SEGGER_RTT.c + trace.c 1 - ..\..\src\Tools\SEGGER_RTT.c + ..\..\src\Tools\trace.c
    diff --git a/examples/smart_meter/smart_meter.uvprojx b/examples/smart_meter/smart_meter.uvprojx index 61928e2af..96c53001a 100644 --- a/examples/smart_meter/smart_meter.uvprojx +++ b/examples/smart_meter/smart_meter.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 @@ -445,9 +445,9 @@ ..\..\src\Tools\ad_parser.c - SEGGER_RTT.c + trace.c 1 - ..\..\src\Tools\SEGGER_RTT.c + ..\..\src\Tools\trace.c diff --git a/examples/smart_meter/src/main.c b/examples/smart_meter/src/main.c index a2d780b62..11119aa86 100644 --- a/examples/smart_meter/src/main.c +++ b/examples/smart_meter/src/main.c @@ -4,8 +4,8 @@ #include "platform_api.h" #include "FreeRTOS.h" #include "task.h" +#include "trace.h" #include -#include "SEGGER_RTT.h" #include "uart_console.h" @@ -94,8 +94,8 @@ void setup_peripherals(void) SYSCTRL_ClearClkGateMulti((1 << SYSCTRL_ClkGate_APB_TMR1)); // timer 0 can be used as watchdog, so we use timer 1. // setup timer 1 to sampling rate - TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / 50); - TMR_SetOpMode(APB_TMR1, TMR_CTL_OP_MODE_WRAPPING); + TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / 50); + TMR_SetOpMode(APB_TMR1, TMR_CTL_OP_MODE_WRAPPING); TMR_Reload(APB_TMR1); TMR_IntEnable(APB_TMR1); } @@ -127,25 +127,7 @@ uint32_t timer_isr(void *user_data) return 0; } -uint32_t cb_lle_reset(void *_, void * __) -{ -#define reg(x) ((volatile uint32_t *)(x)) - *reg(0x40070048) = 0xffffffff; - *reg(0x4007005c) = 0x82; - *reg(0x40090064) = (1 << 10) | 0; // 0x400; - return 0; -} - -uint32_t cb_trace_rtt(const platform_evt_trace_t *trace, void *user_data) -{ - int free_size = SEGGER_RTT_GetAvailWriteSpace(0); - if (trace->len1 + trace->len2 < free_size) - { - SEGGER_RTT_Write(0, trace->data1, trace->len1); - SEGGER_RTT_Write(0, trace->data2, trace->len2); - } - return 0; -} +trace_rtt_t trace_ctx = {0}; int app_main() { @@ -169,10 +151,9 @@ int app_main() setup_peripherals(); platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER1, timer_isr, NULL); - platform_set_evt_callback(PLATFORM_CB_EVT_LLE_INIT, cb_lle_reset, NULL); - SEGGER_RTT_Init(); - platform_set_evt_callback(PLATFORM_CB_EVT_TRACE, (f_platform_evt_cb)cb_trace_rtt, NULL); + trace_rtt_init(&trace_ctx); + platform_set_evt_callback(PLATFORM_CB_EVT_TRACE, (f_platform_evt_cb)cb_trace_rtt, &trace_ctx); platform_config(PLATFORM_CFG_TRACE_MASK, 0xff); return 0; diff --git a/examples/thermo_ota/thermo_ota.ingw b/examples/thermo_ota/thermo_ota.ingw index 599243c57..5c817822b 100644 --- a/examples/thermo_ota/thermo_ota.ingw +++ b/examples/thermo_ota/thermo_ota.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -32,6 +32,6 @@ "app_rom_addr": "155648", "arm_inc": "C:\/keil\/ARM\/ARMCC\/include", "cmsis": "", - "app_ram_size": 35048, - "app_ram_addr": 536901400 + "app_ram_size": 33000, + "app_ram_addr": 536903448 } \ No newline at end of file diff --git a/examples/thermo_ota/thermo_ota.uvoptx b/examples/thermo_ota/thermo_ota.uvoptx index 4e2e9b18c..d3b499b5d 100644 --- a/examples/thermo_ota/thermo_ota.uvoptx +++ b/examples/thermo_ota/thermo_ota.uvoptx @@ -495,7 +495,7 @@ 5 12 1 - 0 + 1 0 0 ..\..\src\Tools\ota_service.c diff --git a/examples/thermo_ota/thermo_ota.uvproj b/examples/thermo_ota/thermo_ota.uvproj index 2e9fc072a..7fd5aeffa 100644 --- a/examples/thermo_ota/thermo_ota.uvproj +++ b/examples/thermo_ota/thermo_ota.uvproj @@ -332,8 +332,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/thermo_ota/thermo_ota.uvprojx b/examples/thermo_ota/thermo_ota.uvprojx index aa72c37c0..7e8bdcde6 100644 --- a/examples/thermo_ota/thermo_ota.uvprojx +++ b/examples/thermo_ota/thermo_ota.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/uart_console/README.md b/examples/uart_console/README.md index 71652f105..1af470fe6 100644 --- a/examples/uart_console/README.md +++ b/examples/uart_console/README.md @@ -3,7 +3,8 @@ This example demonstrates how to: * Usage of UART; -* Dynamic changing of advertising data & address. +* Dynamic changing of advertising data & address; +* Discover services. Note: Use a serial tool to communicate. CR/LF is used to mark the end of a command. diff --git a/examples/uart_console/data/advertising.adv b/examples/uart_console/data/advertising.adv index 9666ac546..f7d427d1d 100644 --- a/examples/uart_console/data/advertising.adv +++ b/examples/uart_console/data/advertising.adv @@ -1,3 +1,7 @@ +// 0x01 - «Flags» +2, 0x01, +0x06, + // 0x09 - «Complete Local Name» 13, 0x09, 0x55, 0x41, 0x52, 0x54, 0x20, 0x43, 0x6F, 0x6E, diff --git a/examples/uart_console/flash_download.ini b/examples/uart_console/flash_download.ini index 7134933b1..835b97e5b 100644 --- a/examples/uart_console/flash_download.ini +++ b/examples/uart_console/flash_download.ini @@ -15,7 +15,7 @@ script= [bin-0] Name=Burn Bin #1 -Checked=1 +Checked=0 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -35,7 +35,7 @@ StopBits=1 [main] timeout=10000 MIN_ADDR=16384 -MAX_ADDR=540672 +MAX_ADDR=540671 [bin-2] Name=Burn Bin #3 diff --git a/examples/uart_console/src/profile.c b/examples/uart_console/src/profile.c index c81761a4a..0a97fb00f 100644 --- a/examples/uart_console/src/profile.c +++ b/examples/uart_console/src/profile.c @@ -2,7 +2,10 @@ #include "att_db.h" #include "gap.h" #include "btstack_event.h" - +#include "btstack_util.h" +#include "btstack_defines.h" +#include "gatt_client.h" +#include "sig_uuid.h" #include #include @@ -21,6 +24,9 @@ const static uint8_t profile_data[] = { #include "../data/gatt.profile" }; +#define INVALID_HANDLE 0xffff +uint16_t conn_handle = INVALID_HANDLE; + static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size) { @@ -46,6 +52,9 @@ static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_h } uint8_t rand_addr[] = {1,2,3,4,5,6}; +uint8_t slave_addr[] = {0,0,0,0,0,0}; +bd_addr_type_t slave_addr_type = BD_ADDR_TYPE_LE_RANDOM; + extern int8_t adv_tx_power; void do_set_data() @@ -53,13 +62,66 @@ void do_set_data() gap_set_ext_adv_data(0, adv_data[0] + 1, (uint8_t *)(adv_data)); } +void service_discovery_callback(uint8_t packet_type, uint16_t _, const uint8_t *packet, uint16_t size) +{ + switch (packet[0]) + { + case GATT_EVENT_SERVICE_QUERY_RESULT: + { + int i; + const gatt_event_service_query_result_t *result = gatt_event_service_query_result_parse(packet); + platform_printf("\nFind Service:\nUUID: "); + for (i = 0; i < 16; i++) + { + platform_printf(":%02X", result->service.uuid128[i]); + } + platform_printf("\nHandles: %d - %d\n========================\n", + result->service.start_group_handle, result->service.end_group_handle); + } + break; + case GATT_EVENT_QUERY_COMPLETE: + platform_printf("discovery done, disconnect...\n"); + gap_disconnect(conn_handle); + break; + } +} + #define USER_MSG_START_ADV 0 #define USER_MSG_STOP_ADV 1 #define USER_MSG_UPDATE_ADV_DATA 2 #define USER_MSG_UPDATE_ADDR 3 +#define USER_MSG_CONN_TO_SLAVE 4 +#define USER_MSG_CONN_CANCEL 5 const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; +#define CONN_PARAM { \ + .scan_int = 200, \ + .scan_win = 60, \ + .interval_min = 50, \ + .interval_max = 50, \ + .latency = 0, \ + .supervision_timeout = 600, \ + .min_ce_len = 90, \ + .max_ce_len = 90 \ + } + +static initiating_phy_config_t phy_configs[] = +{ + { + .phy = PHY_1M, + .conn_param = CONN_PARAM + }, + { + .phy = PHY_2M, + .conn_param = CONN_PARAM + }, + { + .phy = PHY_CODED, + .conn_param = CONN_PARAM + } +}; + static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) { switch (msg_id) @@ -80,6 +142,19 @@ static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) gap_set_adv_set_random_addr(0, rand_addr); printf("addr changed: %02X:%02X:%02X:%02X:%02X:%02X\n", rand_addr[0], rand_addr[1], rand_addr[2], rand_addr[3], rand_addr[4], rand_addr[5]); break; + case USER_MSG_CONN_TO_SLAVE: + printf("create connection...\n"); + gap_ext_create_connection(INITIATING_ADVERTISER_FROM_PARAM, + BD_ADDR_TYPE_LE_RANDOM, // Own_Address_Type, + slave_addr_type, // Peer_Address_Type, + slave_addr, // Peer_Address, + sizeof(phy_configs) / sizeof(phy_configs[0]), + phy_configs); + break; + case USER_MSG_CONN_CANCEL: + printf("create connection cancelled.\n"); + gap_create_connection_cancel(); + break; default: ; } @@ -108,6 +183,16 @@ void update_addr() btstack_push_user_msg(USER_MSG_UPDATE_ADDR, NULL, 0); } +void conn_to_slave() +{ + btstack_push_user_msg(USER_MSG_CONN_TO_SLAVE, NULL, 0); +} + +void cancel_create_conn() +{ + btstack_push_user_msg(USER_MSG_CONN_CANCEL, NULL, 0); +} + static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) { uint8_t event = hci_event_packet_get_type(packet); @@ -119,6 +204,8 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin case BTSTACK_EVENT_STATE: if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) break; + gap_set_random_device_address(rand_addr); + gap_set_adv_set_random_addr(0, rand_addr); gap_set_ext_adv_para(0, CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max @@ -141,8 +228,15 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin switch (hci_event_le_meta_get_subevent_code(packet)) { case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE: - att_set_db(decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle, - profile_data); + { + const le_meta_event_enh_create_conn_complete_t * complete = + decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t); + conn_handle = complete->handle; + if (HCI_ROLE_SLAVE == complete->role) + att_set_db(conn_handle, profile_data); + else + gatt_client_discover_primary_services(service_discovery_callback, conn_handle); + } break; default: break; @@ -151,9 +245,25 @@ static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uin break; case HCI_EVENT_DISCONNECTION_COMPLETE: - gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); + conn_handle = INVALID_HANDLE; + break; + + case HCI_EVENT_COMMAND_COMPLETE: + { + const uint8_t *returns = hci_event_command_complete_get_return_parameters(packet); + if (*returns != 0) + platform_printf("COMMAND_COMPLETE: 0x%02x for OPCODE %04X\n", + *returns, hci_event_command_complete_get_command_opcode(packet)); + } + break; + case HCI_EVENT_COMMAND_STATUS: + { + const uint8_t status = hci_event_command_status_get_status(packet); + if (status != 0) + platform_printf("COMMAND_STATUS: 0x%02x for OPCODE %04X\n", + status, hci_event_command_status_get_command_opcode(packet)); + } break; - case ATT_EVENT_CAN_SEND_NOW: // add your code break; diff --git a/examples/uart_console/src/uart_console.c b/examples/uart_console/src/uart_console.c index 425b1d0c8..c89613dbf 100644 --- a/examples/uart_console/src/uart_console.c +++ b/examples/uart_console/src/uart_console.c @@ -6,6 +6,7 @@ #include #include "platform_api.h" +#include "bluetooth.h" typedef void (*f_cmd_handler)(const char *param); @@ -32,7 +33,10 @@ static const char help[] = "commands:\n" "name name set dev name\n" "addr 01:02:03:04:05:06 set dev address\n" "start start advertising\n" - "stop stop advertising\n"; + "stop stop advertising\n" + "pat 0/1 peer address type\n" + "conn xx:xx:xx:xx:xx:xx connect to dev and discover services\n" + "cancel cancel create connection\n"; void cmd_help(const char *param) { @@ -101,19 +105,51 @@ void cmd_name(const char *param) } extern uint8_t rand_addr[]; +extern uint8_t slave_addr[]; +extern bd_addr_type_t slave_addr_type; + void update_addr(void); +void conn_to_slave(void); -void cmd_addr(const char *param) +int parse_addr(uint8_t *output, const char *param) { int addr[6]; + int i; if (sscanf(param, "%2x:%2x:%2x:%2x:%2x:%2x", &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]) != 6) { - int i; - for (i = 0; i < 6; i++) rand_addr[i] = addr[i]; + tx_data(error, strlen(error) + 1); + return -1; + } + for (i = 0; i < 6; i++) output[i] = addr[i]; + return 0; +} + +void cmd_addr(const char *param) +{ + if (0 == parse_addr(rand_addr, param)) + update_addr(); +} + +void cmd_conn(const char *param) +{ + if (0 == parse_addr(slave_addr, param)) + conn_to_slave(); +} + +void cmd_conn_cancel(const char *param) +{ + cancel_create_conn(); +} + +void cmd_pat(const char *param) +{ + int t = 0; + if (sscanf(param, "%d", &t) != 1) + { tx_data(error, strlen(error) + 1); return; } - update_addr(); + slave_addr_type = (bd_addr_type_t)t; } extern void start_adv(void); @@ -175,6 +211,18 @@ static cmd_t cmds[] = .cmd = "stop", .handler = cmd_stop }, + { + .cmd = "conn", + .handler = cmd_conn + }, + { + .cmd = "pat", + .handler = cmd_pat + }, + { + .cmd = "cancel", + .handler = cmd_conn_cancel + }, }; void handle_command(char *cmd_line) @@ -191,7 +239,7 @@ void handle_command(char *cmd_line) break; } if (i >= sizeof(cmds) / sizeof(cmds[0])) - goto show_help; + goto show_help; cmds[i].handler(param); return; @@ -204,7 +252,7 @@ void handle_command(char *cmd_line) typedef struct { uint16_t size; - char buf[512]; + char buf[712]; } str_buf_t; str_buf_t input = {0}; diff --git a/examples/uart_console/uart_console.ingw b/examples/uart_console/uart_console.ingw index 6b55402bd..1076fe5c3 100644 --- a/examples/uart_console/uart_console.ingw +++ b/examples/uart_console/uart_console.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_DEVICE_NAME", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x14, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x55, 0x41, 0x52, 0x54, 0x20, 0x43, 0x6F, 0x6E, \r\n0x73, 0x6F, 0x6C, 0x65, \r\n\r\n0x00,0x00\r\n\/\/ total size = 45\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n", diff --git a/examples/uart_console/uart_console.uvoptx b/examples/uart_console/uart_console.uvoptx index 8e7dd53d8..f05f4aaa7 100644 --- a/examples/uart_console/uart_console.uvoptx +++ b/examples/uart_console/uart_console.uvoptx @@ -117,7 +117,7 @@ 0 DLGUARM - d + / 0 @@ -145,7 +145,56 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) - + + + 0 + 0 + 302 + 1 +
    163390
    + 0 + 0 + 0 + 0 + 0 + 1 + .\src\uart_console.c + + \\uart_console\src/uart_console.c\302 +
    + + 1 + 0 + 43 + 1 +
    162628
    + 0 + 0 + 0 + 0 + 0 + 1 + .\src\uart_console.c + + \\uart_console\src/uart_console.c\43 +
    + + 2 + 0 + 301 + 1 +
    0
    + 0 + 0 + 0 + 0 + 0 + 0 + .\src\uart_console.c + + +
    +
    0 @@ -253,7 +302,7 @@ 0 0 0 - ..\..\bundles\typical\symdefs.m + ..\..\bundles\typical\ING9188xx\symdefs.m symdefs.m 0 0 diff --git a/examples/uart_console/uart_console.uvproj b/examples/uart_console/uart_console.uvproj index 226b06879..c337f7150 100644 --- a/examples/uart_console/uart_console.uvproj +++ b/examples/uart_console/uart_console.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/uart_console/uart_console.uvprojx b/examples/uart_console/uart_console.uvprojx index 85b13c8d6..62d97cef0 100644 --- a/examples/uart_console/uart_console.uvprojx +++ b/examples/uart_console/uart_console.uvprojx @@ -294,8 +294,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/voice_remote_ctrl/data/advertising_atv.adv b/examples/voice_remote_ctrl/data/advertising_atv.adv new file mode 100644 index 000000000..c6ae71e14 --- /dev/null +++ b/examples/voice_remote_ctrl/data/advertising_atv.adv @@ -0,0 +1,14 @@ +// 0x01 - «Flags» +2, 0x01, +0x06, + +// 0x09 - «Complete Local Name» +8, 0x09, +0x49, 0x4E, 0x47, 0x20, 0x41, 0x54, 0x56, + +// 0x07 - «Complete List of 128-bit Service Class UUIDs» +17, 0x07, +0x64, 0xB6, 0x17, 0xF6, 0x01, 0xAF, 0x7D, 0xBC, 0x05, 0x4F, 0x21, +0x5A, 0x01, 0x00, 0x5E, 0xAB + +// Total size = 30 bytes diff --git a/examples/voice_remote_ctrl/data/advertising_atv2.adv b/examples/voice_remote_ctrl/data/advertising_atv2.adv new file mode 100644 index 000000000..9351c0c44 --- /dev/null +++ b/examples/voice_remote_ctrl/data/advertising_atv2.adv @@ -0,0 +1 @@ +0x02, 0x01, 0x05, 0x03, 0xFF, 0x00, 0x00, 0x06, 0x08, 0x4D, 0x49, 0x20, 0x52, 0x43, 0x03, 0x02, 0x12, 0x18, 0x04, 0x0D, 0x04, 0x05, 0x00, 0x02, 0x0A, 0x00 diff --git a/examples/voice_remote_ctrl/data/itu_female_16k.m b/examples/voice_remote_ctrl/data/itu_female_16k.m index 64b1cabe8..c476fde56 100644 --- a/examples/voice_remote_ctrl/data/itu_female_16k.m +++ b/examples/voice_remote_ctrl/data/itu_female_16k.m @@ -1,4 +1,3 @@ -(* Created with the Wolfram Language : www.wolfram.com *) {2, -1, -3, -3, -11, -3, -9, 1, 2, 5, 3, 4, 13, 8, 8, 4, 6, 2, 4, 1, 2, 3, 3, 3, 3, 3, -3, 6, -1, 0, 3, 4, 5, 1, 4, 1, 5, 7, 5, -2, 9, 6, 8, 6, 1, 6, -1, 1, -1, 4, -1, 3, 10, 8, 2, -1, 6, -2, 1, 5, 8, 11, 15, 3, 1, -3, -3, 4, -2, diff --git a/examples/voice_remote_ctrl/flash_download.ini b/examples/voice_remote_ctrl/flash_download.ini index df26e29db..092569b0c 100644 --- a/examples/voice_remote_ctrl/flash_download.ini +++ b/examples/voice_remote_ctrl/flash_download.ini @@ -27,11 +27,11 @@ FileName=voice_remote_ctrl.bin [uart] PortNumber=12 -Baud=115200 +Baud=921600 Parity= DataBits=8 StopBits=1 -Port=12 +Port=COM3 AsyncIO=1 [main] diff --git a/examples/voice_remote_ctrl/src/app_cfg.h b/examples/voice_remote_ctrl/src/app_cfg.h new file mode 100644 index 000000000..01cbcdee8 --- /dev/null +++ b/examples/voice_remote_ctrl/src/app_cfg.h @@ -0,0 +1,32 @@ +#ifndef APP_CFG_H +#define APP_CFG_H + +#define BOARD_DEV 0 +#define BOARD_REM 1 + +#define APP_ING 0 +#define APP_ANDROID 1 +#define APP_MIBOXS 2 +#define APP_CUSTOMER 3 + +#define ADC_CHANNEL_ID 4 + +#ifndef BOARD +#define BOARD BOARD_DEV +#endif + +#ifndef APP_TYPE +#define APP_TYPE APP_ING +#endif + +#if (APP_TYPE != APP_ING) +#define HAS_KB +#endif + +#if (BOARD == BOARD_DEV) +#define ADC_CHANNEL_ID 4 +#else +#define ADC_CHANNEL_ID 4 +#endif + +#endif diff --git a/examples/voice_remote_ctrl/src/audio_service.c b/examples/voice_remote_ctrl/src/audio_service.c index 146f43ab1..f703c3f9f 100644 --- a/examples/voice_remote_ctrl/src/audio_service.c +++ b/examples/voice_remote_ctrl/src/audio_service.c @@ -6,22 +6,45 @@ #include "semphr.h" #include "queue.h" +#include "platform_api.h" + static adpcm_enc_t enc; uint8_t data_buffer[VOICE_BUF_BLOCK_NUM][VOICE_BUF_BLOCK_SIZE] = {0}; uint16_t block_index; uint16_t byte_index; +uint16_t seq_cnt; int8_t mic_dig_gain = 0; +#ifdef SIMULATION +uint8_t oversample_cnt = 0; +#endif + +#define SAMPLE_BUF_LEN 20 + +int sample_buf_index = 0; +int sample_index = 0; +pcm_sample_t sample_buf[2][SAMPLE_BUF_LEN]; + extern void audio_trigger_send(void); void write_header() { +#if (APP_TYPE == APP_ANDROID) + data_buffer[block_index][0] = seq_cnt & 0xff; + data_buffer[block_index][1] = seq_cnt >> 8; + data_buffer[block_index][2] = 0; + data_buffer[block_index][3] = enc.state.predicated & 0xff; + data_buffer[block_index][4] = enc.state.predicated >> 8; + data_buffer[block_index][5] = enc.state.index; + byte_index = 6; +#else data_buffer[block_index][0] = enc.state.predicated & 0xff; data_buffer[block_index][1] = enc.state.predicated >> 8; data_buffer[block_index][2] = enc.state.index; data_buffer[block_index][3] = VOICE_BUF_BLOCK_SIZE - 4; byte_index = 4; +#endif } void enc_output_cb(uint8_t output, void *param) @@ -34,7 +57,7 @@ void enc_output_cb(uint8_t output, void *param) audio_trigger_send(); if (block_index >= VOICE_BUF_BLOCK_NUM) block_index = 0; -#ifdef DEV_BOARD +#if (APP_TYPE == APP_ING) byte_index = 0; #else write_header(); @@ -44,11 +67,7 @@ void enc_output_cb(uint8_t output, void *param) #ifdef SIMULATION const pcm_sample_t pcm[] = -#ifdef DEV_BOARD -#include "../data/tts_sample.m" -#else #include "../data/itu_female_16k.m" -#endif ; uint16_t pcm_index = 0; #endif @@ -59,7 +78,13 @@ static StaticQueue_t xStaticSampleQueue; static uint8_t ucQueueStorageArea[ITEM_SIZE * QUEUE_LENGTH]; QueueHandle_t xSampleQueue; -#define FIR_LEN 7 +#if (OVER_SAMPLING == 2) +#define FIR_LEN 7 +#define FILTER_GAIN 1 +#elif (OVER_SAMPLING == 1) +#define FIR_LEN 1 +#define FILTER_GAIN 1 +#endif typedef struct { @@ -67,32 +92,67 @@ typedef struct pcm_sample_t x[FIR_LEN - 1]; } fir_t; -pcm_sample_t fir_push(fir_t *fir, pcm_sample_t x) +#define TO_INT8(v) ((int8_t)(v * 127 * FILTER_GAIN)) + +#if (OVER_SAMPLING == 2) +fir_t fir = { .h = {TO_INT8(-0.0133217), + 0, + TO_INT8(0.26318), + TO_INT8(0.5), + TO_INT8(0.26318), + 0, + TO_INT8(-0.0133217) + } }; +#elif (OVER_SAMPLING == 1) +fir_t fir = { .h = {TO_INT8(1.0)} }; +#endif + +void fir_push(fir_t *fir, pcm_sample_t x) { int i; - pcm_sample_t r = fir->h[0] * x; + for (i = FIR_LEN - 1; i >= 2; i--) + { + fir->x[i - 1] = fir->x[i - 2]; + } +#if (FIR_LEN > 1) + fir->x[0] = x; +#endif +} + +pcm_sample_t fir_push_run(fir_t *fir, pcm_sample_t x) +{ + int i; + int32_t r = fir->h[0] * x; for (i = FIR_LEN - 1; i >= 1; i--) { r += fir->h[i] * fir->x[i - 1]; fir->x[i - 1] = fir->x[i - 2]; } +#if (FIR_LEN > 1) fir->x[0] = x; +#endif return r >> 7; } uint32_t audio_sample_isr(void *user_data) -{ +{ pcm_sample_t sample; - BaseType_t xHigherPriorityTaskWoke = pdFALSE; + BaseType_t xHigherPriorityTaskWoke = pdFALSE; TMR_IntClr(APB_TMR1); #ifdef SIMULATION - sample = pcm[pcm_index++]; - if (pcm_index >= sizeof(pcm) / sizeof(pcm[0])) pcm_index = 0; + oversample_cnt = (oversample_cnt + 1) & OVER_SAMPLING_MASK; + if (oversample_cnt != 0) return 0; + if (pcm_index < sizeof(pcm) / sizeof(pcm[0])) + { + sample = pcm[pcm_index++]; + } + else + sample = 0; #else - sample = ADC_ReadChannelData(0) - 512; + sample = ADC_ReadChannelData(ADC_CHANNEL_ID) - 512; #endif // digital gain @@ -101,16 +161,31 @@ uint32_t audio_sample_isr(void *user_data) else if (mic_dig_gain < 0) sample >>= -mic_dig_gain; - xQueueSendFromISR(xSampleQueue, &sample, &xHigherPriorityTaskWoke); - + sample_buf[sample_buf_index][sample_index] = sample; + sample_index++; + if (sample_index >= SAMPLE_BUF_LEN) + { + xQueueSendFromISR(xSampleQueue, &sample_buf_index, &xHigherPriorityTaskWoke); + sample_buf_index++; + if (sample_buf_index >= 2) + sample_buf_index = 0; + sample_index = 0; + } + return 0; } void audio_start(void) { + sample_buf_index = 0; + sample_index = 0; +#ifdef SIMULATION + pcm_index = 0; + oversample_cnt = 0; +#endif adpcm_enc_init(&enc, enc_output_cb, 0); - block_index = 0; -#ifdef DEV_BOARD + block_index = 0; +#if (APP_TYPE == APP_ING) byte_index = 0; #else write_header(); @@ -126,12 +201,34 @@ void audio_stop(void) static void audio_task(void *pdata) { + int oversample_cnt = 0; + pcm_sample_t *buf; for (;;) { - int16_t sample; - if (xQueueReceive(xSampleQueue, &sample, portMAX_DELAY ) != pdPASS) + int16_t index; + int i; + + if (xQueueReceive(xSampleQueue, &index, portMAX_DELAY ) != pdPASS) continue; - adpcm_encode(&enc, sample); + + buf = sample_buf[index]; + + for (i = 0; i < SAMPLE_BUF_LEN; i++) + { + pcm_sample_t sample = buf[i]; +#ifndef SIMULATION + oversample_cnt = (oversample_cnt + 1) & OVER_SAMPLING_MASK; + if (oversample_cnt != 0) + { + fir_push(&fir, sample); + continue; + } + else + sample = fir_push_run(&fir, sample); +#endif + + adpcm_encode(&enc, sample); + } } } diff --git a/examples/voice_remote_ctrl/src/audio_service.h b/examples/voice_remote_ctrl/src/audio_service.h index cfa14165a..bc1245530 100644 --- a/examples/voice_remote_ctrl/src/audio_service.h +++ b/examples/voice_remote_ctrl/src/audio_service.h @@ -3,11 +3,22 @@ #include -#ifdef DEV_BOARD +#include "app_cfg.h" + +#define OVER_SAMPLING 2 // must be 2^n +#define OVER_SAMPLING_MASK (OVER_SAMPLING - 1) + +#if (APP_TYPE == APP_ING) // 4KB per sec #define VOICE_BUF_BLOCK_SIZE 150 // this is indicated in GATT voice information #define VOICE_BUF_BLOCK_NUM (4100 / VOICE_BUF_BLOCK_SIZE) // total buffer: 4.1KB -#else +#elif (APP_TYPE == APP_ANDROID) +#define VOICE_BUF_BLOCK_SIZE (128 + 6) +#define VOICE_BUF_BLOCK_NUM (4000 / VOICE_BUF_BLOCK_SIZE) +#elif (APP_TYPE == APP_MIBOXS) +#define VOICE_BUF_BLOCK_SIZE 60 +#define VOICE_BUF_BLOCK_NUM (4000 / VOICE_BUF_BLOCK_SIZE) +#elif (APP_TYPE == APP_CUSTOMER) // 4KB per sec #define VOICE_BUF_BLOCK_SIZE 128 // this is indicated in GATT voice information #define VOICE_BUF_BLOCK_NUM (4000 / VOICE_BUF_BLOCK_SIZE) // total buffer: 4KB diff --git a/examples/voice_remote_ctrl/src/kb_service.c b/examples/voice_remote_ctrl/src/kb_service.c index be308824b..9deb266f8 100644 --- a/examples/voice_remote_ctrl/src/kb_service.c +++ b/examples/voice_remote_ctrl/src/kb_service.c @@ -35,11 +35,33 @@ enum HID_CTRL_EXIT_SUSPEND }; +#if (APP_TYPE == APP_ANDROID) + +my_kb_report_t report = +{ + .k_map = 0 +}; + +#elif (APP_TYPE == APP_CUSTOMER) + +my_kb_report_t report = +{ + .flags = 1 +}; + +#elif (APP_TYPE == APP_MIBOXS) + my_kb_report_t report = { .flags = 1 }; +#else + +my_kb_report_t report; + +#endif + void kb_send_report(void) { if (suspended) @@ -52,6 +74,20 @@ void kb_send_report(void) } } +__weak void set_led_state(const uint8_t state) +{ + const static char names[][7] = + { + "NUM", "CAPS", "SCROLL" + }; + int i; + for (i = 0; i < sizeof(names) / sizeof(names[0]); i++) + { + platform_printf(names[i]); + platform_printf(state & (1 << i) ? ": ON\n" : ": OFF\n"); + } +} + int kb_att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) { @@ -70,6 +106,10 @@ int kb_att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handl } return 0; } + else if (att_handle == att_handle_boot_kb_input_report + 1) + { + return 0; + } else if (att_handle == att_handle_hid_ctrl_point) { if (*buffer == HID_CTRL_SUSPEND) @@ -78,6 +118,11 @@ int kb_att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handl suspended = 0; return 0; } + else if ((att_handle == att_handle_boot_kb_output_report) || (att_handle == att_handle_report)) + { + set_led_state(*buffer); + return 0; + } else return -1; } @@ -95,6 +140,7 @@ uint16_t kb_att_read_callback(hci_con_handle_t connection_handle, uint16_t att_h return 0xffff; } +#if (APP_TYPE == APP_CUSTOMER) const static uint8_t KB_REPORT_MAP[] = { USAGE_PAGE(1), 0x01, // Generic Desktop @@ -112,6 +158,38 @@ const static uint8_t KB_REPORT_MAP[] = { INPUT(1), 0x00, // Input (Data, Array) Key array(3 bytes) END_COLLECTION(0), }; +#else +const static uint8_t KB_REPORT_MAP[] = { + + 0x05, 0x0C, // Usage Page (Consumer) + 0x09, 0x01, // Usage (Consumer Control) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report Id (1) + 0x15, 0x00, // Logical minimum (0) + 0x25, 0x01, // Logical maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x01, // Report Count (1) + + 0x09, 0xCD, // Usage (Play/Pause) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + 0x09, 0xEA, // Usage (Volume Down) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + 0x09, 0xE9, // Usage (Volume Up) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + 0x0A, 0x21, 0x02, // Usage (AC Search) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + + 0x0A, 0x25, 0x02, // Usage (AC Forward) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + 0x0A, 0x24, 0x02, // Usage (AC Back) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + 0x09, 0xB5, // Usage (Scan Next Track) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + 0x09, 0xB6, // Usage (Scan Previous Track) + 0x81, 0x02, // Input (Data,Value,Relative,Bit Field) + END_COLLECTION(0), +}; +#endif #pragma pack (push, 1) diff --git a/examples/voice_remote_ctrl/src/kb_service.h b/examples/voice_remote_ctrl/src/kb_service.h index accd0af79..0e51f6b4b 100644 --- a/examples/voice_remote_ctrl/src/kb_service.h +++ b/examples/voice_remote_ctrl/src/kb_service.h @@ -3,6 +3,19 @@ #include +#include "app_cfg.h" + +#if (APP_TYPE == APP_ANDROID) +#define INPUT_REPORT_KEYS_MAX 6 + +#pragma pack (push, 1) +typedef struct +{ + uint8_t k_map; +} my_kb_report_t; +#pragma pack (pop) + +#elif (APP_TYPE == APP_CUSTOMER) typedef struct my_kb_report { uint8_t flags; @@ -11,6 +24,19 @@ typedef struct my_kb_report int8_t mouse_move[2]; uint8_t reserved; } my_kb_report_t; +#elif (APP_TYPE == APP_MIBOXS) +typedef struct my_kb_report +{ + uint8_t flags; + uint8_t keycode; + uint8_t k_map; +} my_kb_report_t; +#else +typedef struct my_kb_report +{ + uint8_t k_map; +} my_kb_report_t; +#endif int kb_att_write_callback(uint16_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, const uint8_t *buffer, uint16_t buffer_size); diff --git a/examples/voice_remote_ctrl/src/main.c b/examples/voice_remote_ctrl/src/main.c index 16b223c74..8fee78214 100644 --- a/examples/voice_remote_ctrl/src/main.c +++ b/examples/voice_remote_ctrl/src/main.c @@ -12,6 +12,7 @@ #include "../../hid_keyboard/src/USBKeyboard.h" #include "kb_service.h" +#include "app_cfg.h" #define PRINT_PORT APB_UART0 @@ -49,21 +50,27 @@ void config_uart(uint32_t freq, uint32_t baud) apUART_Initialize(PRINT_PORT, &config, 0); } +#define KB_KEY_1 GIO_GPIO_1 +#define KB_KEY_2 GIO_GPIO_5 +#define KB_KEY_3 GIO_GPIO_7 +#define KB_KEY_4 GIO_GPIO_4 + +const uint8_t key_ids[4] = {KB_KEY_1, KB_KEY_2, KB_KEY_3, KB_KEY_4}; + +#define KEY_MASK ((1 << KB_KEY_1) | (1 << KB_KEY_2) | (1 << KB_KEY_3) | (1 << KB_KEY_4)) + void setup_peripherals(void) { config_uart(OSC_CLK_FREQ, 115200); - - PINCTRL_DisableAllInputs(); + SYSCTRL_ClearClkGateMulti( (1 << SYSCTRL_ClkGate_APB_GPIO) - | (1 << SYSCTRL_ClkGate_APB_TMR1)); + | (1 << SYSCTRL_ClkGate_APB_TMR1) | (1 << SYSCTRL_ClkGate_APB_TMR2) + | (1 << SYSCTRL_ClkGate_APB_PinCtrl)); + PINCTRL_DisableAllInputs(); // timer 0 can be used as watchdog, so we use timer 1. // setup timer 1 to sampling rate -#ifdef DEV_BOARD - TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / 8000); -#else - TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / 16000); -#endif + TMR_SetCMP(APB_TMR1, TMR_CLK_FREQ / (16000 * OVER_SAMPLING)); TMR_SetOpMode(APB_TMR1, TMR_CTL_OP_MODE_WRAPPING); TMR_Reload(APB_TMR1); TMR_IntEnable(APB_TMR1); @@ -72,27 +79,38 @@ void setup_peripherals(void) ADC_Reset(); ADC_SetClkSel(ADC_CLK_EN | ADC_CLK_16); ADC_SetMode(ADC_MODE_LOOP); - ADC_EnableChannel(0, 1); + ADC_EnableChannel(ADC_CHANNEL_ID, 1); ADC_Enable(1); -#ifndef DEV_BOARD +#if (BOARD == BOARD_REM) kb_init(); // setup timer 2: 20Hz TMR_SetCMP(APB_TMR2, TMR_CLK_FREQ / 20); TMR_SetOpMode(APB_TMR2, TMR_CTL_OP_MODE_WRAPPING); TMR_Reload(APB_TMR2); TMR_IntEnable(APB_TMR2); - + // gpio 1 PINCTRL_SetPadMux(GIO_GPIO_1, IO_SOURCE_GENERAL); GIO_SetDirection(GIO_GPIO_1, GIO_DIR_OUTPUT); PINCTRL_SetPadPwmSel(GIO_GPIO_1, 1); +#elif (APP_TYPE != APP_ING) + // setup GPIOs for keys + #define SET_UP_KEY(key) \ + PINCTRL_SetPadMux(key, IO_SOURCE_GENERAL); \ + GIO_SetDirection(key, GIO_DIR_INPUT); \ + GIO_ConfigIntSource(key, GIO_INT_EN_LOGIC_LOW_OR_FALLING_EDGE | GIO_INT_EN_LOGIC_HIGH_OR_RISING_EDGE, GIO_INT_EDGE) + + SET_UP_KEY(KB_KEY_1); + SET_UP_KEY(KB_KEY_2); + SET_UP_KEY(KB_KEY_3); + SET_UP_KEY(KB_KEY_4); #endif } void app_state_changed(const app_state_t state) { -#ifndef DEV_BOARD +#if (BOARD == BOARD_REM) switch (state) { case APP_PAIRING: @@ -133,31 +151,28 @@ uint32_t dbg_audio_sample_isr(void *user_data) TMR_IntClr(APB_TMR1); buffer[index++] = ADC_ReadChannelData(0) - 512; - + if (index >= sizeof(buffer) / sizeof(buffer[0])) for (;;); - + return 0; } #endif -#ifndef DEV_BOARD +#if (BOARD == BOARD_REM) uint32_t kb_scan_isr(void *user_data) { TMR_IntClr(APB_TMR2); kb_update(); return 0; } -#endif -#ifndef DEV_BOARD - -extern my_kb_report_t report; extern kb_report_trigger_send(void); +extern my_kb_report_t report; #include "keycodes.h" -const uint8_t key_map[] = +const uint8_t key_map[] = { AKEYCODE_RIGHT_BRACKET, // 0x48, // 0 (J2) AKEYCODE_BUTTON_R2, // 0x69, // 1 (J6) @@ -177,27 +192,6 @@ const uint8_t key_map[] = AKEYCODE_CTRL_RIGHT // 0x72, // 15(J17) }; -/* HID key codes -{ - KEY_MEDIA_BACK, // 0 (J2) - KEY_LEFT, // 1 (J6) - KEY_VOLUMEUP, // 2 (J10) - KEY_UP, // 3 (J14) - KEY_MEDIA_PREVIOUSSONG, // 4 (J3) - KEY_RIGHT, // 5 (J7) - KEY_PROPS, // 6 (J11) - KEY_MEDIA_NEXTSONG, // 7 (J15) - KEY_MEDIA_FORWARD, // 8 (J4) - KEY_ESC, // 9 (J8) - KEY_MEDIA_PLAYPAUSE, // 10(J12) - KEY_MEDIA_MUTE, // 11(J16) - KEY_ENTER, // 12(J5) - KEY_DOWN, // 13(J9) - KEY_HOME, // 14(J13) - KEY_VOLUMEDOWN, // 15(J17) -}; -*/ - void kb_state_changed(const uint32_t old_state, const uint32_t new_state) { int i; @@ -215,7 +209,7 @@ void kb_state_changed(const uint32_t old_state, const uint32_t new_state) } } } - + kb_report_trigger_send(); } @@ -236,13 +230,37 @@ void kb_keep_pressed(const uint32_t keys) start_talking(); } } + #else -void kb_state_changed(const uint32_t old_state, const uint32_t new_state) -{ -} -void kb_keep_pressed(const uint32_t keys) + +void kb_state_changed(const uint32_t old_state, const uint32_t new_state) {} + +void kb_keep_pressed(const uint32_t keys) {} + +#ifdef HAS_KB +extern void kb_report_trigger_send(void); +extern my_kb_report_t report; + +uint32_t gpio_isr(void *user_data) { -} + uint32_t current = ~GIO_ReadAll(); + int8_t i = 0; + report.k_map = 0; + + // report which keys are pressed + for (i = 0; i < sizeof(key_ids) / sizeof(key_ids[0]); i++) + { + if (current & (1 << key_ids[i])) + report.k_map |= (1 << i); + } + + kb_report_trigger_send(); + + GIO_ClearAllIntStatus(); + return 0; +}; + +#endif #endif int app_main() @@ -251,6 +269,13 @@ int app_main() // Otherwise, below line should be kept commented out. // platform_set_rf_clk_source(0); +#if (APP_TYPE == APP_MIBOXS) + { + const static uint8_t pub_addr[] = {0x14, 0xAB, 0x56, 0x90, 0xA8, 0x8A}; + sysSetPublicDeviceAddr(pub_addr); + } +#endif + setup_peripherals(); platform_set_evt_callback(PLATFORM_CB_EVT_PROFILE_INIT, setup_profile, NULL); @@ -260,14 +285,16 @@ int app_main() platform_set_evt_callback(PLATFORM_CB_EVT_QUERY_DEEP_SLEEP_ALLOWED, query_deep_sleep_allowed, NULL); // setup putc handle platform_set_evt_callback(PLATFORM_CB_EVT_PUTC, (f_platform_evt_cb)cb_putc, NULL); - + audio_init(); - + platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER1, audio_sample_isr, NULL); -#ifndef DEV_BOARD +#if (BOARD == BOARD_REM) platform_set_irq_callback(PLATFORM_CB_IRQ_TIMER2, kb_scan_isr, NULL); TMR_Enable(APB_TMR2); +#elif (defined HAS_KB) + platform_set_irq_callback(PLATFORM_CB_IRQ_GPIO, gpio_isr, NULL); #endif - + return 0; } diff --git a/examples/voice_remote_ctrl/src/profile.c b/examples/voice_remote_ctrl/src/profile.c index 21b3e41c2..39ebdb22b 100644 --- a/examples/voice_remote_ctrl/src/profile.c +++ b/examples/voice_remote_ctrl/src/profile.c @@ -1,430 +1,11 @@ -#include -#include "platform_api.h" -#include "att_db.h" -#include "gap.h" -#include "l2cap.h" -#include "gatt_client.h" -#include "btstack_util.h" -#include "btstack_event.h" -#include "btstack_defines.h" -#include "sig_uuid.h" +#include "app_cfg.h" -#include "FreeRTOS.h" -#include "timers.h" - -#include "audio_service.h" -#include "kb_service.h" - -#include "att_db_util.h" - -#include "../../hid_keyboard/src/USBHID_Types.h" -#include "../../hid_keyboard/src/USBKeyboard.h" - -#include "profile.h" - -// GATT characteristic handles -#define HANDLE_DEVICE_NAME 3 -#define HANDLE_VOICE_CONTROL 6 -#define HANDLE_VOICE_OUTPUT 8 - -static TimerHandle_t app_timer = 0; -extern int8_t mic_dig_gain; - -#ifdef DEV_BOARD -const static uint8_t adv_data[] = { - #include "../data/advertising.adv" -}; - -const static uint8_t scan_data[] = { - #include "../data/scan_response.adv" -}; - -static uint8_t profile_data[] = { - #include "../data/gatt.profile" -}; - -#else -const static uint8_t adv_pSID[] = { - #include "../data/adv_pSID.adv" -}; - -const static uint8_t adv_sSID[] = { - #include "../data/adv_sSID.adv" -}; - -const static uint8_t scan_data_sselfi[] = { - #include "../data/scan_resp_sselfi.adv" -}; -#endif - -#define INVALID_HANDLE 0xffff - -#ifndef DEV_BOARD -static uint8_t att_db_storage[800]; -static uint16_t att_handle_mic; -static uint16_t att_handle_pair; -extern uint16_t att_handle_report; -extern uint8_t kb_notify_enable; +#if (APP_TYPE == APP_ING) +#include "profile_ing.c" +#elif (APP_TYPE == APP_ANDROID) +#include "profile_android.c" +#elif (APP_TYPE == APP_MIBOXS) +#include "profile_miboxs.c" +#elif (APP_TYPE == APP_CUSTOMER) +#include "profile_customer.c" #endif - -uint8_t is_paring_mode = 0; - -static hci_con_handle_t handle_send = INVALID_HANDLE; - -static uint16_t next_block = 0; - -uint8_t audio_notify_enable = 0; - -static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, - uint8_t * buffer, uint16_t buffer_size) -{ -#ifndef DEV_BOARD - uint16_t r = kb_att_read_callback(connection_handle, att_handle, offset, buffer, buffer_size); - return r != 0xffff ? r : 0; -#else - switch (att_handle) - { - case HANDLE_VOICE_CONTROL: - if (buffer) - { - *(int8_t *)buffer = mic_dig_gain; - return buffer_size; - } - else - return 1; - - default: - return 0; - } -#endif -} - -static btstack_packet_callback_registration_t hci_event_callback_registration; - -static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, - uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) -{ -#ifndef DEV_BOARD - int r = 0; - if (att_handle == att_handle_pair) - { - xTimerStop(app_timer, portMAX_DELAY); - } - else if (att_handle == att_handle_mic + 1) - { - if (*(uint16_t *)buffer == GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION) - { - next_block = 0; - audio_notify_enable = 1; - kb_notify_enable = 1; - l2cap_request_connection_parameter_update(handle_send, 6, 6, 90, 400); - gatt_client_is_ready(handle_send); - } - else - { - audio_notify_enable = 0; - kb_notify_enable = 0; - } - } - else - r = kb_att_write_callback(connection_handle, att_handle, transaction_mode, offset, buffer, buffer_size); - return r != -1 ? r : 0; - -#else - switch (att_handle) - { - case HANDLE_VOICE_CONTROL: - mic_dig_gain = *(int8_t *)buffer; - return 0; - - case HANDLE_VOICE_OUTPUT + 1: - if(*(uint16_t *)buffer == GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION) - { - next_block = 0; - audio_notify_enable = 1; - audio_start(); - } - else - { - audio_notify_enable = 0; - audio_stop(); - } - return 0; - - default: - return 0; - } -#endif -} - -#define USER_MSG_ID_REQUEST_SEND_AUDIO 1 -#define USER_MSG_ID_REQUEST_SEND_KB 2 -#define USER_MSG_ID_REQUEST_PARING_ADV 3 -#define USER_MSG_ID_SEND_PARING_ADDR 4 -#define USER_MSG_ID_START_TALKING 5 - -#ifndef DEV_BOARD -extern my_kb_report_t report; - -static void app_timer_callback(TimerHandle_t xTimer) -{ - btstack_push_user_msg(USER_MSG_ID_SEND_PARING_ADDR, NULL, 0); -} -#endif - -void start_paring(void) -{ - btstack_push_user_msg(USER_MSG_ID_REQUEST_PARING_ADV, NULL, 0); -} - -void audio_trigger_send(void) -{ - if (audio_notify_enable) - btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_AUDIO, NULL, 0); -} - -#ifndef DEV_BOARD -void kb_report_trigger_send(void) -{ - if (kb_notify_enable) - btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_KB, NULL, 0); -} - -void start_talking(void) -{ - if (kb_notify_enable) - btstack_push_user_msg(USER_MSG_ID_START_TALKING, NULL, 0); -} -#endif - -static void send_audio_data() -{ - if (!audio_notify_enable) - return; - - uint16_t curr = audio_get_curr_block(); - if (next_block != curr) - { -#ifndef DEV_BOARD - att_server_notify(handle_send, att_handle_mic, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE); -#else - att_server_notify(handle_send, HANDLE_VOICE_OUTPUT, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE); -#endif - next_block++; - if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; - if (next_block != curr) - att_server_request_can_send_now_event(handle_send); - } -} - -static void setup_adv(uint8_t is_paring); -const bd_addr_t rand_addr = {0xC3, 0x8E,0x05,0x3E,0x7E,0xA3}; -bd_addr_t rand_addr_rev; - -static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) -{ -#ifndef DEV_BOARD - static uint8_t audio_on = 0; -#endif - switch (msg_id) - { - case USER_MSG_ID_REQUEST_SEND_AUDIO: - if (att_server_can_send_packet_now(handle_send)) - send_audio_data(); - else - att_server_request_can_send_now_event(handle_send); - break; -#ifndef DEV_BOARD - case USER_MSG_ID_REQUEST_SEND_KB: - if (audio_on & (0 == report.keycode)) - { - audio_on = 0; - audio_stop(); - } - if (att_server_can_send_packet_now(handle_send)) - att_server_notify(handle_send, att_handle_report, (uint8_t*)&report, sizeof(report)); - else - att_server_request_can_send_now_event(handle_send); - break; - case USER_MSG_ID_REQUEST_PARING_ADV: - if (INVALID_HANDLE != handle_send) - { - gap_disconnect(handle_send); - break; - } - setup_adv(1); - break; - case USER_MSG_ID_SEND_PARING_ADDR: - att_server_notify(handle_send, att_handle_pair, (uint8_t *)&rand_addr_rev, sizeof(rand_addr_rev)); - break; - case USER_MSG_ID_START_TALKING: - audio_on = 1; - audio_start(); - report.keycode = 0x91; - att_server_notify(handle_send, att_handle_mic, (uint8_t*)&report, sizeof(report)); - break; -#endif - default: - ; - } -} - -const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; - -static void setup_adv(uint8_t is_paring) -{ - const bd_addr_t pairing_addr = {0xAA, 0xA9,0xA8,0xA7,0xA6,0xA5}; - is_paring_mode = is_paring; - app_state_changed(is_paring ? APP_PAIRING : APP_WAIT_CONN); - gap_set_ext_adv_enable(0, 0, NULL); - gap_set_adv_set_random_addr(0, is_paring ? pairing_addr : rand_addr); - gap_set_ext_adv_para(0, - CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, - 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max - PRIMARY_ADV_ALL_CHANNELS, // Primary_Advertising_Channel_Map - BD_ADDR_TYPE_LE_RANDOM, // Own_Address_Type - BD_ADDR_TYPE_LE_PUBLIC, // Peer_Address_Type (ignore) - NULL, // Peer_Address (ignore) - ADV_FILTER_ALLOW_ALL, // Advertising_Filter_Policy - 0x00, // Advertising_Tx_Power - PHY_1M, // Primary_Advertising_PHY - 0, // Secondary_Advertising_Max_Skip - PHY_1M, // Secondary_Advertising_PHY - 0x00, // Advertising_SID - 0x00); // Scan_Request_Notification_Enable -#ifndef DEV_BOARD - if (is_paring) - gap_set_ext_adv_data(0, sizeof(adv_pSID), (uint8_t*)adv_pSID); - else - gap_set_ext_adv_data(0, sizeof(adv_sSID), (uint8_t*)adv_sSID); - gap_set_ext_scan_response_data(0, sizeof(scan_data_sselfi), (uint8_t*)scan_data_sselfi); -#else - gap_set_ext_adv_data(0, sizeof(adv_data), (uint8_t*)adv_data); - gap_set_ext_scan_response_data(0, sizeof(scan_data), (uint8_t*)scan_data); -#endif - gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); -} - -static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) -{ - uint8_t event = hci_event_packet_get_type(packet); - const btstack_user_msg_t *p_user_msg; - if (packet_type != HCI_EVENT_PACKET) return; - - switch (event) - { - case BTSTACK_EVENT_STATE: - if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) - break; - - setup_adv(0); - break; - - case HCI_EVENT_LE_META: - switch (hci_event_le_meta_get_subevent_code(packet)) - { - case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE: - handle_send = decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle; -#ifndef DEV_BOARD - app_state_changed(APP_CONN); - att_set_db(handle_send, att_db_storage); - if (is_paring_mode) xTimerStart(app_timer, portMAX_DELAY); -#else - att_set_db(handle_send, profile_data); -#endif - break; - default: - break; - } - - break; - - case HCI_EVENT_DISCONNECTION_COMPLETE: - xTimerStop(app_timer, portMAX_DELAY); - audio_notify_enable = 0; - audio_stop(); - handle_send = INVALID_HANDLE; -#ifndef DEV_BOARD - kb_notify_enable = 0; -#endif - setup_adv(0); - break; - - case ATT_EVENT_CAN_SEND_NOW: - send_audio_data(); - break; - - case BTSTACK_EVENT_USER_MSG: - p_user_msg = hci_event_packet_get_user_msg(packet); - user_msg_handler(p_user_msg->msg_id, p_user_msg->data, p_user_msg->len); - break; - - default: - break; - } -} - -#ifndef DEV_BOARD -void init_service() -{ - const char dev_name[] = "sSelfi"; - const uint16_t appearance = 0x0180; - uint8_t level = 98; - - att_db_util_init(att_db_storage, sizeof(att_db_storage)); - - att_db_util_add_service_uuid16(GAP_SERVICE_UUID); - att_db_util_add_characteristic_uuid16(GAP_DEVICE_NAME_UUID, ATT_PROPERTY_READ, (uint8_t *)dev_name, sizeof(dev_name) - 1); - att_db_util_add_characteristic_uuid16(SIG_UUID_CHARACT_GAP_APPEARANCE, ATT_PROPERTY_READ, (uint8_t *)&appearance, 2); - - att_db_util_add_service_uuid16(SIG_UUID_SERVICE_BATTERY_SERVICE); - att_db_util_add_characteristic_uuid16(SIG_UUID_CHARACT_BATTERY_LEVEL, - ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, &level, 1); - - init_kb_service(); - - att_db_util_add_service_uuid16(0x1911); - // Mic: PCM 8bit 8kHz - att_handle_mic = att_db_util_add_characteristic_uuid16(0x2b18, - ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, &level, 1); //2901 - att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, - ATT_PROPERTY_READ, "Mic", 3); - // speaker - att_db_util_add_characteristic_uuid16(0x2b19, - ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC, &level, 1); - att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, - ATT_PROPERTY_READ, "Speaker", 7); - // ota - att_db_util_add_characteristic_uuid16(0x2b12, - ATT_PROPERTY_READ | ATT_PROPERTY_WRITE, &level, 1); - att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, - ATT_PROPERTY_READ, "Ota", 3); - // pair - att_handle_pair = att_db_util_add_characteristic_uuid16(0x2b14, - ATT_PROPERTY_READ | ATT_PROPERTY_WRITE | ATT_PROPERTY_NOTIFY | ATT_PROPERTY_DYNAMIC, rand_addr_rev, 2); - att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, - ATT_PROPERTY_READ, "pair", 4); - - if (att_db_util_get_size() > sizeof(att_db_storage)) - platform_printf("db size should be >= %d\n", att_db_util_get_size()); -} -#endif - -uint32_t setup_profile(void *data, void *user_data) -{ -#ifndef DEV_BOARD - reverse_bd_addr(rand_addr, rand_addr_rev); - app_timer = xTimerCreate("t1", - pdMS_TO_TICKS(300), - pdTRUE, - NULL, - app_timer_callback); - init_service(); -#endif - - att_server_init(att_read_callback, att_write_callback); - hci_event_callback_registration.callback = &user_packet_handler; - hci_add_event_handler(&hci_event_callback_registration); - att_server_register_packet_handler(&user_packet_handler); - return 0; -} diff --git a/examples/voice_remote_ctrl/src/profile.h b/examples/voice_remote_ctrl/src/profile.h index cc931d1eb..63e947fb0 100644 --- a/examples/voice_remote_ctrl/src/profile.h +++ b/examples/voice_remote_ctrl/src/profile.h @@ -16,6 +16,17 @@ uint32_t setup_profile(void *data, void *user_data); void start_talking(void); +#define INPUT_REPORT_KEYS_MAX 6 + +#pragma pack (push, 1) +typedef struct kb_report +{ + uint8_t modifier; + uint8_t reserved; + uint8_t codes[INPUT_REPORT_KEYS_MAX]; +} kb_report_t; +#pragma pack (pop) + #endif diff --git a/examples/voice_remote_ctrl/src/profile_android.c b/examples/voice_remote_ctrl/src/profile_android.c new file mode 100644 index 000000000..c5dc89220 --- /dev/null +++ b/examples/voice_remote_ctrl/src/profile_android.c @@ -0,0 +1,335 @@ +#include +#include "platform_api.h" +#include "att_db.h" +#include "gap.h" +#include "sm.h" +#include "btstack_util.h" +#include "btstack_event.h" +#include "btstack_defines.h" +#include "sig_uuid.h" + +#include "FreeRTOS.h" +#include "timers.h" + +#include "audio_service.h" +#include "kb_service.h" + +#include "att_db_util.h" + +#include "../../hid_keyboard/src/USBHID_Types.h" +#include "../../hid_keyboard/src/USBKeyboard.h" + +#include "kb_service.h" + +#include "profile.h" + +// GATT characteristic handles +#define HANDLE_DEVICE_NAME 3 +#define HANDLE_APPEARANCE 5 + +const sm_persistent_t sm_persistent = +{ + .er = {1, 2, 3}, + .ir = {4, 5, 6}, + .identity_addr_type = BD_ADDR_TYPE_LE_RANDOM, + .identity_addr = {0xC3, 0x22, 0x63, 0x14, 0x85, 0x96} +}; + +const static uint8_t adv_data[] = { + #include "../data/advertising_atv2.adv" +}; + +const static uint8_t scan_data[] = { + #include "../data/scan_response.adv" +}; + +#define INVALID_HANDLE 0xffff + +uint8_t audio_notify_enable = 0; +static uint16_t next_block = 0; + +extern uint16_t att_handle_report; +extern uint8_t kb_notify_enable; + +hci_con_handle_t handle_send; + +uint16_t g_audio_handle_tx; +uint16_t g_audio_handle_rx; +uint16_t g_audio_handle_ctrl; + +uint8_t g_audio_tx_buf[20]; +uint8_t g_audio_ctrl_buf[20]; + +uint16_t g_audio_char_rx_cfg = 0; +uint16_t g_audio_char_ctrl_cfg = 0; + +#define ATV_GET_CAPS 0x0A +#define ATV_MIC_OPEN 0x0C +#define ATV_MIC_CLOSE 0x0D +#define AUDIO_STOP 0x00 +#define AUDIO_START 0x04 +#define DPAD_SELECT 0x07 +#define START_SEARCH 0x08 +#define AUDIO_SYNC 0x0A +#define GET_CAPS_RESP 0x0B +#define MIC_OPEN_ERROR 0x0C + +static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, + uint8_t * buffer, uint16_t buffer_size) +{ + kb_att_read_callback(connection_handle, att_handle, offset, buffer, buffer_size); + return 0; +} + +static btstack_packet_callback_registration_t hci_event_callback_registration; + +const uint8_t caps_rsp[] = {GET_CAPS_RESP, 0, 4, + 0, 1, + 0, 0x86, + 0, 0x14}; + +static int handle_atv_cmd(const uint8_t *buffer, uint16_t buffer_size) +{ + uint8_t rsp; + if (buffer_size < 1) return 0; + switch (buffer[0]) + { + case ATV_GET_CAPS: + att_server_notify(handle_send, g_audio_handle_ctrl, (uint8_t *)caps_rsp, sizeof(caps_rsp)); + break; + case ATV_MIC_OPEN: + audio_start(); + rsp = AUDIO_START; + att_server_notify(handle_send, g_audio_handle_ctrl, &rsp, 1); + break; + case ATV_MIC_CLOSE: + audio_stop(); + rsp = AUDIO_STOP; + att_server_notify(handle_send, g_audio_handle_ctrl, &rsp, 1); + break; + } + return 0; +} + +static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, + uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) +{ + handle_send = connection_handle; + if (att_handle == g_audio_handle_tx) + { + return handle_atv_cmd(buffer, buffer_size); + } + else if (att_handle == g_audio_handle_rx + 1) + { + g_audio_char_rx_cfg = *(uint16_t *)(buffer); + } + else if (att_handle == g_audio_handle_ctrl + 1) + { + g_audio_char_ctrl_cfg = *(uint16_t *)(buffer); + } + else + { + return kb_att_write_callback(connection_handle, att_handle, transaction_mode, offset, buffer, buffer_size); + } + return 0; +} + +#define USER_MSG_ID_REQUEST_SEND_AUDIO 1 +#define USER_MSG_ID_REQUEST_SEND_KB 2 +#define USER_MSG_ID_START_TALKING 3 + +extern my_kb_report_t report; + +void audio_trigger_send(void) +{ + if (audio_notify_enable) + btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_AUDIO, NULL, 0); +} + +void kb_report_trigger_send(void) +{ + if (kb_notify_enable) + btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_KB, NULL, 0); +} + +void start_talking(void) +{ + if (kb_notify_enable) + btstack_push_user_msg(USER_MSG_ID_START_TALKING, NULL, 0); +} + +static void send_audio_data() +{ + if (!audio_notify_enable) + return; + + uint16_t curr = audio_get_curr_block(); + if (next_block != curr) + { + att_server_notify(handle_send, g_audio_handle_rx, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE); + next_block++; + if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; + if (next_block != curr) + att_server_request_can_send_now_event(handle_send); + } +} + +static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) +{ + switch (msg_id) + { + case USER_MSG_ID_REQUEST_SEND_AUDIO: + if (att_server_can_send_packet_now(handle_send)) + send_audio_data(); + else + att_server_request_can_send_now_event(handle_send); + break; + case USER_MSG_ID_REQUEST_SEND_KB: + att_server_notify(handle_send, att_handle_report, (uint8_t*)&report, sizeof(report)); + if (report.k_map & 0x8) + { + uint8_t rsp = START_SEARCH; + att_server_notify(handle_send, g_audio_handle_ctrl, &rsp, 1); + } + break; + case USER_MSG_ID_START_TALKING: + audio_start(); + break; + default: + ; + } +} + +uint8_t *init_service(void); + +static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) +{ + const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; + uint8_t event = hci_event_packet_get_type(packet); + const btstack_user_msg_t *p_user_msg; + if (packet_type != HCI_EVENT_PACKET) return; + + switch (event) + { + case BTSTACK_EVENT_STATE: + if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) + break; + + gap_set_adv_set_random_addr(0, sm_persistent.identity_addr); + gap_set_ext_adv_para(0, + CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, + 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max + PRIMARY_ADV_ALL_CHANNELS, // Primary_Advertising_Channel_Map + BD_ADDR_TYPE_LE_RANDOM, // Own_Address_Type + BD_ADDR_TYPE_LE_PUBLIC, // Peer_Address_Type (ignore) + NULL, // Peer_Address (ignore) + ADV_FILTER_ALLOW_ALL, // Advertising_Filter_Policy + 0x00, // Advertising_Tx_Power + PHY_1M, // Primary_Advertising_PHY + 0, // Secondary_Advertising_Max_Skip + PHY_1M, // Secondary_Advertising_PHY + 0x00, // Advertising_SID + 0x00); // Scan_Request_Notification_Enable + gap_set_ext_adv_data(0, sizeof(adv_data), (uint8_t*)adv_data); + gap_set_ext_scan_response_data(0, sizeof(scan_data), (uint8_t*)scan_data); + gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); + break; + + case HCI_EVENT_LE_META: + switch (hci_event_le_meta_get_subevent_code(packet)) + { + case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE: + att_set_db(decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle, init_service()); + break; + default: + break; + } + + break; + + case HCI_EVENT_DISCONNECTION_COMPLETE: + gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); + break; + + case ATT_EVENT_CAN_SEND_NOW: + kb_send_report(); + break; + + case BTSTACK_EVENT_USER_MSG: + p_user_msg = hci_event_packet_get_user_msg(packet); + user_msg_handler(p_user_msg->msg_id, p_user_msg->data, p_user_msg->len); + break; + default: + break; + } +} + +#define GATT_CLIENT_CHARACTERISTICS_DESC_REPORT_REF 0x2908 + +static uint8_t att_db_storage[800]; + +const uint8_t UUID_VOICE[] = {0xAB, 0x5E, 0x00, 0x01, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; +const uint8_t UUID_CHAR_TX[] = {0xAB, 0x5E, 0x00, 0x02, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; +const uint8_t UUID_CHAR_RX[] = {0xAB, 0x5E, 0x00, 0x03, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; +const uint8_t UUID_CHAR_CTRL[] = {0xAB, 0x5E, 0x00, 0x04, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; + +uint8_t *init_service() +{ + const char dev_name[] = "ING Voice Control"; + const uint16_t appearance = 0x03C1; + + att_db_util_init(att_db_storage, sizeof(att_db_storage)); + + att_db_util_add_service_uuid16(GAP_SERVICE_UUID); + att_db_util_add_characteristic_uuid16(GAP_DEVICE_NAME_UUID, ATT_PROPERTY_READ, (uint8_t *)dev_name, sizeof(dev_name) - 1); + // Characteristic Appearance: 2A01 + att_db_util_add_characteristic_uuid16(0x2A01, ATT_PROPERTY_READ, (uint8_t *)&appearance, 2); + + init_kb_service(); + + att_db_util_add_service_uuid128((uint8_t *)UUID_VOICE); + + g_audio_handle_tx = att_db_util_add_characteristic_uuid128((uint8_t *)UUID_CHAR_TX, + ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC, + NULL, 0); + + g_audio_handle_rx = att_db_util_add_characteristic_uuid128((uint8_t *)UUID_CHAR_RX, + ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY | ATT_PROPERTY_DYNAMIC, + NULL, 0); + + g_audio_handle_ctrl = att_db_util_add_characteristic_uuid128((uint8_t *)UUID_CHAR_CTRL, + ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY | ATT_PROPERTY_DYNAMIC, + NULL, 0); + + return att_db_util_get_address(); +} + +static void sm_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) +{ + uint8_t event = hci_event_packet_get_type(packet); + + if (packet_type != HCI_EVENT_PACKET) return; + switch (event) + { + case SM_EVENT_JUST_WORKS_REQUEST: + sm_just_works_confirm(sm_event_just_works_request_get_handle(packet)); + break; + default: + break; + } +} + +static btstack_packet_callback_registration_t sm_event_callback_registration = {.callback = &sm_packet_handler}; + +uint32_t setup_profile(void *data, void *user_data) +{ + sm_add_event_handler(&sm_event_callback_registration); + att_server_init(att_read_callback, att_write_callback); + hci_event_callback_registration.callback = &user_packet_handler; + hci_add_event_handler(&hci_event_callback_registration); + att_server_register_packet_handler(&user_packet_handler); + sm_config(IO_CAPABILITY_NO_INPUT_NO_OUTPUT, + 0, + &sm_persistent); + return 0; +} diff --git a/examples/voice_remote_ctrl/src/profile_customer.c b/examples/voice_remote_ctrl/src/profile_customer.c new file mode 100644 index 000000000..b0fcbbdd1 --- /dev/null +++ b/examples/voice_remote_ctrl/src/profile_customer.c @@ -0,0 +1,340 @@ +#include +#include "platform_api.h" +#include "att_db.h" +#include "gap.h" +#include "l2cap.h" +#include "gatt_client.h" +#include "btstack_util.h" +#include "btstack_event.h" +#include "btstack_defines.h" +#include "sig_uuid.h" + +#include "FreeRTOS.h" +#include "timers.h" + +#include "audio_service.h" +#include "kb_service.h" + +#include "att_db_util.h" + +#include "../../hid_keyboard/src/USBHID_Types.h" +#include "../../hid_keyboard/src/USBKeyboard.h" + +#include "profile.h" + +static TimerHandle_t app_timer = 0; +extern int8_t mic_dig_gain; + +const static uint8_t adv_pSID[] = { + #include "../data/adv_pSID.adv" +}; + +const static uint8_t adv_sSID[] = { + #include "../data/adv_sSID.adv" +}; + +const static uint8_t scan_data_sselfi[] = { + #include "../data/scan_resp_sselfi.adv" +}; + +#define INVALID_HANDLE 0xffff + +static uint8_t att_db_storage[800]; +static uint16_t att_handle_mic; +static uint16_t att_handle_pair; +extern uint16_t att_handle_report; +extern uint8_t kb_notify_enable; + +uint8_t is_paring_mode = 0; + +static hci_con_handle_t handle_send = INVALID_HANDLE; + +static uint16_t next_block = 0; + +uint8_t audio_notify_enable = 0; + +static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, + uint8_t * buffer, uint16_t buffer_size) +{ + uint16_t r = kb_att_read_callback(connection_handle, att_handle, offset, buffer, buffer_size); + return r != 0xffff ? r : 0; +} + +static btstack_packet_callback_registration_t hci_event_callback_registration; + +static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, + uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) +{ + int r = 0; + if (att_handle == att_handle_pair) + { + xTimerStop(app_timer, portMAX_DELAY); + } + else if (att_handle == att_handle_mic + 1) + { + if (*(uint16_t *)buffer == GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION) + { + next_block = 0; + audio_notify_enable = 1; + kb_notify_enable = 1; + l2cap_request_connection_parameter_update(handle_send, 6, 6, 90, 400); + gatt_client_is_ready(handle_send); + } + else + { + audio_notify_enable = 0; + kb_notify_enable = 0; + } + } + else + r = kb_att_write_callback(connection_handle, att_handle, transaction_mode, offset, buffer, buffer_size); + return r != -1 ? r : 0; +} + +#define USER_MSG_ID_REQUEST_SEND_AUDIO 1 +#define USER_MSG_ID_REQUEST_SEND_KB 2 +#define USER_MSG_ID_REQUEST_PARING_ADV 3 +#define USER_MSG_ID_SEND_PARING_ADDR 4 +#define USER_MSG_ID_START_TALKING 5 + +extern my_kb_report_t report; + +static void app_timer_callback(TimerHandle_t xTimer) +{ + btstack_push_user_msg(USER_MSG_ID_SEND_PARING_ADDR, NULL, 0); +} + +void start_paring(void) +{ + btstack_push_user_msg(USER_MSG_ID_REQUEST_PARING_ADV, NULL, 0); +} + +void audio_trigger_send(void) +{ + if (audio_notify_enable) + btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_AUDIO, NULL, 0); +} + +void kb_report_trigger_send(void) +{ + if (kb_notify_enable) + btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_KB, NULL, 0); +} + +void start_talking(void) +{ + if (kb_notify_enable) + btstack_push_user_msg(USER_MSG_ID_START_TALKING, NULL, 0); +} + +static void send_audio_data() +{ + if (!audio_notify_enable) + return; + + uint16_t curr = audio_get_curr_block(); + if (next_block != curr) + { + att_server_notify(handle_send, att_handle_mic, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE); + next_block++; + if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; + if (next_block != curr) + att_server_request_can_send_now_event(handle_send); + } +} + +static void setup_adv(uint8_t is_paring); +const bd_addr_t rand_addr = {0xC3, 0x8E,0x05,0x3E,0x7E,0xA3}; +bd_addr_t rand_addr_rev; + +static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) +{ + static uint8_t audio_on = 0; + + switch (msg_id) + { + case USER_MSG_ID_REQUEST_SEND_AUDIO: + if (att_server_can_send_packet_now(handle_send)) + send_audio_data(); + else + att_server_request_can_send_now_event(handle_send); + break; + case USER_MSG_ID_REQUEST_SEND_KB: + if (audio_on & (0 == report.keycode)) + { + audio_on = 0; + audio_stop(); + } + if (att_server_can_send_packet_now(handle_send)) + att_server_notify(handle_send, att_handle_report, (uint8_t*)&report, sizeof(report)); + else + att_server_request_can_send_now_event(handle_send); + break; + case USER_MSG_ID_REQUEST_PARING_ADV: + if (INVALID_HANDLE != handle_send) + { + gap_disconnect(handle_send); + break; + } + setup_adv(1); + break; + case USER_MSG_ID_SEND_PARING_ADDR: + att_server_notify(handle_send, att_handle_pair, (uint8_t *)&rand_addr_rev, sizeof(rand_addr_rev)); + break; + case USER_MSG_ID_START_TALKING: + audio_on = 1; + audio_start(); + report.keycode = 0x91; + att_server_notify(handle_send, att_handle_mic, (uint8_t*)&report, sizeof(report)); + break; + default: + ; + } +} + +const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; + +static void setup_adv(uint8_t is_paring) +{ + const bd_addr_t pairing_addr = {0xAA, 0xA9,0xA8,0xA7,0xA6,0xA5}; + is_paring_mode = is_paring; + app_state_changed(is_paring ? APP_PAIRING : APP_WAIT_CONN); + gap_set_ext_adv_enable(0, 0, NULL); + gap_set_adv_set_random_addr(0, is_paring ? pairing_addr : rand_addr); + gap_set_ext_adv_para(0, + CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, + 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max + PRIMARY_ADV_ALL_CHANNELS, // Primary_Advertising_Channel_Map + BD_ADDR_TYPE_LE_RANDOM, // Own_Address_Type + BD_ADDR_TYPE_LE_PUBLIC, // Peer_Address_Type (ignore) + NULL, // Peer_Address (ignore) + ADV_FILTER_ALLOW_ALL, // Advertising_Filter_Policy + 0x00, // Advertising_Tx_Power + PHY_1M, // Primary_Advertising_PHY + 0, // Secondary_Advertising_Max_Skip + PHY_1M, // Secondary_Advertising_PHY + 0x00, // Advertising_SID + 0x00); // Scan_Request_Notification_Enable + if (is_paring) + gap_set_ext_adv_data(0, sizeof(adv_pSID), (uint8_t*)adv_pSID); + else + gap_set_ext_adv_data(0, sizeof(adv_sSID), (uint8_t*)adv_sSID); + gap_set_ext_scan_response_data(0, sizeof(scan_data_sselfi), (uint8_t*)scan_data_sselfi); + gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); +} + +static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) +{ + uint8_t event = hci_event_packet_get_type(packet); + const btstack_user_msg_t *p_user_msg; + if (packet_type != HCI_EVENT_PACKET) return; + + switch (event) + { + case BTSTACK_EVENT_STATE: + if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) + break; + + setup_adv(0); + break; + + case HCI_EVENT_LE_META: + switch (hci_event_le_meta_get_subevent_code(packet)) + { + case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE: + handle_send = decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle; + app_state_changed(APP_CONN); + att_set_db(handle_send, att_db_storage); + if (is_paring_mode) xTimerStart(app_timer, portMAX_DELAY); + break; + default: + break; + } + + break; + + case HCI_EVENT_DISCONNECTION_COMPLETE: + xTimerStop(app_timer, portMAX_DELAY); + audio_notify_enable = 0; + audio_stop(); + handle_send = INVALID_HANDLE; + kb_notify_enable = 0; + setup_adv(0); + break; + + case ATT_EVENT_CAN_SEND_NOW: + send_audio_data(); + break; + + case BTSTACK_EVENT_USER_MSG: + p_user_msg = hci_event_packet_get_user_msg(packet); + user_msg_handler(p_user_msg->msg_id, p_user_msg->data, p_user_msg->len); + break; + + default: + break; + } +} + +void init_service() +{ + const char dev_name[] = "sSelfi"; + const uint16_t appearance = 0x0180; + uint8_t level = 98; + + att_db_util_init(att_db_storage, sizeof(att_db_storage)); + + att_db_util_add_service_uuid16(GAP_SERVICE_UUID); + att_db_util_add_characteristic_uuid16(GAP_DEVICE_NAME_UUID, ATT_PROPERTY_READ, (uint8_t *)dev_name, sizeof(dev_name) - 1); + att_db_util_add_characteristic_uuid16(SIG_UUID_CHARACT_GAP_APPEARANCE, ATT_PROPERTY_READ, (uint8_t *)&appearance, 2); + + att_db_util_add_service_uuid16(SIG_UUID_SERVICE_BATTERY_SERVICE); + att_db_util_add_characteristic_uuid16(SIG_UUID_CHARACT_BATTERY_LEVEL, + ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, &level, 1); + + init_kb_service(); + + att_db_util_add_service_uuid16(0x1911); + // Mic: PCM 8bit 8kHz + att_handle_mic = att_db_util_add_characteristic_uuid16(0x2b18, + ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, &level, 1); //2901 + att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, + ATT_PROPERTY_READ, "Mic", 3); + // speaker + att_db_util_add_characteristic_uuid16(0x2b19, + ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC, &level, 1); + att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, + ATT_PROPERTY_READ, "Speaker", 7); + // ota + att_db_util_add_characteristic_uuid16(0x2b12, + ATT_PROPERTY_READ | ATT_PROPERTY_WRITE, &level, 1); + att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, + ATT_PROPERTY_READ, "Ota", 3); + // pair + att_handle_pair = att_db_util_add_characteristic_uuid16(0x2b14, + ATT_PROPERTY_READ | ATT_PROPERTY_WRITE | ATT_PROPERTY_NOTIFY | ATT_PROPERTY_DYNAMIC, rand_addr_rev, 2); + att_db_util_add_descriptor_uuid16(SIG_UUID_DESCRIP_GATT_CHARACTERISTIC_USER_DESCRIPTION, + ATT_PROPERTY_READ, "pair", 4); + + if (att_db_util_get_size() > sizeof(att_db_storage)) + platform_printf("db size should be >= %d\n", att_db_util_get_size()); +} + + +uint32_t setup_profile(void *data, void *user_data) +{ + reverse_bd_addr(rand_addr, rand_addr_rev); + app_timer = xTimerCreate("t1", + pdMS_TO_TICKS(300), + pdTRUE, + NULL, + app_timer_callback); + init_service(); + + att_server_init(att_read_callback, att_write_callback); + hci_event_callback_registration.callback = &user_packet_handler; + hci_add_event_handler(&hci_event_callback_registration); + att_server_register_packet_handler(&user_packet_handler); + return 0; +} + diff --git a/examples/voice_remote_ctrl/src/profile_ing.c b/examples/voice_remote_ctrl/src/profile_ing.c new file mode 100644 index 000000000..95b5d2a3b --- /dev/null +++ b/examples/voice_remote_ctrl/src/profile_ing.c @@ -0,0 +1,241 @@ +#include +#include "platform_api.h" +#include "att_db.h" +#include "gap.h" +#include "l2cap.h" +#include "gatt_client.h" +#include "btstack_util.h" +#include "btstack_event.h" +#include "btstack_defines.h" +#include "sig_uuid.h" + +#include "FreeRTOS.h" +#include "timers.h" + +#include "audio_service.h" + +#include "profile.h" + +// GATT characteristic handles +#define HANDLE_DEVICE_NAME 3 +#define HANDLE_VOICE_CONTROL 6 +#define HANDLE_VOICE_OUTPUT 8 + +#define CMD_DIGITAL_GAIN 0 +#define CMD_MIC_OPEN 1 +#define CMD_MIC_CLOSE 2 + +extern int8_t mic_dig_gain; + +const static uint8_t adv_data[] = { + #include "../data/advertising.adv" +}; + +const static uint8_t scan_data[] = { + #include "../data/scan_response.adv" +}; + +static uint8_t profile_data[] = { + #include "../data/gatt.profile" +}; + + +#define INVALID_HANDLE 0xffff + +uint8_t is_paring_mode = 0; + +static hci_con_handle_t handle_send = INVALID_HANDLE; + +static uint16_t next_block = 0; + +uint8_t audio_notify_enable = 0; + +static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, + uint8_t * buffer, uint16_t buffer_size) +{ + switch (att_handle) + { + case HANDLE_VOICE_CONTROL: + if (buffer) + { + *(int8_t *)buffer = mic_dig_gain; + return buffer_size; + } + else + return 1; + + default: + return 0; + } +} + +static btstack_packet_callback_registration_t hci_event_callback_registration; + +static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, + uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) +{ + switch (att_handle) + { + case HANDLE_VOICE_CONTROL: + switch (buffer[0]) + { + case CMD_DIGITAL_GAIN: + mic_dig_gain = (int8_t)buffer[1]; + break; + case CMD_MIC_OPEN: + next_block = 0; + if (audio_notify_enable) + audio_start(); + break; + case CMD_MIC_CLOSE: + audio_stop(); + break; + } + + return 0; + + case HANDLE_VOICE_OUTPUT + 1: + if(*(uint16_t *)buffer == GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION) + { + audio_notify_enable = 1; + } + else + { + audio_notify_enable = 0; + audio_stop(); + } + return 0; + + default: + return 0; + } +} + +#define USER_MSG_ID_REQUEST_SEND_AUDIO 1 + +void audio_trigger_send(void) +{ + if (audio_notify_enable) + btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_AUDIO, NULL, 0); +} + +static void send_audio_data() +{ + if (!audio_notify_enable) + return; + + uint16_t curr = audio_get_curr_block(); + if (next_block != curr) + { + att_server_notify(handle_send, HANDLE_VOICE_OUTPUT, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE); + next_block++; + if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; + if (next_block != curr) + att_server_request_can_send_now_event(handle_send); + } +} + +static void setup_adv(uint8_t is_paring); +const bd_addr_t rand_addr = {0xC3, 0x8E,0x05,0x3E,0x7E,0xA3}; +bd_addr_t rand_addr_rev; + +static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) +{ + switch (msg_id) + { + case USER_MSG_ID_REQUEST_SEND_AUDIO: + if (att_server_can_send_packet_now(handle_send)) + send_audio_data(); + else + att_server_request_can_send_now_event(handle_send); + break; + default: + ; + } +} + +const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; + +static void setup_adv(uint8_t is_paring) +{ + const bd_addr_t pairing_addr = {0xAA, 0xA9,0xA8,0xA7,0xA6,0xA5}; + is_paring_mode = is_paring; + app_state_changed(is_paring ? APP_PAIRING : APP_WAIT_CONN); + gap_set_ext_adv_enable(0, 0, NULL); + gap_set_adv_set_random_addr(0, is_paring ? pairing_addr : rand_addr); + gap_set_ext_adv_para(0, + CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, + 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max + PRIMARY_ADV_ALL_CHANNELS, // Primary_Advertising_Channel_Map + BD_ADDR_TYPE_LE_RANDOM, // Own_Address_Type + BD_ADDR_TYPE_LE_PUBLIC, // Peer_Address_Type (ignore) + NULL, // Peer_Address (ignore) + ADV_FILTER_ALLOW_ALL, // Advertising_Filter_Policy + 0x00, // Advertising_Tx_Power + PHY_1M, // Primary_Advertising_PHY + 0, // Secondary_Advertising_Max_Skip + PHY_1M, // Secondary_Advertising_PHY + 0x00, // Advertising_SID + 0x00); // Scan_Request_Notification_Enable + gap_set_ext_adv_data(0, sizeof(adv_data), (uint8_t*)adv_data); + gap_set_ext_scan_response_data(0, sizeof(scan_data), (uint8_t*)scan_data); + gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); +} + +static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) +{ + uint8_t event = hci_event_packet_get_type(packet); + const btstack_user_msg_t *p_user_msg; + if (packet_type != HCI_EVENT_PACKET) return; + + switch (event) + { + case BTSTACK_EVENT_STATE: + if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) + break; + + setup_adv(0); + break; + + case HCI_EVENT_LE_META: + switch (hci_event_le_meta_get_subevent_code(packet)) + { + case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE: + handle_send = decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle; + att_set_db(handle_send, profile_data); + break; + default: + break; + } + + break; + + case HCI_EVENT_DISCONNECTION_COMPLETE: + audio_notify_enable = 0; + audio_stop(); + handle_send = INVALID_HANDLE; + setup_adv(0); + break; + + case ATT_EVENT_CAN_SEND_NOW: + send_audio_data(); + break; + + case BTSTACK_EVENT_USER_MSG: + p_user_msg = hci_event_packet_get_user_msg(packet); + user_msg_handler(p_user_msg->msg_id, p_user_msg->data, p_user_msg->len); + break; + + default: + break; + } +} + +uint32_t setup_profile(void *data, void *user_data) +{ + att_server_init(att_read_callback, att_write_callback); + hci_event_callback_registration.callback = &user_packet_handler; + hci_add_event_handler(&hci_event_callback_registration); + att_server_register_packet_handler(&user_packet_handler); + return 0; +} diff --git a/examples/voice_remote_ctrl/src/profile_miboxs.c b/examples/voice_remote_ctrl/src/profile_miboxs.c new file mode 100644 index 000000000..32e0b4088 --- /dev/null +++ b/examples/voice_remote_ctrl/src/profile_miboxs.c @@ -0,0 +1,278 @@ +#include +#include "platform_api.h" +#include "att_db.h" +#include "gap.h" +#include "sm.h" +#include "btstack_util.h" +#include "btstack_event.h" +#include "btstack_defines.h" +#include "sig_uuid.h" + +#include "FreeRTOS.h" +#include "timers.h" + +#include "audio_service.h" +#include "kb_service.h" + +#include "att_db_util.h" + +#include "../../hid_keyboard/src/USBHID_Types.h" +#include "../../hid_keyboard/src/USBKeyboard.h" + +#include "kb_service.h" + +#include "profile.h" + +// GATT characteristic handles +#define HANDLE_DEVICE_NAME 3 +#define HANDLE_APPEARANCE 5 + +const sm_persistent_t sm_persistent = +{ + .er = {1, 2, 3}, + .ir = {4, 5, 6}, + .identity_addr_type = BD_ADDR_TYPE_LE_RANDOM, + .identity_addr = {0xC3, 0x22, 0x63, 0x14, 0x85, 0x96} +}; + +const static uint8_t adv_data[] = { + #include "../data/advertising_atv2.adv" +}; + +const static uint8_t scan_data[] = { + #include "../data/scan_response.adv" +}; + +#define INVALID_HANDLE 0xffff + +uint8_t audio_notify_enable = 0; +static uint16_t next_block = 0; + +extern uint16_t att_handle_report; +extern uint8_t kb_notify_enable; + +hci_con_handle_t handle_send; + +uint16_t g_audio_handle_tx; +uint16_t g_audio_handle_rx; +uint16_t g_audio_handle_ctrl; + +uint8_t g_audio_tx_buf[20]; +uint8_t g_audio_ctrl_buf[20]; + +uint16_t g_audio_char_rx_cfg = 0; +uint16_t g_audio_char_ctrl_cfg = 0; + +#define ATV_GET_CAPS 0x0A +#define ATV_MIC_OPEN 0x0C +#define ATV_MIC_CLOSE 0x0D +#define AUDIO_STOP 0x00 +#define AUDIO_START 0x04 +#define DPAD_SELECT 0x07 +#define START_SEARCH 0x08 +#define AUDIO_SYNC 0x0A +#define GET_CAPS_RESP 0x0B +#define MIC_OPEN_ERROR 0x0C + +static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, + uint8_t * buffer, uint16_t buffer_size) +{ + return 0; +} + +static btstack_packet_callback_registration_t hci_event_callback_registration; + +const uint8_t caps_rsp[] = {GET_CAPS_RESP, 0, 4, + 0, 1, + 0, 0x86, + 0, 0x14}; + +static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, + uint16_t offset, const uint8_t *buffer, uint16_t buffer_size) +{ + return 0; +} + +#define USER_MSG_ID_REQUEST_SEND_AUDIO 1 +#define USER_MSG_ID_REQUEST_SEND_KB 2 +#define USER_MSG_ID_START_TALKING 3 + +extern my_kb_report_t report; + +void audio_trigger_send(void) +{ + if (audio_notify_enable) + btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_AUDIO, NULL, 0); +} + +void kb_report_trigger_send(void) +{ + if (kb_notify_enable) + btstack_push_user_msg(USER_MSG_ID_REQUEST_SEND_KB, NULL, 0); +} + +void start_talking(void) +{ + if (kb_notify_enable) + btstack_push_user_msg(USER_MSG_ID_START_TALKING, NULL, 0); +} + +static void send_audio_data() +{ + if (!audio_notify_enable) + return; + + uint16_t curr = audio_get_curr_block(); + if (next_block != curr) + { + att_server_notify(handle_send, g_audio_handle_rx, audio_get_block_buff(next_block), VOICE_BUF_BLOCK_SIZE); + next_block++; + if (next_block >= VOICE_BUF_BLOCK_NUM) next_block = 0; + if (next_block != curr) + att_server_request_can_send_now_event(handle_send); + } +} + +static void user_msg_handler(uint32_t msg_id, void *data, uint16_t size) +{ + switch (msg_id) + { + case USER_MSG_ID_REQUEST_SEND_AUDIO: + if (att_server_can_send_packet_now(handle_send)) + send_audio_data(); + else + att_server_request_can_send_now_event(handle_send); + break; + case USER_MSG_ID_REQUEST_SEND_KB: + att_server_notify(handle_send, att_handle_report, (uint8_t*)&report, sizeof(report)); + if (report.k_map & 0x8) + { + uint8_t rsp = START_SEARCH; + att_server_notify(handle_send, g_audio_handle_ctrl, &rsp, 1); + } + break; + case USER_MSG_ID_START_TALKING: + audio_start(); + break; + default: + ; + } +} + +uint8_t *init_service(void); + +static void user_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) +{ + const static ext_adv_set_en_t adv_sets_en[] = {{.handle = 0, .duration = 0, .max_events = 0}}; + uint8_t event = hci_event_packet_get_type(packet); + const btstack_user_msg_t *p_user_msg; + if (packet_type != HCI_EVENT_PACKET) return; + + switch (event) + { + case BTSTACK_EVENT_STATE: + if (btstack_event_state_get_state(packet) != HCI_STATE_WORKING) + break; + + gap_set_adv_set_random_addr(0, sm_persistent.identity_addr); + gap_set_ext_adv_para(0, + CONNECTABLE_ADV_BIT | SCANNABLE_ADV_BIT | LEGACY_PDU_BIT, + 0x00a1, 0x00a1, // Primary_Advertising_Interval_Min, Primary_Advertising_Interval_Max + PRIMARY_ADV_ALL_CHANNELS, // Primary_Advertising_Channel_Map + BD_ADDR_TYPE_LE_RANDOM, // Own_Address_Type + BD_ADDR_TYPE_LE_PUBLIC, // Peer_Address_Type (ignore) + NULL, // Peer_Address (ignore) + ADV_FILTER_ALLOW_ALL, // Advertising_Filter_Policy + 0x00, // Advertising_Tx_Power + PHY_1M, // Primary_Advertising_PHY + 0, // Secondary_Advertising_Max_Skip + PHY_1M, // Secondary_Advertising_PHY + 0x00, // Advertising_SID + 0x00); // Scan_Request_Notification_Enable + gap_set_ext_adv_data(0, sizeof(adv_data), (uint8_t*)adv_data); + gap_set_ext_scan_response_data(0, sizeof(scan_data), (uint8_t*)scan_data); + gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); + break; + + case HCI_EVENT_LE_META: + switch (hci_event_le_meta_get_subevent_code(packet)) + { + case HCI_SUBEVENT_LE_ENHANCED_CONNECTION_COMPLETE: + att_set_db(decode_hci_le_meta_event(packet, le_meta_event_enh_create_conn_complete_t)->handle, init_service()); + break; + default: + break; + } + + break; + + case HCI_EVENT_DISCONNECTION_COMPLETE: + gap_set_ext_adv_enable(1, sizeof(adv_sets_en) / sizeof(adv_sets_en[0]), adv_sets_en); + break; + + case ATT_EVENT_CAN_SEND_NOW: + kb_send_report(); + break; + + case BTSTACK_EVENT_USER_MSG: + p_user_msg = hci_event_packet_get_user_msg(packet); + user_msg_handler(p_user_msg->msg_id, p_user_msg->data, p_user_msg->len); + break; + default: + break; + } +} + +#define GATT_CLIENT_CHARACTERISTICS_DESC_REPORT_REF 0x2908 + +static uint8_t att_db_storage[800]; + +const uint8_t UUID_VOICE[] = {0xAB, 0x5E, 0x00, 0x01, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; +const uint8_t UUID_CHAR_TX[] = {0xAB, 0x5E, 0x00, 0x02, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; +const uint8_t UUID_CHAR_RX[] = {0xAB, 0x5E, 0x00, 0x03, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; +const uint8_t UUID_CHAR_CTRL[] = {0xAB, 0x5E, 0x00, 0x04, 0x5A, 0x21, 0x4F, 0x05, 0xBC, 0x7D, 0xAF, 0x01, 0xF6, 0x17, 0xB6, 0x64}; + +uint8_t *init_service() +{ + const char dev_name[] = "ING RC"; + const uint16_t appearance = 0x03C1; + + att_db_util_init(att_db_storage, sizeof(att_db_storage)); + + att_db_util_add_service_uuid16(GAP_SERVICE_UUID); + att_db_util_add_characteristic_uuid16(GAP_DEVICE_NAME_UUID, ATT_PROPERTY_READ, (uint8_t *)dev_name, sizeof(dev_name) - 1); + // Characteristic Appearance: 2A01 + att_db_util_add_characteristic_uuid16(0x2A01, ATT_PROPERTY_READ, (uint8_t *)&appearance, 2); + + return att_db_util_get_address(); +} + +static void sm_packet_handler(uint8_t packet_type, uint16_t channel, const uint8_t *packet, uint16_t size) +{ + uint8_t event = hci_event_packet_get_type(packet); + + if (packet_type != HCI_EVENT_PACKET) return; + switch (event) + { + case SM_EVENT_JUST_WORKS_REQUEST: + sm_just_works_confirm(sm_event_just_works_request_get_handle(packet)); + break; + default: + break; + } +} + +static btstack_packet_callback_registration_t sm_event_callback_registration = {.callback = &sm_packet_handler}; + +uint32_t setup_profile(void *data, void *user_data) +{ + sm_add_event_handler(&sm_event_callback_registration); + att_server_init(att_read_callback, att_write_callback); + hci_event_callback_registration.callback = &user_packet_handler; + hci_add_event_handler(&hci_event_callback_registration); + att_server_register_packet_handler(&user_packet_handler); + sm_config(IO_CAPABILITY_NO_INPUT_NO_OUTPUT, + 0, + &sm_persistent); + return 0; +} diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw index f8ec9232c..2614342ef 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.ingw +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 134316, + "size": 135904, "base": 16384 }, "ram": { - "size": 30488, + "size": 32536, "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_trace_raw","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_shutdown","platform_config","platform_read_info","platform_calibrate_32k","platform_hrng","platform_rand","platform_get_us_time","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","btstack_memory_pool_create","btstack_memory_pool_get","btstack_memory_pool_free","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskGetTickCountFromISR","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerGetExpiryTime","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler","vPortEnterCritical","vPortExitCritical","vPortSuppressTicksAndSleep","vPortValidateInterruptPriority"], "version": [ - 1,0,1] + 1,0,8] }, "tc_dir": "C:\\Keil_v5\\UV4", "ide_ver": "5", @@ -54,8 +54,8 @@ "keil": true, "cmsis": "", "gatt_handle_name": "HANDLE_VOICE_CONTROL", - "app_ram_size": 35048, - "app_ram_addr": 536901400, + "app_ram_size": 33000, + "app_ram_addr": 536903448, "uart_log": true, "ota_ver_patch": "0", "profile_data": "\/\/ Service Generic Access: 1800\r\n0x0A, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28,\r\n0x00, 0x18, \r\n\/\/ Characteristic Device Name: 2A00\r\n0x0D, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28,\r\n0x02, 0x03, 0x00, 0x00, 0x2A, \r\n0x20, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x2A,\r\n0x49, 0x4E, 0x47, 0x20, 0x56, 0x6F, 0x69, 0x63, \r\n0x65, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, \r\n0x20, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, \r\n\r\n\/\/ Service INGChips Voice Output Service: {00000001-494e-4743-4849-505355554944}\r\n0x18, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28,\r\n0x44, 0x49, 0x55, 0x55, 0x53, 0x50, 0x49, 0x48, \r\n0x43, 0x47, 0x4E, 0x49, 0x01, 0x00, 0x00, 0x00, \r\n\/\/ Characteristic Voice Control: {bf83f3f1-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28,\r\n0x06, 0x06, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF1, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x06, 0x03, 0x06, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF1, 0xF3, 0x83, 0xBF, \r\n\/\/ Characteristic Voice Output: {bf83f3f2-399a-414d-9035-ce64ceb3ff67}\r\n0x1B, 0x00, 0x02, 0x00, 0x07, 0x00, 0x03, 0x28,\r\n0x10, 0x08, 0x00, 0x67, 0xFF, 0xB3, 0xCE, 0x64, \r\n0xCE, 0x35, 0x90, 0x4D, 0x41, 0x9A, 0x39, 0xF2, \r\n0xF3, 0x83, 0xBF, \r\n0x16, 0x00, 0x10, 0x02, 0x08, 0x00,\r\n0x67, 0xFF, 0xB3, 0xCE, 0x64, 0xCE, 0x35, 0x90, \r\n0x4D, 0x41, 0x9A, 0x39, 0xF2, 0xF3, 0x83, 0xBF, \r\n0x0A, 0x00, 0x0A, 0x01, 0x09, 0x00, 0x02, 0x29,\r\n0x00, 0x00, \r\n\r\n0x00,0x00\r\n\/\/ total size = 189\r\n\r\n\/\/ HANDLE_DEVICE_NAME=3\r\n\/\/ HANDLE_VOICE_CONTROL=6\r\n\/\/ HANDLE_VOICE_OUTPUT=8\r\n\r\n\/\/ HANDLE_DEVICE_NAME_OFFSET=31\r\n\/\/ HANDLE_VOICE_CONTROL_OFFSET=128\r\n\/\/ HANDLE_VOICE_OUTPUT_OFFSET=177\r\n", diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx index 8fa1f6af5..87d230b03 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvoptx @@ -117,7 +117,7 @@ 0 DLGUARM - d + / 0 @@ -145,14 +145,38 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0NEW_DEVICE -FS00 -FL040000 -FP0($$Device:ARMCM3$Device\ARM\Flash\NEW_DEVICE.FLM)) - + + + 0 + 0 + 144 + 1 +
    157024
    + 0 + 0 + 0 + 0 + 0 + 1 + .\src\audio_service.c + + \\voice_remote_ctrl\src/audio_service.c\144 +
    +
    + + + 0 + 1 + sample_buf,0x0A + + 0 0 0 - 0 + 1 0 0 0 @@ -218,7 +242,7 @@ 1 3 1 - 0 + 1 0 0 .\src\audio_service.c diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj index 8112a01ac..5d626c101 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvproj @@ -319,8 +319,8 @@ 0 - 536901400 - 35048 + 536903448 + 33000 0 diff --git a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx index ef4d76ab4..7c9bcf3da 100644 --- a/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx +++ b/examples/voice_remote_ctrl/voice_remote_ctrl.uvprojx @@ -1,7 +1,10 @@ - + + 2.1 +
    ### uVision Project, (C) Keil Software
    + Target 1 @@ -15,28 +18,28 @@ INGChips.INGCHIPS_DeviceFamilyPack.0.9.0 http://www.ingchips.com CLOCK(32000000) CPUTYPE("Cortex-M3") ELITTLE IROM(0x4000-0x43fff) IRAM(0x20000000-0x2000ffff) - - - + + + 0 - - - - - - - - - - + + + + + + + + + + $$Device:ING91800$SVD\ING91800.svd 0 0 - - - - - + + + + + 0 0 @@ -58,8 +61,8 @@ 0 0 - - + + 0 0 0 @@ -68,8 +71,8 @@ 0 0 - - + + 0 0 0 @@ -79,14 +82,14 @@ 1 0 fromelf.exe --bin -o voice_remote_ctrl.bin ./output/voice_remote_ctrl.axf - + 0 0 0 0 0 - + 0 @@ -100,8 +103,8 @@ 0 0 3 - - + + 1 @@ -135,10 +138,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -171,7 +174,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -269,8 +272,8 @@ 1 - 155648 - 385024 + 0x26000 + 0x5e000 1 @@ -294,8 +297,8 @@ 0 - 536901400 - 35048 + 0x20007f18 + 0x80e8 0 @@ -303,7 +306,7 @@ 0x0 - + 1 @@ -330,8 +333,8 @@ 0 --gnu - USE_STDPERIPH_DRIVER,DEV_BOARD - + USE_STDPERIPH_DRIVER + ../../bundles/typical/inc;../../bundles/typical/inc/os;../../bundles/typical/inc/os/portable/RVDS/ARM_CM3;../../src/BSP;../../src/FWlib;../../src/StartUP;../../src/Tools;../../src @@ -347,10 +350,10 @@ 0 0 - - - - + + + + @@ -362,13 +365,13 @@ 0 0x00000000 0x00000000 - - - - - - - + + + + + + + @@ -487,11 +490,12 @@ + - + @@ -499,4 +503,5 @@ +
    diff --git a/src/BSP/eflash.c b/src/BSP/eflash.c index dfec3794d..deecd5ef8 100644 --- a/src/BSP/eflash.c +++ b/src/BSP/eflash.c @@ -1,6 +1,6 @@ #include -uint32_t ClkFreq; //0:16M 1:24M +static uint32_t ClkFreq; //0:16M 1:24M #define PAGE_SIZE (8192) #define PAGE_SIZE_SHIFT 13 @@ -80,3 +80,4 @@ int write_flash(const uint32_t dest_addr, const uint8_t *buffer, uint32_t size) { return program_flash0(dest_addr, buffer, size, 0); } + diff --git a/src/FWlib/peripheral_pinctrl.c b/src/FWlib/peripheral_pinctrl.c index 3bfba511f..c52650bd4 100644 --- a/src/FWlib/peripheral_pinctrl.c +++ b/src/FWlib/peripheral_pinctrl.c @@ -87,12 +87,12 @@ void PINCTRL_SetGeneralPadMode(const uint8_t io_pin_index, const gio_mode_t mode } *reg &= ~(0xf << shift); - *reg |= (pwm_channel * 2 + pwm_neg); + *reg |= (pwm_channel * 2 + pwm_neg) << shift; } break; case IO_MODE_ANT_SEL: index = PINCTRL_AntSelIndex(io_pin_index); - if (index < 0) break; + if (index >= 0) { volatile uint32_t * reg = (volatile uint32_t *)(SYSCTRL_BASE + OFFSET_ANT_SEL); *reg |= 1 << index; diff --git a/src/Mesh/Mesh.lib b/src/Mesh/Mesh.lib new file mode 100644 index 0000000000000000000000000000000000000000..ce75c1efc87e84ac781da965450434bf8a9c61ad GIT binary patch literal 9279128 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%0AleI_YdKVEAL2*2Zx8=#(-+q*(G#D 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%0D%s+ly;`dGbhg{CPZ3JUpu& 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%0Dr-V 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%0DWS|Y$tmpKFl!+*)xFYVb=Y! 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 B-7w+w%(ZQ1rT&JtVaJW!n!Fi=hB-hjJsVkDZW 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 z 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%0Ajjicp&VcxP;|zrA;0efOZ|7Z$$O z(}j;{T#WR7MAJ^89->{~A#!_Gson>BR4cWWS>2=Rj9(ubVSU8hGBK?+mOT^W*OAo4 z9n(8;3GCStZ@Ls?*v8a$T#`F;N$!Y}oJeg?Vp4iHS6S9=Fq@`3WfwS}qdhpITz+!4 z$0MHwn_|0vnp>|0Vhlv{w=P+R*3bgw*@w4}_F8;|{d{nb8fqKR#LcwFM*Psb+V|UQ z_fxd{THF&q{gRuVeM3>)^UfTE?~nU&xYBRu%?5pDm4DN4ufiAMUhOfhK&)zSKZo$3 zpX?KTeoVuYVV4nmS`XTcqBSN4VLEeOesqS9{OI(;ZU-7YX`~%J-PVTwF7)VKhWe&B zZ-TO&u4}pm4g7JzbfH}E$#m^O=Mj~V=>4H!a)qkK5lx#bT;-F(RVG(qi;kVAjqP@B zDJ7!e?0E2%V=Fk=E2GkhpPI0})TA^1qPoha(;`#(Q=P%ylJo>Hlieqv z*hx9~E)KmwEPq$yiv4Q%m6>55{Z@O`I_NvwvG~A1*LtMZKPxu(6Lqs=|HWT9kIkR= zMI-U4l>-}ltpoe|*I7N?tE||n_H`>8i*xI&&aRDJJ$)NiHunt-X1Z621o?kd70YTL zSZ`U@LQAG(byyv97IwBbbkrl*%BPmrQy;8q54}GWHE2f{Ho;YFhyQWqp9u+8F6rv- zS-BFTu3VXD!OVN*%5-l>&roOAN-%cx^>(jjhgZ-aaE2?riSJvnernyTb0<`}n zIw>@Bo<)oD0qNuvrIR|O^)LLQ?fvUJI`%QlLq1Zy9a^e!=D5hXXk}Std1XcAxXQ}P z@s$%QCytv``4Oj0BQZ(J4+0}H0y*Z80P=S>uJOs6wv-=Lc69WZ$k)xT36sB)m~7m2 z_dP#-ATjZa6YN{Rydz0#kxB^HBkGF3qu8orq-coT? z`O#&^M2|&jCngVePndjg%EM9klU7k9$5@~YQ%~O;`RDD61z!i_^&el z;Fj@6RUSR=n2KY|k1IPq`ZeSr^4}9CAJ`~r#l83a?B@?OPF!M}EFNLB+md!hOS>Pf zx38W=Iw@l+U8I_KRh-1cep`xdl|j!xor%*pIVk^VAUydm*eP#&{&gF@1-d9}T({u95pAuj{X^Kc*o%(aGm5x+{oTm88~t@)8)cpXKJ}}@O?>iU zU#Ee}w&Y*Os%ET1wxD*tZ>;~wHT*b6*Zqe{UoqH$`W=Fs(W+~Doj93sN3TxAl)$*2 z%h;pSKIk%E$+)8@vyM$|HT6}#eiGr^Qm=OfpZbxVx%vS-zhBJQC}IA)bg+k%x9q6s z(P-bYlVRA~q61yt24GT|Y2&gq56Td}E!cXQ{YPHI7;XLP<6fGfH%=b#*SGlO4UvN< zAGj^$7el$L-(I+hPyUKCAB<1ln4A2SZL$m9<`x9tVygF*_%_b*VoG3K|0A=bjM3J! zUWQjAng2~~J+(`t(SPVVpfe->FX|wMe5>D?xEZanRZM~6x*2~T1nw0d5bj}HiCbw_ zMk;;2!AhTRkk&TB+wsxB2=`G=McV3@$4z|lAzS3wql8T1crgWr>oxcrt@7376z%_E zH2=%OLGnPj?!x7qq{&I+&i9K^wv8D2+^QNFm?LlVyfy}Y^_ztott|8GNP1w~@~O)h z18(E{kWtrr6|gqrPp-dA!1@bbKwsIINm+QAd@Vn?*Ip8zOzg7{?+L@p(*X-G=2kAj zAaVL(j3s5L{P)VRV*S7xYp{ELSKrW}QS}x?DQ7`8thVrS^y=<4a+TJoqVH3PICBM- z#f+-gK_~)N@Gc>v>Mu@6$KWQT3SW{?aBBTbtuOU$Fsddyh)B2D(LwpYR|ix8v?@Wr zGPAN{ZF|45ef81CXYPxbL)&@ZNfC64e$T2Jve$9-m zz6k+MKaH%cbi$*rPKfj#h5)1MX!@Ujblwjaqfs^nx};SX`nh!ZP{jPYxt(_%oaq$( z@VZ@K8dOiE2S_H?o#?t&7$e(dh)EI|uV;J+@^hbQUSV!GIEZ5@ zL{YJDD!U`h%!j9Jt~Iw?-H)Rwus3qsv%}}7eF)0tA=A9c+-^<#;2<`R^lehRuDFDF zos;fHSVYExF>RAh5JJ1#q#GjU9p-lWhB85=h=*^GqR(>MGf8iI9#d_P>=kEGV zH$BwU9gjcrQPuQZ$4!q44{mz+yR2hp4_6DVxOIoUw7)X9Q+s=KV^`!O(BAW`y^rYH z`;|v~b=);lIyf}QsEWagBB!ieL7RuPfCE;jhJJf)=wD@RUk1U+6>a`SY5Nt{wh9l_ zHl4*acDlYdMAvVd+o}Chx~>)Z=;)e1%65qrwA~KDM?`yDjMF()p25^W-SozP6>5$rSnf z)VW8skyCOjC?(qTt}HyXSY#=DHlP%aVAFpWl18W$Zd0XjIGer-4=e>^jK?LnuzEe^ zaAU;$Npw54uT>jID(Vpw!*krVZl`yxk9)e-B&o9L1~y^xl--0s^Vdpw*Ru($@L=VQ z?U+t!!)3$J-SezFZ?mDOM@M(fLAv|r*65DT8XdbfcZ;&SvhwcUL9H1$(b)gj5%c=8 za+k-(wME>7Z-jmdW36k%V64@u^V$tKkkP2(LD^c>U-4XgE%{ZXi{!s8ddX#|XV3t$ zncHld(MuxLry1tXy7}&AN^cWfR+3RTo-BB-ga-vj84?8l#@04_gb+qqfPQa^n2(iB z!d7#hBl1RjCADHJrBZU8vEyTH|A2kFvAst+IXuc-Yer9HUApEd;{$Z5DQ|3japZ@g zUy$zLl6#|UlIy($r8~v8)w=8LI?!VM2{R2D)+ye=6U`+zmGx> z&Aupc*a?_K-R9T)ya3HBRXejOE&}Abb4>MqZVA1=95LT<>s>8H z(Cfs?niWDR&C|IJo(ZgkGOF@4%XiOPJ!(D^YQB=yypwL=9}iHoZQx=_Lus8ddG46% znU+ZC7u05)7d5|K;hHa~We8o*3SletOsaP+Mw)p@9?XBK`GUX6%M8P zrf)^RhJ5Go_a*$9Kd6ZGUVs~;_j3OKditM!W841RB7_JmpT9)RdnzWWB?NwbUd@LU zTd6|vIAnP-*IOhmkL+5XOI#K) z|KhF-F1@QpN3o5r-d&xprxB`#n#S0V9i!sHPw5Iiu78B<%G!uy9+bXf%!qc@(+cZu z#L=@;oMzzo8uvibq`OUHYGV^iJT&;y}cN= zHFf+>uH)nMzHecvIxd!P^g6!hnChM^fPTtuFTuQFoU6a1IxZDvo2=s6DwB0<-K+Cb z^}B{_bk3OSse!fR=;?aQB|`P&s@{ro6m=EW2f6C@ryw!u?L%i@_XX>Xc95zj@jvzj z`+6u;Pai7#nl+~NQdx>>zpjXw&jjnOZ(~>gf&JZsU1MrxhOuZ&^`%-PrLS8e=5L14 z*N4j54C90`)gL#hXjOy8DqoM9uiIl4tf<+;6~(kx4Ob$kWVWh1;PWuWoUr6*Wn*{$ zpxjMzE7Vka>JIm4^f4a3Owflf8Q<_Fa!Rw~8u1Na#&(^V-bA9GvS(~*y|6NH{Iao~ zG-FqO#kj5I;2pngmFoAP!ohEB*O?axA#C0KG-6&>N_Vb?KrxS&{Va9flqLxRmZb+;%v&{kt+JrOR6*=FdWP=^qj)_R*@< zrK_^XjU!sc4C?dPt#znoP3i9!5%ZDZ_4i@6$euCP=hf~$#@VWfeRhAuR>ey8?Wm(i zm48QZZIu~@`e}h~RN<@I!;FWnzoJ|eK|g6%-gi^Sv{CKd9>MQO4=j-va zp*s4|)Z?)o-<&C`abP{hSm$?c{i#Qmo)rT|7kpNE*y)BNh3v~}t<##WzKl+Y*a z^BSK%X(*#NfeN6MKDpyvIqcq+OSi#3`MsDAk$uuR5A+M_w_%@81?p3`PX#cnKJOfM zfPL`R+oxZhV|+G1g;1xl|AVIa&k5sPFA3pW3GyTvv8kMolOcM=r+Q&pc+twpiV_#p7_Hx(h#{SPo z%ws0H8fE(%7iu=7aNH+5Z0PS^-`;OD@HcUL`0 z60M-rjH&~uO{W+5odi~B+i2*pC*PZMtBD7{C-66Rb#O11!7x69*~@(sD;(vib5yvc zP*frBaPG+`F0I1ROS(RQO#YOy%bS{&q^~k>jfi}zpxzfLVAb#NznQCE^^S}tqKoi1 zb}~z&Fwz&BYWuPZ>b;o6TlRhWAHT8HZM6`>fNpE4Nx@GA^`D4_QQ z`oH5e{J#fox~`B^d~n&=$z26m=$Ag*yj@D9f)M&y{6&p9_#aJ+`x{0^>GS8nVpLRA z;5$YCV2ob;55sa}cp-e4eFL8~3_5MlIbaZi^mfyiovhvsJyzcUK92-kqM_3W@d>BZ z?hhuFo6)}+6=r#4C)^!Uv2%H(LflQ3LAX}zR57{YK*U8WVz}EGf72=u9<8X@2lumZ zzgp?(Z$m$UFy)Z|1L7dZfT#|^RGd0g zQ73CqIoG2|g{U>X%7m(g3H1sS0wZb-w;NM=3_F(X#*~kGU-Ml+;-H43ZZ3<^QQn4Fy<vN8Qz&(0DO%B>sl(A5 z>27z9CsW#+Gf!@RL%`vZ^4~|@y-ufA-sEK}ca>W$UT9uc%)DmUmBrE(F)Z>d2+S&tAyGxVw z>6A->jMLFK4=AWHM3_K8X^DF>cuH+DOF?(^hhm34qhRfZ;JU-`K;;mL{#=&Jb+TOU zcgjVq0gk1OpBhy*jy6*@lXOElavAxd$Pg*Usq;cjs&P=JE!5~Ta;hhr^4FW<~7w1OQICs*R>*2+%&;vD}XvtjTeCWZckY0_* zy0|y%<8E6YH%omWg!OTYt&ej@XAEpcZz$vHv?Gt7XzsByq~>u%#Wbo<<+5T`%%W)w z6(IEipDT~TzUh$%@l;iIDK`ceEGDG$MIU9xZv^RPro9-l=A@ zzI1tH-#NUFmXDT9CzMkar3S~W*jJ3iBbSTa-lKlAe3)<2WD!%u z9V=qGjG6}brqKX5|1_*2HC2LXZv7xU$4*Ic0q;g zuk`kp1fVvG^AM$n=)s%|gouokMWU}9O#N}089lqaVj7-*doT!*1rhRbJnThtXfbhI zAaZEuH7K8VjaHf5>(0|Gwi$PxDk)E!M4on`Y^scLmn^La_Qpk0f$4+ZEr#cU+wucO zD<6MFK4d=xJ(fo>B;XDMHnCx}(s)nkO7=(5uTDdzcPKZfqJU@u!?XH|kMSJxmeES{ zxN$C!~XSi%eEpI>jH|6c&G05Am|4n&&dE|Nf<7nCBneO{sPsb5!hkCQ^5PL1Q_iuwGA5j@(KQOnnjD%}q# zU$-m#e{;Tmq0;?;^7XjFA6dR`94$L}QKYNtotW}b?Bkd%GX6A%@LIewQWwZkne+< zIr<|{zPjJ0q9Q$xT3J2uZz!whM_yJJjaFIxUX>NqTiyS|V?i;0l68ihWmLhy} zHGMv<%WV4`#Ef$)`AD^fa(KyjY*8E?eMX}13E61WLVf$F;T}1WZAjsYvEOK}Mff+? z1nj=CH*A>EV}wAM=+h8~nqilA)?=0 zJ6d`CxyYm1UO*iXuY2u6LvjqJZM&rXUL)`e^$o1-8?e@6E2+l?R33fKG&!SY#X`3C z9Oq&7h;i|nZcpDDAM9>q?Bw2d`a#+-Jpx(%W~|vPuN#%a1b2~xhaFWKVh+4uOpu|V$)6?FPI=kH`Wc1&Qs2PZ2UR>(@5tDqAA!e}>(BsMC>m_4Kthp7d--Uk zeKD=OU|kCJnYt#*7oe$h@OLO*GvYo**Sxr&LRXT3Xy|&XxR25GOc_qsvt>9g_OA?g z#79?&SF7ReN_YoI8oF*0_qBATmsW_Eu1CmlTXgF@zM1zala>BB_Cg(72$PseM#K&^;H>;i~ZBF??))G zYw7xsxZjnokBWP~zAf%+>H40y-<7VkUJqWrt`+ySbnTVlbfwRy5kAQ6pPv2$2&KHy z^HKXkoChT~%YbZn}3 z#79?IUwrj%Yp`{lY?0V@!no1ndxnYMDB@i@*JZB~@s+sPKRv!0p~xGN**`u0eG9`^_!utsPmjM6p}-I2m$v1K*Y!I^@W*U$ekK_YHBLXB zC@D(M0hJhWnMSS#mzcQ4|MpLpZ@Bbh;39Oo?ji17wm?`y7P{L}P}I_O7jZw8t_?CA z7ygla6b>2daG_}2;(z<6>mY{E|En^PR?E4pPp4aY0T8N~L)Ull7c~yOoo}E&ir5oj z_D|O#F(ZBoU5N`$v3^ed(OLB8E8WO2$Q;bX_3Bap518Erp{{=ix%p zCCXP%;XksK)|=E7w^3I^tyCJg*gw6@hi^M%dBzkwRc&fNP*_xi6zwTDJ^g19J(lU8 zDbkPOV*hmcHX{`B#q3Dj=Tw zP8D5e30j?$@typ|1ciN!kSVGTF>#Ck?H|P=ef!zOo59I=F=bh?J>o-aVzJq= zhPsBjJpf@@#dHft)Gzqd+_|5sTOdLU#bg5H^-RJKOH=tmI@?Nt3m49*TbSXfRC2LR zM)wZYoI1fwp@sApQdV(AjuIN`9q3-u+tnGP4_uM}M35`ylj)`=MWdn?x3-ZKbC`}F z@Sl}#&7@liN+iJHE$P;59zhKbX)az&G-pyvQyGNUakwMh9&jF9$R8CYs}UtF5(=Ufh~W+KDd<4lbGDkjx4wua*YZ_Vo)r zElal+m4a*~I?;%2i7!_KJ$=1vV)P%&-sX<9x!qI)-3NE|t+t?isc{*=RH6)I$cDjw zNfOVuBoeCBV{_|f*VWCR$7vSh`NgTCmB_VOiEO@@T5h$>mL(>mnh;gUHWimP<%WxB zNhk8zOuCWj64{nqI+L(yfaV&FNf0FsEAM07^1DVmkVI2m0^|Al|p{9b6p~7fP2CN-haaCYf5APNb~X zcuOkA?+fA}gU+svR&V=yocU}tC(>3t0b`4=$YkS5k)!$svR5k3*1Sa&iEL|YDp5rJ zE3k<-W#Y)65K*K|Vo+7iTc2-BwWX}4woJxKrW)H8bG&7tm{3^qp}l{-b7vc~ESGpb z(QM7P6s;ag2%;+Kp~dF5mPTn1GCY^hHc=UQK$=qVVp~3CHODhe%d&Z)U9>^MR#dFO z6SdnD)zX$JrgNDUQhHBpGTVkS3kOc7m!^}cVBWUYc!ukCaC9Q`h2V(P@?r|D0$Rp= zYH_+yL zs>!nhxSi2LtwKv2fLuFn(`)eQVmhiMq(D#6JWF8Wnn?MRsq zD=?D-ct@hzYf^~?4q?N=9d0#LH zJ^TZAUTHm_1tfHbp)x>djX|YA<6n^i9nj$|8RtWD1n$t%hgX7W74A$MmmFDMTKT0e zKG~X(9qRJ~sP#`*5%oU!6Ee>NwO1>2o+fdKk1Bx_?`unPI^(t!IUlwLYE7Qn5Ek`m z5u*MC{)9Yqm~&79l6oug>AdBUaE0AwRU9qptkXy=8UrLt>@Z7d?fyeh*e&PC00kMjR-kd zi;sf$X#BZ)BhPtQ1n=nO-eEYDCie!NXcIc2mkaUaO{2TFTNLWYZPMi)6*|Z1fJC{T z=Vzql`YYpj{AX@&Mk_yF`LW9F&1$o%0up_~i1GuIG2IEEI}v|h#~+<( zFwp{3C&sYWTFh%ESu`k2U}Wtd!+#W`gkq8=9m!MzLu4beJw}lrZ7mq)RCNoGm7rN* zVFni4x4vP4VSW+M_47o)?1uUC5cJ;&n%%%bwTIPhn!j57W*8=ojpoha7)%8Vi8xIX zbs9;!x~B)!t3*=q<+1vP`G(mcQ^GSPgpf{|5JDR2=ggn8VD`K@2=0=pAXrOfVMD|0 z+4CFfX3twNch3Cza~IUj=Tz3xd4V9uO*^XJT|n?HMg-NLzZ>*v+a9pc0`fZoca;suuuzifwk zG}&)Q1nYCajvu*JH`+WR)2!PA?Le7xso_m_xXiw;=Y#A>zY4;%eF$mH)_~Iap-!k< z^M^SRLHhry6YUovycD*WBt(;43c3Zt?vApfWpQ}okGA83OXV0le&nTcyv-v`QM2c- z*>O@idLf)(M+TJ8iFTx4Jz*tuvdK!7+VNWaDNd{u##JFsb)tjH>l;qAU!d^vI+L;i zM@mqWa*iEG#-wTOJWh+byqWk8@u1F*v?030rU%jpnw0Nx(wu;sAv}v$n#xf`O{>S? zu5uzhnY_k?i^_@@v+$V&Y3Ev3yodREL}H%lZPg+-o5DKLI?|Fz-|kkP)7N zpQuLw%ck|GI6hr@d)uC>2`sYsNFOphCjo6hyq|+PRK7Q1m@&~JWL_5AP&(A zWYhHN+{`}81z@92pFRZO$2ibI7NL)GsDmy-f5oA}DTtQ*DH4H-I827886t#&G0Kb# zy6&hE7rngu?5f14Rxau4?pcW*oBk4sm6!vq#EDkjy&XM6on0$&C>3|@au*Zthj{{{ z6nWNH)vy3IJNbDMpG@qtPb`7Sdv{M)|E$>DPt?th{a52qcTZ<*{=6^p=t7J$%FGJs z)9qN>-f!T2b>Ws&r!iKRJB~&i(QdmRCG|KvK(RR?Qk&}Fp>Dt$!V+sqY6XYYBV@K6Qb4~#l(lvUo@O?n!DtfB*p`-f zYm$~!;_%xhmZae9+eFJ9iOj>3gxItOI_uT(ydRh0x> z)7HAAHM^`;`l(qpQXO9mpmIFf7F@Bd#dK3Tl_z?n_um>l zR$G$G;&2r=#nTzMjEMx9vow-id@)v);PcM5aRDHY2WZjpwqi3SkcgAtT*txqyB zrCTjzlWYO5*8-gVlo%{xl}6N(YRTqTSSX8lB3)czrIsgBsU+41KuR+aja18`CLLx$ zoxwyIczla4z=fExXtaeDt%>G*wl&*U&{hI0!B@;$am>(okwF&<7P4Bypfv_fuy`g9 ztD$VbWzD4uTU(>iW06G|dAb0Pa(0=>X~Hnqx`@=W1f1WW!vX~?IElpv$i%|oF`p`A z+ww3SQdAOisgbc4Qi--a=^0`cXw?JUDNMUY#tmOStTk7p6&y>}eL`r${45wj&?{@w z3!@(9-lH*L39v1fqZO^Br4}q;J-K)uD?H@=#}ZT)bHqm<2vjL4J z7ft6vr_||Cu{L?=kUL(TbkU&(9i-7Io8rtV3#9cXVQN?k za$6Xx(7_rzvX@IGs0mJrhLuD{CHab*#nM|72>WBk1 z=c^tL*oRjnREo`}MwV(#51TVQlsy+n>GaHLM2ZY>n!Jf^^s9|OYtx9AkAmMlwSK-AWXo`yO) z62t|JI&qZFM%yt`c^a;SDiAf`Xq^Sc0>c(k!0wOH<0vz(R@t^o$`!2tSTD6!I~rj1 z$LaB8J+0WGk-#!|0p=^acweSq?#JtV&{kU$$kUWB)y0qiu=%g)gtl}R#ulj8m=U*P zOh+RCnA2iv-e<$CPtTH~Sz^7X<^h7h^ zw57IPSZJkX`#c+l_YIw$!mY-(!V1MoX~6crsS{~!zba1E`?O|Ze`(P}tKw|Jx;feK zY#8Hd9-Jc7n?WZ-NfHT+?{uBSWn5aic1cnXI~!(shR&5t=f$Wcp2XguBH9M@C(fX4 zHVpGjon8ahIx{)sA%}}ITAdA}Ju8G)6ebOm&={b$W1N!4W);pmZ1!xOttFn&x_nMR z5W;59(FqgTcpmL!0{!X|%yvH4Rw%ZRo!gpkgefmeqx~$xNNCu|G#Fn{rUhFvA78v! z815X{_qjU0>PU4}xrXp_VCvt}Im7@JBe;af+Z;5x-!^Id!*!(v-c}m>8|L{=U?CG< z%KIL^!(lXRO}5m_Z80#yi=5zQ8BC4h#ddH*Qiab&eY(UBpKXUPfEeGk!;>wu)utPC zKbJb;%_^MezvqOv%oX$v4Zy$532&C+v&nofx5FWi1e#3?6j#_05J*PMoeRx<-;Mx> zgqk-WP*>U!;E)mZb<|g0%`s|HsqG))Rf`{RYyuNR*WMzIyVgXV*9(#-tYQWU;2W7$ zwI`W)4s~Z?YC+@d+1T}Wt63=ItaO&=LXGJRjnb3pLM{_uVP#vfH3tRy;}SG0Qq-@} z=9Jq4sL(kz!jO{!3VOLcfC!C8x-|!L#tj;1+|k7MjsQw&w2*)GYQwxwQPA8FJuT*Y z#TM-I!!TP65U2;C9vIC+lE53YsvW0U@BPEEhp-~64-UubN*S#=^=Xhn69Bq+csLYW zfItN3=&|7tTyiWKKZp1 zk;87k1U2;J7kHM#B`tRX@j|K*Ju<~3Q_pdHy0s~rZ{f}qBD>oCI!OII6QQjwVixU= zg-kDSY!Pj-X#HsV|00LcU{y$olqo@Ua=+miICGL&3Yrbm`lD7CRmGu=isaTIE@bbW z021`o*wID=$mfv}#}%XXG&&4&dwehzDIMYy6moltMuf^4f`*Krp%HpKCMsRw93o&S zFI>ToT8O`D~8kguvgh|op zRu=*Tg=;lZa(h5no>@Bs9XYQf_lhGv1`9t7;Zz%mHJfv>V%%_@#!91K%naLdE+PyN zZqG0YMY9QbS9labPKrmh zc0KVPAqYZ~;qPgrA^t;68k&J!uW^LVDF_`lcdJh8%!sM(VbeTBYPKx| z95hwBP2+Hn9h@?o4P(5$1fB2%5Fj#mhepUQGH9?VEjs|!91$(7@=h;pE?y`IVO66^ zldqp>WU`6KW*dc{Uy~B{d6!1%nL%k967bE1RsT%m6I~EC3$qs|0g5J+&Vw3-SUw=@;!e+M%fZ6!=9(B_wa+p`p{-Gj zB}JDfH=OGQNxj%}K3aVo3BMg&qkyIU?0FxlX5~^4O-l1Jyhid-^AFW;ag9>&zIr0DK zowP1aCet7XRw0#@gA?D4%(Uw5B2M)eK|!ZP>Wd@-(k%Xi$yLt zl*cy}HTp0VE6oYuE*0yl^!|oi0jr}X@(f7}zm7$-duNIZ(V)s0`DM8R-m6N|l%JaW3-~$TghGO8@^tG$4r**oF%2r`cQ~LK8bgyL z=W|rCF0#XU%_HBI>p#=8(OEG>RqL#}x6(y|NWFkP3UK2#% zKp@Q@GDTAwEBE@aUF#N5uGfVT(K|;-2_<{ILjwOOzpuwje!4&?(i_6b9I;Txe#CU# z%PBZbBv|oHK?Dv2rb0J66dG&0Vcw!gI4r9$fOBFRGZ^D&d>wG#_+lOAPK@Q8X!$;t zKA@=U!YD3~!U0*0@tZ?}d@s&tF*{;qI-*buerGtD4M(5Za z@l%e%d!Fd&Qw;di#_{Ep5!V3`QP~r!_j2rkKBx=qT`KTm+tE(TRUSE$EPQV$Bh45g1uV`d;ebcuQ!1{j2H0Z2hyl`?i=JA4V0*e+TJ5u_+ zJDNo>vkq_QUCz{RWH0IE0Os4JM$y z16Y!R+Obq0Od=b9$|$_J!8Dk6BvLehgkc?BzL;dmvm%FT&s~9V2M4 zObh3GFckzkR#2r|6PY&JrRPI}K*tFh44v}G3nprCa^t0BCpAcPd=L#B4|unkmX=+1 z(6Ery`L#d}_QWLd9#1~a!&b`9LaHn$Nb(G?y?bTh9%^x0UbURyf#4?!9^O@eZHONE z19*^;uLp{SmbZYlP=-gFN?sx%87kmOfgD%|#rxdkD$&VlU@yr>kP&n*WLsEx-zpx> zKMBQsV=H*I!2r~EIyiG)lc;CoI)kIMqX}$lXs5D0lcVD~?7_lz2hB3usVL9lSeo(Y znt6E$cDyv6SYhE*0_uhu+Nto)W-82t?P)6}j!Be*V|nc~ojJ#kmcpEp7T`2i+ZCg8 zqwvmUZe{jjcEEM0ox1#+%Q2Usb_R`$e>v|KJyu)dLKbh;qdbd*$RQ0rZYL7-q*z_S z=1n*{aF4k=Dd-M83bP`P;f~=>J%-w033j(0PHH4Xwa-YKtq?g9xW`8>S3uNyyx0&! z)F_Fc`ltmNx-<_ovUP7bu_`_f6FRE=^)AtJsEmD#&fTuJf%%)P_t(!E+ zeXg7wJ@Hmp9nHYSSu4apFP`8dj|_SpK5DGO|Jcm$e)mQDZhLdzz+l5lW7wBj@Jepa zP}g8z-{4yDLX7=(3%$5ofp-PU%I$Y!CioK2nMd|I3?v%Z*lQiw*T2r{>0V{UR<*BN z*;t%gN9VnC_4I96Nup=EDTCsdTiel1r)*ej+j~24xXhqY6+_m|ovWjlm{r@;ZMl(K zg#!;dJLzSK>T?WpkL@R49dX`h;3+faj5(Zql1>;C4f|aO6@wN$nQbv9`gu?TvP-e6 zjF^py5kIGj2ZS*(s!4Lt1`@XV2D~v7js7wsME$6d>*?-YXRYfxh$5Tt(dg|bpC2`+ zpxhg2^D+(dV1*>4*!-)uBa(2^{q6)sbU2w{hiQH~I{DZNa|-G)FAA!PAZK)hICBU0vKo_V4{Mq8<_(KuUquCD+|&b+m72U)9~y zJ;>%cGiu&g9-Vo5rCBow>oVAeBhw97Icnn2Pwjf`LA+*H4tJM^lk0a@OL`?qG%f{nk{)~R$)aU(X<$+phZ85SE+CY0M2cK54#bb zeA?xTs6Eo}G4k_+b9wRQ0B z??_>ZL<yIfGFFX01B_ zXDIC3nkv$;N6Yso9SP`7Sm()_K7Es6)?uxKUvGh~3oSzE*%}eWp|vX{MAQN;iu8qj z4VVM5f|jiX8b6%#A@5SeMDrDyJe!1rZTUA-`0>G;0)mHXE;BV1qJVRK`2N zwewM?8I7g|rf1dTeLmXJDh}1EZI}b1To@61wQ8}H0ivRpsKJdyG|R(i1Q3y|)JU+6 z2k(L9vRQ0BZ%!qa2>l%pOp(i`G0YSsooZHR57B_pAjwVvn|g{A4#GQqlDi=)!P zoSe)}Fn&2WlGG_Ye6_Qwq6~S+nhRKap`+or{15WPQu&LRLjz*OiFwqI+eLyD4mUMY z?o=0BjaYG`ogjR~o|oY$ox!#`K`NYos=$GMTp%&#r#dPb#)*N1*w}#TrHgw?AYCG# z%fxEwJ`NULbK^LOR5hjSB;5#i^7Mb2i8> z(a9X8W5t?wF&2c0T&5G*if+oIiGnK-*~z2kEdbh;B?;Rau}KSaGf^=}$ZG=WGr3l= zn1kd=lh+4Q$>fPx=7$h(4WxBv=bk_swQ-Z}`DcM7)I?)nmr8Fg)$IoZDXC2GA`mx8 z^-T9@AYBU;8trY@l=4I%WqPUFd?C6us*}%zP_|(+HJwt3?uzvHd>~mXy?TUclzLU6 zb~a__6(21fMqvA2WQqL2M@5xXbd)%=5e`C`ACmI*Fk;yN{ZC*#H!h;y3nTnnAepoR zu^b`{i>u1tOHsq4v=qDD(6CY!*c{Q?9oxFeuCTL^UUQJI2UDNGy~37I1`IgFdl)n| z7h)e9N{p=r@}N!GXNHnu zOEq5oQ2M}j08pPBO3nLO@M;ofHh``t;`2j^;p51Pj9nB;L$d`dNQO&&EOf>v52>)w zgSXr0%SK*|YTAQ3sIkpC8SnyI6`Pc}ncCXsn+QHb&8Fe%E-Jj`a%n&}S_kCUqvZSNZ<5R=dzSJ=c@2ID-q{eoWzpDnH-(nt5;*DiDOo#Pss_*7~8Ki z_nw+Nkj`(RsIQoF=p=G3%X3kN-@@N{vMh1l+^W959&50FsLNX2-ZRi;wfA?yBeuGm z4gtsHu;dwZ#2d33@xNhK5e9K=&p0SX)D)rrMv=O^o{Ydl2$vwGpb7x<-cBINIx!;s zOZKfR0I93Yo8-0_XP&Pawk@72?bU0L!b}bGW7Jmjfeosy zhP{gh+A#N2w`i+BDcb5f*;beFH`<~`%Qn|>65n0|@U*v^fw~p-T|#Z0Zp%Ckt=)`v zM)sa6a%Ef!eSZ&smr1?v4TaF)C4rG9okxVDjLbzA+JYSP+lzCzO?-r4SyLKM2d?f$ zhel5+e!>Qv0(6~Pil>3Djc{S0Co448Qd7}Au&Ne&{!vXk@l6OB*l7p$Ah1PHcCJ^H z8!Zf`39O&M&NuOhaV#GD`sqbi`1Y3MinZ(&r6gAMceStE(1#vHhG8!x@ieB3#Iy>> zqT*Fe%gSIeczI(jx)^G0kn`t?v{@%5U#pMwF-5veCnYDVANB>% zLa!tNOFoO`pn(UaErMbchHW^Cw0T(4cNFQeVMz~f!zNrlh>SXc{L7`o}?d0`d-9FSaXm$608M#+M-Cw5H zQPD4U5BO;8Fc6g)%}6t9d`6_a)p}|g>g|wfLVFxTBOlae1nNk#Zk>wuyU;X0i=iwI zOQs1t?Wx8`UugZHovPsgG$9_%74*C&(bqfJk1-OHm^ow7)27*ifioTDZ1eBQu~=?o z(qP8@PK%gdkO|{c82OT^GJ#5RzXv1c8p#%9OrT(usI)&!t*Fu zbA?<XulWA za4Lh8sAU+5TH3pNgT?u7IZh&w;xLLPj?E>-v7fz}+V9nJ^ExF9?=>qd8Ae0hE$svA z9Iaeff%83;R%o*t0SHmBio&!?C2r3Bep7*0s?p<<0n-jlBwsRVj6Az?{oPK|-x_DW zrjoV+MAEAytw`F-x!;T9%)hH#^LrmcY_^%;+S5cWiznxm=CKi(a}7iYz%7xMdq2Nu z->yb|{Q>^2!QZv`qjj}U*!}u!t66M-!Tw1eH79Tq1veq;EN-|U$UVBCXhB38`?X z7H0Kuo#y%m$PsXpFQR2&9c8t?37^o3K}P|MP|ORFLZXqrZbX||=$&zL_0X$5fTe>$ zUJQws=n6a(1WCN4K`f2uvC;|$8o@*CmjmJyv=G}t)_8&XipEJ_`oRkm3H~MzLDP%X zuZ9tX;d@b#$nP}_Y~3qj(VpO;mp}Mp6s}(<4l6MKq;XfiYx&uc>(*bhqGu)3#0gZP-Hl);sxwKy_~kR*sAtkP-F>MN7~I%GH}*= zx{$~IUOFXEXaPIw4iAhC1a@;n;3M63>4hO3)mAJPD)d3h-X~1L?;GD zmK53n0QecqzZ9N&tB93;d<2kG4NE@L7vX?5;pfyo4>Lf|WnP?VmcV(O5Sdo136|Qo zZw16jWH+pj9l+oAGgD7zgP$J~KYRiT28mp#fsl>FTWQxc%a1zqoxoU5Kx>hN@Gfp3 zU##(BNG2BA2^bC1B|&ivJKs^YfYn)nda1^VEgQ747BlP5v&69L?}bDMi|hda{N)-y z6($-1$AZWod_^cha1uTcByyz(gEPT7fQ?@j7#R+3GXwY<=EVyU3WU@d0ePdF5AQ83r{y}TGI&KbFftU@VFvIm%$uO> z7nkrC_81lWfp7K4cp<%Pz`M=nYHVt5LWjK=2U`dOzC9o+2+_p|$UAL5th`%wctuF4 z6D9PMfT$oy7b76=w)x~|1#M7tPWJ>x2Elrm0er8+i#=qhXDzltp`h*yjtzwNumk(& zHaFf|p{@h(P2h-boN*5Qq88jA79WJ~hd>GsG6Hti;Y^H4~bf{+V!+;AH$bNa$G&Mdega2o>SEaFXDJ{5VMH1r0?R zm7WlKpclhQf)n!NAfcBu6!cP<-Y!8uB+3Sr@8#g=-~`b)8m z8w~B@2J-JU-j*zOVPvWMRE_2zf@6cB-R!{rlg2HKO+ll!y%rc5jO=0t@EaPhDhve; z%Xu>-IvCso0QmpW_?7i4cogMZA<@C`9st1qRpVDStKdkLQye~Y zKzx=pWfmM%JdvxL?D#I1h5~1r&r9$u}ll!BKblKI4MzqUKdKh;HZv?Fl$;LVn%Y(@wUb>0*l>z1D3eeA%##m9{uRm*6zEa?Tc=hjeyQYmO4NaQvj zMoVHv0{T*Vx;>PjR3aJ(5_!C=aL_=pyJMY|DCX&dC-@LIzfQ{;LF4$VFalQ^p%_Tw zNe@D1i8z0Pvw@;`Dl9%c1swt@JmW^7afVV8%Hr3-v7zW1JFuT~bBi}pR0%vE7#WJ} zFa!8EHZOn1KA+-?tXD4uMl!JIlI%`NYTknZ{8wxUycuiZ_)`8hfy93`FtP-`2Lt$j zupuz)#^+FJ)0MD)>OTG$7#pY=H#d-9^YG%}$z`l@>P21;iVVk9ynubv!-<``Ey76z z*gpqGZk0kVDyOrti#a;2EWMQ0(3F{6?2l2%q9qGrgv6H$KDYufED-)UI&tlL?qEIh z45ZNm+LTX$<`+?0+nmMDlzs?&Tq(z4X zNH^FV=wcNTO5;Xvco34q0;HR44mw^(L7^qQ*%uLnr7;2QR+|S)2-5X{`uAf`a1fBq z0GQitdK9<9K}p`>4G#ixSb%gFbEKE$aT*|6jdarP*YEbnc+tFUz`Iv)(DaS7vx1{Tz&!|nKgZ#x4+}cVCRgpbL6ITQE^Yvy=kO+SX&o3f-J?zFp;{@bo4j&9%A;Kgs_eF$A>97Ir`wmwQXDf?0xiFML194?Q zl!TPyEn7sL6`)tUIr)Sxdq)3*z{nE74m+T)b-0lav^=V?pwb@(#f2-uVFvCEf;X3@ z#tgQn+BCr47!akz)fM681?tVr3X3B+d6Dy)TLPj2P<^~Wy^UG9QWLIyBav?pi4H)w zS?wEOAcdbW1llCRmluhCS3pz%vX2+2KV?>GLkU)0CGNd}kpakxPhEw?KWBEH%INc% z`#r%DuU;!R7Z0R-PzZuu%Hr@Ua+FCo5^er^C^%XHi+KZ84BF@HMF9N6ZvG^Wv0O?o zqScE*6B@HeLMfCs0upiKAf3lTQ0hcFXxbhRr5H&%jDvKZ2tc9tW<@fnK2L@b$W*lE z&Q=-cMxh{)r`;Ht)+P0--lOGvCOEc4k!S!wf7Z>q?l@-6BMT;71ftO{mj7qmcv_2Xfqn} zt)CYZ7lP|z2JZO|Z_^+NyP>O-<;5uYf}pq%To*HNzoYT?qRwCK9r(VDlQzPbEAfW{VeXBpsV{)NPJit9t@;#vj@Q?0q@qnC6uC6DlQzP^J6zk zgD@Xt;WlrCL{)BYuI5|}5T4n9c88lu^!+gIJH6qhz?chQce$BF2ak^TZf|%gFx8#k z%S`xqYq1fNtOn)D;_L$RzL01ME&Uvn=RgQZd%rDJeV}pwA|zg>;4y9=22yy?gWxL4 z7#a6Np%kT3ap54Hhcy(BVaDj&&yR$}ho#}cKnjm}5L^FX5B0;o5y_#%QpU2K5+J#*1f&iG^}rW`ceJd z0REH4i*q3p8Zv}^Eig6=+Qkp-H#BaX6D~hjPaPw=t~UcC!=PR4fc_tiyQRCgacFhn zVAcm}+gm|#5?F3>re;Z~LuUr=Up3zNz(Ku3{0wcpjcCiEc9gVxSpBJXm zy&HyXzxKOf@hSm1WOiitq9BofDiA&wwlK7+NN1|bvB-OYkrLjG?qvt`=1Q3|$F;P7 zsjuG#$87lUkmzuD7X%Xcc4Z4*7GrdLB49C{BTIslSMPj(l){yA2eAV4LWdDAqT870 zV87#!34_!)0eP{*h&LW_bUKc_lnTBiAc{d{gJBD)GXnB^%*S<}mSM4_Ld|J0(7!A& z(hD2F4B#sqUfxEnV9{uNKOia)RA&U_RSqA}=yW5Q`Kx^qfp88Jz^-MUd@DXK<`fRv zogaF`8H#ohh#3!5qNhw zY|BNJqc_*?c7^)#NFah52tRdb)#fiK>Rwl-ubKXa(*MO3c&=q7&d z4h}()9Dw24;n6!Tyj#nGiBykoZeIFp!;T!TyLt*(lgiERX7ef$U5R z_QxH{0zSb_%N6D)z02h=VS&D-{j!{XFi+C%qi zUqoQW943hMR%HU`Q6#%o4Xv?~{B}UHak2i+)?dO1>@2HHhXWyRYZY(7CZXgm~LB@%ZGCfp=zn7#ME(5b3}+4-cg%os5lwRE`Y5pv{*e5!AmeVFabqP#8$!=l}$?srjVy z!r(FCB&CyaaFEb(J`}u;-im`Tig?X~GX&c^z9dnp)I4BF@Pq&?TF1aP5z+p^1$kmA zn$pSXP)O~h0Hi|Ec`@zeu=vucCKjs z8d^nHiAWSAa=s3dqHRRlsyi)(T@XePk`E6ClK74f0k5GzU7r`N07e2Ag;JDCL_{jivaFXE?QaDKHia?ZQY3dl5%4qxod)uXxE!ejojWPNQOzv0YXyO1>s=Zs!9sx zaD54qVUluykkpMqIP^BSN(=qmk4n)Dlb8mD)NT$!N;EG~iJ|Gar3A?^X*obh>c>Gi zt=R;=9A;0!ZYxDIOkx@oQoADvsij4wg{J7vaEf74vSExRG6?R`H~I!m2eDi%%+D5o+cb7X|$YpiH!JXl)ywIUof!grCl?A$zf2SWBRU0R^8n%WNtA*7a=h|GpL3_9ROmaSbK~*3^k?9_yEFOx zyc4(b{Jaqy!P_BDBAjg>(20}TaF0`}WsG)4p$ySZNZIZG2`9&e9HQT735(P^% zdXvo(Zv;y{LN}L1AC@fhot(@usuvSWS@gAv>dT|}9t1L(bPFph|8%TFG2AOh@KWmkN4@OF#1qf~_ z56w04q`b{Uzt5CWgK!ae5#n>vJ2|k742shF5dsg0J~>_}6~UT8J%G4DXechS8J&Kt zX>2caTK!I0j=EB6+KuX;M9pVmun$a_6#dQwfn>Olrj`r!7Nu-uHT+Vj$af{a1}ENU z6=+k+%^#FSXPz+;3dSpyg2!rzFli?W3Dx(Pt)BpEk~%2E}IcMWgx=k~#X;M3JB8 zDqIaF4W=8X)#TDiAW&Kl@dK(JJv_<}_zoOBJi!n1 z#ltiFfaZx}p63Usg&tnwhX(QRDnB556!XVvHHkDeY4q?0KS-Xp_(Af#%@302AJdG% z>MP1~YK&x5KTvL7fREgrSH03@M`C|Asfen%*i$W@Dr>~HX7PlYPH#A1Pq28df|6+C zv3QzNBRBer$Eh{gWX~#$Oy9MJ-syq#ltQeAyjJpI&lPzKaSAE^qeFU^&a>9ZIH z`6d{&4S7V=2AeXnHLB~O~QF7i#}N`w18GkYkykD zN2a6k#hy#SR24mZvY?yi&>@=}K{us_c0v*zEXIspE(wp&5RsE_kB?4&%dDaOjl#G# zSKvWam@RnV)}74m*ox>I66CL1O+X%B0>}v!HF9&DG~eB7cvG9SUsOZ2RY@B0ZqZw( z_(~czsbK;na>%94qfQeX@RyUE#(`9I9=}4}H?H+bdns#q}G+;L_Odnw`z_ChWrCi-W+~ zG}=9fb{mTx+u6KK%9P^c&C~hMlO+2hE!_4R#-ew2Hm{c?NpZZnk7mE?b}{eKQt#^R zM2?t@)79|&B0RH;`LL!IjaOqc79I65^I1uj=;>xsooCkzETBiGgEP^ zKsFM2;x%?zcdg%G+m8&zMjA!zJDWYkXb|i|YU~~y5azT}LvuonMJG-(@0=(sIEg*D zy3j&3wg~P=DSq{dAKlWMs0;=iu7o%1OhiA#(w{dnfD2{#M-WobtRadt#4*U1aUK4<9)CCBkIn**&{rC>;zI}cwg(+{O&{8T7p;N5H2-PKqDGTn zZNu5u2-zPW0HI^7F#*ov1HAZvJl60&V_8d~kG_6O>Qtx{UdU(yr)nqh3F9YBeE#@A zw0d3Es@nEho%rC!OnkiuCuGadZp@rf+dkvdwVm|+o+pVI-|*-p+F(jhJ!M1s0qKhy zI^xp`(Tisj0`OV0aaltPQ`FP3+ems}Wcg(?o>NXj{zwS%%&6PM4$C^}C;Y7$Z*Iif z7wJ0b2J=wP1EKJQy<+0zHQo^={AC`(`8MIJW@96*$pr&0wCR3l=9ZzX!wBnbm+K!n zBiLsq5$$Xt?|6mWkdKMkLGw&QfJ4G{{JHt!A&YW;@9EKN*(P19Dt= z0xn4@cedg{`<|k$52Y1Z0PW!s;%>va=>$wyFS4yhP#0q!i)0H4C#pdGOj52uM>%ttGatv0;k*ls1HyE`s8Cz{Fb%f@%r-3W-FYP3JO!r%nrEeMhI? zE`pZgXl86u7n~1iV60O(=(Hf#72I@M5Nj(s{TUO6=kzK@^)aS76rK6r_)JZ*eXu=` zAsVH?_J{AQ3=Q!7Oax)JFAG|hE9U$%fHQ=Nv>hM|8nb^%A&U=QwVw7h0uPga87Yf$ z*P2Y}zWqQExrm;+`um4ANNU)9@1UlRWKD8?J5mtj z%|=e|CgFFF;>+<^5SsueH~AEWQWGsXaf?b_go~R(E8+Q0ED`r`MQEL(Q9ZfbJOd~v z!BxI2kI$+ooZ!X*?-r+(+UP(-(!oVMh5qGx#Hd~ z(qtBXM!3qWYO<+DaT_CI6fp&(eJF@KCt zH?M+7Cx4_?6%>T+#=Ndy$^=)FC_oi1<%1`OZB-D9yj0eptAV{LQmKTRL{A?+&DGyk zpu^HcAlf~>*r&*17yN=`sv_y?)Pr}mO~9Q@tR~qKcVrb9dt$M|8HX6vb1TdrBfC$1 zWLt_-4IGg!H}rdsGw%V|lT~%7L>s&M2fCbkD+iQ#nP_qQpv*Js?!X{CRYEi@stoq` zNG+q%4t9VzsbXQU?Hy~oh(wT25dqEJgBsgZSD-8zc*coUQc4qwxdLU&fb}wsa*jx- zwkEZ@r+r{8y}{-rKMRVKd9rQi%j3+)Od5F59Qa50?+S{ zTH&jI(R8HDT-L#!0c^RV88B^0K#NL~;N?z4I*FG|nzPv@wB=@n6HaGd+TmXm;Sh_1 z6I6k%<}bv=FwJZi(O7!K2u?=T#%g0jy#w8A=o7^~eZ6b&{YW(yjA5AAA$S;%-|_(* z@zBYmlx_atB+dMYxKj|f#PR9^=Iv-1()2-doaaulaOaQ%1pPWbuSVY?k3%}~O?lAR zLh$#PAw_+|0^(XN1;}Fau+^Nxs}(kj_(U^EYhw+wV>4s*bq#ay1g15PAVoUPu{GY3 zvT%?QDC_4D!CFB;D#xJ^i4=W@=__mqKOJCk8q*~&+X6)T!iZ449`4mnVE%5BX zK^PG6EUm>Fl;ybs8WeG!Lf$u4PkJ5H8HE<0_Ql0!6pmpI>9Gtei~wIf1BJx(nTKI+ z5>cdw1p1C_8{VTtMu2#bWP-&xF>d2)Ah{03^gq*58B(xVLQs#twZ${W$fHq&wVA^8c9o68N~T>hAY6V_UXN zB99G8Ad#OHJ4i-OB-`EgzK90);}qLRywm3g7>K?(&v-BiRuDz6M5q_ug~QJ$F0z+;h)8 zx3quG&=lTzV~H% z8yL#s6Z=HdHt5I}Q9i{`LKWq8put`n!^7?-yQ2kv0x~G_K;T_E6HF}gu)a=!GoxpD z@}L)M*#ly#=mT;0=yH}JDqh$!;7gVGfG)AK1S^(u%VMiHK1MdU2!3-hHq`j%CEg5P z>KmJ$o%Cmi@lv>c;Cy^~3i?NgKto{Qej6SJq}OcUZ{6p;6gK1T@gm+B$EK}scxrT_ zGV9^f*Wb9g=`J!^?br;2-oII(wO|&Wg(rFu8`bEV3nYQv-8cwPMRCBdVfo1`M&S z@nkhQB8zjYcR?IVEzce%PTS0AZ)ZPkYwkb?UobOT#P~-} z4F-hmM40QBIE5LJ9oU~J-mlCnlMCB!p>X?x7?LQu5I|VNu*~KQWwSbFp@hC-2zSeR z__9J_kc-kbA#s<*iTBmIFUO0UNP$e?xVvqNTCWi=LdibWgj`zsb6}L*KMUj959#Hw z4_{{xQo0V8)pFB0GfJiwPJ>AhS_~GX!|H$3lJ%lhjI0N%Y&;2xH-Z3!mrbiuvUzwn zE_=A++*h53!Up-2WG*48Kp$4msZPir!eIw&+b^$9>gw$2rQ3o2>ZH#7op^wikLL|k zCmv)ENQ(+Yz8WH5Ku2z8yTeXFXJ% zm@kxy-5&20AFfV>X1AF2=*#H2)ro_JUL1a5>^!eJ4XK!n&)UPYHAX(#;#fjDs6bWW(-2IugLiJntATPQYzQ&= z=!@q?)yc@O(=mFkN=ipPazmJYJAi+p8XyObe+5#JeX=^W8xBvh*i>K+q7GMw0I(k_ zLukQ$ExgM}?ll`q?7{|Cr=X7)W=5mXA;?IA;~t+G4do5N1+hF)aGW0eQqHsS7Yl2Z z3^6x5a-~`7Lk9yhv(qmct&GhnnL*@)_X!^SQF20J#!$9XB`z!+pB^7|nlrD&?;X&m zVIM;4{&@(9J`^CYb=-3s3xDEn$?)a@|3j^vPvXy~@cT4=JV!qVTP5t+aAT?mzFT_f zpB8&Xku;>u%E*&)`c&={ZL`tJ%xq-@N|{j{V2q99umCjK7L+rTy96)(EYXHF(VVIl zRkd_Ji?(?jzdzG$BzCk=d<_;v0J~rY5_C7N>UkryqkzbQa4)QS%ih?;^zc076~=%Q zz>fz++yxxXIPP}F2@9iA1P37uW5+*O_C!J9xH~0Alo-NGXazU|p)AS(r%|`fn zj?IN@XSo7|Bg$&AfT)4R2+{3&B3g z_s5q8z(&fq*dwL3h|Jt#-%A%O5cU${TOqYopt-_D7p*pWp+yoQkrh=Jgtza(zmO(} z3CMe_rGv1L?4yDO_f=XJOV^Cgj~pAUT)i+pTY>EfH;J)Gp1*?Wi4@){mDVlCbAV9xRsq8oNLC$*NH>ZiArS# z9U9*lv#DMZ>?1^<2hjv4m?f}jrRTy5EAEdugGfUmLBtM8$JwkMU{MiWa7o-Ye`KZHGZAYAnk7K-a!TA z#g^k{#ci88UL2kso`f!M7VXNV*|Ujc7YJ_+!>}dqs>b^}V!TfkSQS(`twk zFG^ZWfG-tSS@IX)LO04y??z_@)7(Y2YGCOTVG3snQC~tT^k|akY zBMPHARf0r1y+T&`bb6INhLDINj@isPhqBvrcb{1d6emvRZpYnoT5%{G^+w0tdqy!> z-gU-H*I)FuI`XsdLfK>fBFi zXgLVh$-T4Fle|RSQbMRdTb=TPv*i9^_^mX zYD&OnCoNKR%DDv8fQY5%Kwy|OIkN!s(_uK1p0yG*#{F%;Qfu6s%(1MeYOsS6sgd(V zRO>JC`zzhXo49a^XuyNXZ7`_a34_|pI02(Fp)A*6z`O(BzMGt}Odvi4sZKVB1_ceo zK5kC9me0Ys@XIXrU=SMp;}=2UMn0REgU>9Ojb0{=ahSAC>>`Ga+}47 zKix19B#uWzFse2s*h!2o;2_GD^S&w=&B#emQ2CGP<0Wd+dpe<(&uhuI45MB+Wiz%5 zp9;Z&o%dr?A0tQ^zX2elltV zb5i(ENocTb&*hiERKPG$p|j5t7(bP)@Eq84m1o5k=8 z0DoBv5bsj2ls;FkCwW00KGy38D48w4(WfG z!SwW4#U{XSOUd9FfY_k-(>PC6ds*Nwv(_^EumUJZKEQ=D_hrHFQsAlyIl2TFBy8J= z_f|t_Bb=56H5+(@%I3abK`Jc%0F7xtR~XlW)er_35j?Dt_gh;WRIyvx<^Yk5GJ-u) z8_Zw}LBCT$mpdlbw02RkipA3eMG^keu$5{Ps9^V z&d?D4Oc(~u7M}~B3#Z4&|6jxt6AJiJHH=Zwg~<3y7)q0ofb8$WV61MS`wAiZMop*$ zl>Zn8wk0Q!_?@Ky6A*tt49}Lcv?c)mC=9F?yDv z7ByuMvxE}pS5ctO!#V<^_Lc&xf)D!>kwjyW9W!8eC8 zl!i)F6>He?v^Mb~DYu2daE3TEAZ$wLRk9j^UQ-2Ro7dtDpzjJn%W6msy)1{cE5YSW zzF9-G_i8{|8$ur&@HJYW%o5`MYKU-SKNv|a4B%A*D7#rxu}7J0TO7b10(VbxJ@yl- zsfCLCY14ap7W8l!Q}z({63?Yw%)8W8EO40+^0@^a-#j%8UDh$d(5@MC!;Iu7_ zb8AD0M->EDnZ)$>sr2jtHYZM1AaLnMTg)DZ%0ey|6VV510fyV|Bh^5Bv(lGE8_H&j z5kretpD}7G^Y;7T@c4Z1wDi#@Y9NwsI59MB(p}RF^M#QSs$X~?)`+O_Bsl!5F7RL{ zH2S=My9D_ml0UZ;hFWy%{3l22UsRW*js{33Kw_Z2=Pv+BJH#JylcBBGbsmHbG-3(JNb1g?=_BLz`L%_Ua!$H@@F z+W)gUO^s(7hY7?lk|8ARS5;{eef^4H711PxPOjjnyEDg6EsME1&102|4_5ZJC9+Wxh6TCFt+c9bNmyP}8w(bl(mZa&PpUE#v)`4J-HgI; zZc==25-^rStgn%h2z$SR4R3Cu4Wt&Jco7dK6;Tb^wkSF-I8>0C_;9UUwguzmJW@M{ zk+ULIiWT_IE6^e&J}F_0@HhuM4ysulrCb;F#X0Qi$bAB=+T+KFB3Fo~6ctngb!QD+?MxCw+0zI`dyO zDD_)ZK=jjmn&8~eKA{uEwwgJ3-e?V}*$Y225Zswo+gcOk*FvtaIuug!#YTmje9?AE z{cl)F;`JpF5Xb!???m9>|4_MQVWL#QDqj($qmg}HAz69=;zQxk4Ug3*>QyTPO|0q; z=;5e_ht}(Moo4ptVI`ebj`2)4e)J-pd1nYO`4K8n7{s%#qH;5bGy?g?m6P+`JO-dT z57xEVu6GXN-hfo|p{hi%7cH*8O*Mho;j1H4v6El}zFU_brr5LE6f{oB$Ymfm9 zBQ}9v0@P(01+1<&@f};$Sz_!3C1{}jlA$NLM0~;w`IG%`x2a<=&P< z?BqLi989U;j^&6lqi^wsG4C${Cpbc*2k%mRG3MDO1}`3%d{7F;^5LdQ?R@vG63x4) z!=cdkB6@hfddnGU4tqmJU3~ObHjr9H9%#$i{r9g@>NlMzGLQOZ>I175?dgPuh=mFD zMvViaVHk}K66Q?-3|tBvsm#V8!;yr45Hw?FR#=#)S_{>YZ>GF?6}EhIN}vvuyl{Z& z52@N(5pvFBje{Uz-lAaGmJ4&L0Kljq(;rr)8zN=18nnt=S1oo=4`MF^GX`CaSeQ88 zwhFfsXih{WJBAcYprz@jr^Du!cu-gRjhbXxm|!bsBdqxxpVyrkVRrO9|Djmw*%*fK z$^k*Rn1hxuBAZJrNYMR2fLOAt3s}}oltvLsWRi61^uJ@{ViDUS&RWoS!srg|v z`>Z!}+ zzOK_K5m;5RUi=FAez~;y%KCW>C4Gw$%8F{vjCB+@n`q=okwF<8CLI0i>s;rZ2M|@g zC73;caq+}U05+rq7dka8?6t02ru-TxtERy62k%abf;-yM5+oGCLc%UovH7p zBp1=@YT#Z*=Ico7XNSUf!=CQWqvsXeSP;s8?`Qtn$;pV9gXNDYerg%p|2*}4-u>}a&Z6ZMf^Rix}R zq?~Dr4pfXRWnaqu#OhS*z4fLPS%#bzL%10|0s7aX9%e-DFvXu~;L#MU=-DQWrg*&! zYR@zdMuX~S`mB&~EbA+Yd2EJ#(wo^6T^YXVsM`Dyn*ZC6B;G)%oC?f!gqQ|qm33~h3;P*}qT+c=gr z{Bkv^0hs}7_z9>HZZ2Hh`CE+juj2PL{Ag>lSs(fK`4ETaOM)Gno1T^_$Rlm@avV7~ zKf5q8?=c1z`8vcTZ|mH|F@J1)c5YrSAYU8ghs2LVS6Kc(7u&F7Fg>O*KdrEMQTaLr zM{AwKEs-*+&{zDa%A&%4qpP#=nGKDzMg6<&5=#hIF_r^EvRCK~y}7|sxn>3c-fRG| zN$>3LYdJnV+eVt(#%M*+>cOBDH{216``Ml%Lg7?MajQTQ^*%6hdf zi|wOnlAF*8Xn}||iC%}sWqJjg%k%cQ-`R^TTFcx7oyts1w(+N_4xv?)Ag$F<5+l;& zx9R(IJyp)CWMpq4x)^PDM`@FRBn^4eWX0Myxpk6A_ybLX5FRSFMS! ztoHgcyh1J&Q}6~WuYpMQTD=&e1mH-|#_*WYE!k=oXNqNI!Z-EZKZ-P^s(*MMg+^qg zhPK|Jaw7oY5(Ccw?t5IUQMvvrR7oeuvF5L~EGxpww$3pHu6Y!<`O`4&n%u0-J5NpG z^Ch>iLUOndncOG9yKN|+MF(6 zbgFG59Z}8c6p(aWoYj57lvc&-5-?*7C}tNSoZW$x^K?JQXo(EIF9oHA7^4h7v~U7z zSvJ8-8GF&&oVN=CXhb%MRQuJ1%#q6t%6=f!|w6Df$R-3J!Xq6)E_`BC7 zg04m-z7eYgTS1zxddUhmP^?ST5ZRj4=DOvQlFaZ)>W;`5`X@tVf2WohLY$8ViVl%mRxwiE!b3K8{t;({Dp=wS1MYKz5EQ;YO#QMYZf{X%9d<5hq$&TbD zxuFI1*9pXGqbKS3&>)nx{6xu?x%nj0`SQBx&{RV3vLxDxqzCX4BZD>7Q0Cv?flo#n z`L?=~-DO2KS+5PU*Az=Ag50IxmKQ*@D7-Jav)hVjTv$Dh5ke=(-GRY7qvq#7p%gj!)D z9rg~BJtSAu+Hc8>2vHJSzd|V*LqI2`cqLLS0cAEYx_3bEc_HXnpsOKjw_s!# zd?-@SWrVO$+sDY3l*mXHH|n9Dk0hQ9xz(sou%9C(#=7^Ds@j%!CJG_JcKXu_Tniwm zyOCP#f>En!l7@e{?W$WMX)tjxFjqBnjdEkv{bHSxG^Bq|Y)ff(SaB8_*-(Btgt#W- z4)&84Df#bLb>8Kfxe*4dNeQv@Zy9t+d(5EVK$G@uok5M07)Q4mz|#NO0GPm~U0 zOg$v_#kZH=kCuhI2=pJGC79CQkxuDBJ!B(lJcU@~d?m@Zc?P~(pQnIfkaNK3^9*cg zmH9VKPkfn4s3xYRT4&5|#f%groR3Iyl0qvIDQc_5c4b*oh}8-io>(X}oMafK zty-`!g~7rY%w*%}qtFmkqq?+xN&!~8=1Ez?1;^<_VM%LQEn4E)V{QAZXxpC5auzDF zYPB(G`yx#pZbMeX(3Z5K84RK78t{{A{>Y;C@|0>?txaBLRSS1RjCPe2Sx7?bT0-i{ z5iLs7-)782C3IHhpZ&n*8@r3D8w4|b5@ zKAl0hD>InVY|dJgB(+|goclHQxI#oP305d+snuCkgSfg?6NXVl1TizWHs`AWzBMr( zgSZy4v61>nsyjCbYr2zCkdM^Rk2BtC$KM^noG8w;D8DzYT0!21Gcs|6V_)eYB1KGkRGQup1_z4odI zktsjYI^@)mR@vtnxGIp-dV{HSkJj zxiqeXF=|VXHv!Ah+{GXj0!%%l4`e; zflF-9Xkxs2(MDDX;xJ1!a@BZDXk}^GrOBw>%C$%`y%A~UZ^v7?wy0+4S#khJYPa0D zjm<>vCQKpGp%|aFt-tk^ir$*~!3pXi8;kzTv$ zVt{6Nh)5hE*aX65)^55mRE?JVscks{=8O)ha*ad)?*4NNC@qJXVx_l;3}Y5?Wce?f zMcQx4EL`A`<-cu~<-|GD5=s47yP;z(Vvtn#@AAAh%+W$!uoTMhtg0^ZWH^;6rMmVp z!Ue!USC^SUcoNDmpQ5SRMfjzh?f45LvqZaL*iHMBmAPYAPS0I{$H(bjNm&3Vy~RMg z-Eam2eyV(3fo^3h_xB+G>-ha2Z7X-NXb|C#3Qr!3C9;GM6#8+`1cu=7h|1+fW@})< z3)wiy$3Og`5*T*p1=yDhA{zD8gr10_u7P#33Tq8OxMyVXW&ece#Z^w)_Vdonw8?m4 zw1;xen4GG*F~T~0dHn$J{h*8`UA-jy_A2;U!prrqg!T;4A=YdmI73LN==ZtNve`9- zgSdC7Vb~b(vQ)SR*BHPN@jpejT!6ric;>hyk*#X~pD?Q@kct-1q92tq=-o6RH(th4 zxWNz~ParegibCe1xKT*LBz-EWLZ|{1`+xUK3B<)QFM|^F{k_E^gIf^zgFWbwdJ>-ltivpA0^R!5Nw+~2miDG8k{HV+tnU@-_+3wkiAVu}c6 z`-#m49|Y#6VYnI`za$lop}{9$z(n`ZEwB`m5x~@F1yzgxQqZcQQ1aDLYZ$8;V$2IS zA`85LRTyJAbFwzX@2vvsrRH&!X9r%Q9rrg<5H5QTq6gI2Q#S=8eW8j@Dhy5V`Z`Vz z4qX|r>{2$N?F8He!0cd6X%xwS#Ywhm4Y>itCvC;FE2tKBxtJihXxK=%15qB27bv=^y5-=z~>AFVSbuC>(Dd0M4%)keD<@osY0^NKf1{Zd@UsYG zR}|jirdmIf63o82_;B(><4T0Ay-wy9l(n`Qm=R@1my>xXNNPmk&qXgf;+OQB`1%L@ zz9s$Y;*DasK2g^}Jtwspk8PfhYl8ZHI{kLB4>yxt*+H-QKu7!e+s|)rcH9f9fd)FC zQy7$24BHbDb9p4fOF&0;TGvnx??d9=fdbwW1qQ`@hSR>FrGa-S;Jr~`yqJ{3E17ZN zoeKCZE}(OConRbjq3|lN3`3;&UG6;YYMI9(IIHdR2OpLsEO62L>x79%Li3vd9QdVC zk0va6i`{WQuTaD;!%K0|ILG}$HE2*6d{8pe(pTWsa}8e+Jc;i$5Jge~J(#k|^c`Az zE1z#XsHUlU%>ifnlBEPcjeK?xZW@)FGI6x|f#NgrAh8{Ww;Sxi7GH`E>WkX(C z`)(`;uIA?HK!W`qftKetKX{s4h0jmVkB`CkD6i|4r&S1UhlG{2RXRub?o6vE$@?o1 z)5k}24j_$W@}Q!{0{|+g3h3+%@TAVeSo=`8RJ`ASt90~yx>V_HGw_0>S*I#nhQ(4ai|hGav})GA65|N1cT zrkzcRC)eC~O@xC$jfk4XCUu7?@8oJ&-78@V)X1tyhN}JTjiIjFKYkp3al<1liB?XM z2#_iWZ?3d?@WnkcTbYEHB0G?wpy|i@mU1prtK5moI`bG2O4bQWJ#x?be&Ag0p0&=Jj~S@M-Jss&h9~1{bEL;4|52 zaPSR%=e14)V!QanI^G{|sM}D{ZW$R$ZKx=Z%lJ-jKx-c##)}$G!wRPuIQnohe}*Ui zQtNL?0a1QhaVEhJ?;7;kCneaPQe{-;W!N4ZpFdW>+vnHN3$T=jJT`@{_=3bV3RQDn z7m+#7b%#@}|BzY~w>)q|4A1S0%z?M6t`Yx^PUB}V3@Dl@R~=JXKE=cO>pP`D%6qc# z;X!HajjsEmRO_Fm7quU2C4JzM`pj|iY3mK1mvwPhc0xIhvJT<-9)w&H4xGcmO}vVw zR2gy!!qWcTb>~y9H>_L~nXA}2$hQDt;^k~cd7KvActhP>^o4LK?x&s1nv|3=hg-fQ zc=3H^{+QF~Ny+eAA9|^U&!j;T#Fbvd^~_cDM)gb#uE`?!F8rn3%0Wpk!3wJx(V)!g{UXi^zw5r-w2=hwM6L6p6@UeyOnVtI&l zSyUs`$=oNcraXe==?(v+81~{? zU!FWt1AiV56c5j;N04Or=cif8IeKrz=p#KC+?Wa&(~@lfU9C_%nRC+a{cdU-#6&d+ zrsij-CuD}A6OO0z_pg>wy#@U%|Dng6Z{yED;rGw@@!oTj@*2p;1zI4;cZyP3yywCj zbQe9LR0$vQid9zx5N`PJ+CUYg2sPaTNv~8!+)ff^dId@mBQBTt-ilzPyYoFzo4`eq z2)p~^kdR0d0sG>B;;K0Y+95b|anNe_%dvdhCEs)6`MPp>J`ipnhL7diA-OJ(=Yre0 z@N@C8Ogkmhovw0j)D1_1^A)`NbOlcf6l0->bnIT0cQTcrMLi7-jFAj#X$*3yaGWgZ z0+FP?A1R#UZ+xUC2@v;`2cFXW^envDLY*SC8jp(!1Zs>YMrI7XqCHZ^a@F}@ouUD5 z3*o*WLeA8@b(MLXEm@uxis?Lc%`|QB#ObpvWM?7+1Jz4w;%*Ymc8d)yKz=DeiwI-DaHqOp|T9_kShTks=DucX%S7SqP}H7J7N@VsKUTx@u%Bt0zKLPsQakJJgt0RqE`?vaGasZG+n-7diy z737WY0Ml}NB$NGAZIZSL%kHtS@WtabxAXY zEwq;NUHthTe*c1>yys-a0=}V}Iv4WRGv_LkahXATqETm2FqC_C`wK3E*&`=mBO%K8Cn0dJ> zQsvl8Ii1&2wpBoCv5U563AnKE$Kc))LKr3!LDY4h-e6Ggxp&cS6-*$>^2RID|lr*)LX= zXa~(nR3N?uMOE$&Im}fwMiJXO#n?qcgK5yJdc{gj;5{75->V`-bTrV9U=KPl3{wfb z(84|N6qF{z6B3LPVc>1oaOW1}Rm>oYKsD}%;g~PlofehZ1lJ${BiZIm>Tiq3pf_!_ zJYi}e#IP%RKVKiL-AW@HV#9cnS*EZ~Sa#~L?f*X10PvtIBTBve7(uMLQWO9M1Z|+` z`%X=CWYe_Ri3rD;y&k|vIjsg)qwyP(msaWE{++t3nL7VcKk-HFP= zbCt=NW3x&azB**!30e3-U|LQVw%JdWFkG}PW@X&Q`&h*-XW*~Mu|I(P`mgx?P|LAR z;-peu3{IT~A$AwsC!0rx%xSrCq-;-g(Z(^o-!?hL+`UBRggl~B+!M+pC#t@<;>Vk( z-AZQ|IV=@@<=%LfYTSbQ*&#T2QKK48$le!%!vmVdYOoz1rq4wouW1UjL{@d?5iZ1)#E6HBX?>(>vdJs?M;B87>Q9R&8c7*2vHq${;PVL|4jt z#a*EcY?3A5_mHCQ5PYOLk)AL8m7tp=TFuoy3#h zhYFYG5Sf#DbTAI?i4^mI=xJm)Ff+z$ZJ=Uj52Xzy(=$&BA%$Wa)Z9xI`GhXA``GZ* z(Ml1ARMVrjXg;bYF~3W5MEXLS#iCuhHSS%ZTEi?nzjMc^8L(W7+=YWN4hOB__?=6Y z!Twtfhkwd9gcgbaT}Hu>1-NQ;xrZoe9I~P%H5KA z9Su7F(<$6uwuE#eR%B^YA-dQcGX-06yjHRk;%T zB78l_ai(S_{IS_eWp;jAcZSlz-Y9tRC+LH4##pvf)d@MT5a|8zWi{|r2Pe>R@IKWAk+)wC*|+E|}Xd8^azd7%t&wY@*jCp^8Kj@x1q z#PEY}Ptk^x7Jk<3*-1TbO*-xTSlZ-!_zOaoZ`%`k-XZa!1$4{!|>4tgOk?!(}{Ub=bb@g+9Eas2^!D2=$mQxx;P}v>ZXrZ5`ce`c5iT_ z(EjYg6d@J5eIHx_kMmK8tNrmgA3NsxYo!eh>G8IFVukyfSWae?NugR_7ZT6-_LaB* z5G~SYUkuM4mG-aBCf)G0m9VslWy5ir%BJ&dX7>@zzB^XoK*2)G=+d3m_*u-o&6zt= zlMA74kXRQT`9IFSudQ+)iRYccTH`q3ywa7J;2iTo6*ZoHchghm%Cyk)+gh*gChU3>(yMGbn z)ic`;`md!&rb7esZp;CH>AwMv(+%9%t1(IFG_Z2-}Mddx2l0K8i!$e&6$DeuYrTgDwgo!2KT$wS=m&IA_p_J zI_o|4;3l`Mb$?i$6_XJ!N@2+`2t>@#C`^}yD@vO~wD||ux=&PN3ypByRAz*Kf35qA z0G>+?XAv5f_<~wW5X3(A6!+IL@JX1)O@)*pdgER3ut zYIVUy_cXfih~`@y#}Z_-shW+S2yF~^dg8-|b5WunII6uXopW*j&{CGwW**lOwtAx+pD*=y_M^L|5OQeg}dA>jgNzn=El#lt!?K? z5Bcno8y&a#w9IEyw(n+Vr)M2^gOS+_m(xbpgtGYpjIC)SYh!YGT%@L%xQUU7T#qj% z(zFsc3CQX5`i*Q3vOP3XH%VQ%FeayWuvWK`+%C{eykVt{!fU0tXvt?$orYDBSialp zG}PNT>{>!seVm5XHU)LS#>8n@6U1~4l@2=%4MD`h5OQXI_}Q1*{f(( z=fCjhm-ziRejK+?@i9r~`BuxEf6Q~-(|jLY+ufh*^7V~8@51&S?d`jFIc_79I=gb7 z?~hhSCgx@;BQ3r^H9dc9cKRAfnSs3w5Gw=EW zCcc=c42Bm%s4I#9M`Yq!70KbWu zfrAVXD+7lZP#76J%%G_sBc5v`O!nv57=zo77JdmGjImg zEkRU(?^P11>q}&}+6dxe%xyNtV8WAiK+a47qT3}-)tR~Okg(L5K|E5|ohNTSc8r|p zP6-ON48Bf+M9luce!YZ)Ix`Lr%K@LnSuFPiaR$}BK~#Y6K8e(ICbBo!2;yQ4 z9*qNff*4Hq+n4|mUWx;hsxx!FQNmJZ1|MXQ{Px%}a;G;-P^e|_Aqf&aLvN9gLe22Q z5)SIjxVHvz7R%d$ID_gBgQx)CBND0WOk{7j5yZt9Jk|zsO`RF@4jU67dZ)yxIuqty z5|%nM_{R*A2Om4Oh~T3V6lxj7`)o)hp$xrOLJBp*e#nmqi>xdt!SVK}_6rs}`o_#*a=_M!mUXI3jS0 z`(23qoAH#XP##qXF!nN2o>^?xod`J{9QX+-~pkfg_qxU?euZ^2wtce zb)MJ0I5yTE`EOxjqSd?P67RxYcm|t*8m_%P3TfbWw#VV3kOpr1&T6kNa7+ZFg)B+IGkG8f_~LT1|>-P)SUv z4pUpbT2&nzlQbYDJv%Ht9lHX0I(8+{lU$rew@0wu}umn76ykrxUBPzDt#=deoMx>+&8|YE^fuQs0kKcWjTBs5x2>ybB zMENZqlaITHbe3h6j)Q}R@!=`Obwi93ER1~jdi>RVcTGY8HuH(`S&%b#e9FIOdiE-R zV*H5j9T~pr%C7Q-?NCA-uS`tOT-i5Gk7q|%xcv_`b?}0?Q-@!QKhX6wIT-e!Lzo<& zY8h@jLhd-+dQr=f)=Tm4v+*y6)h00SAn}q&BAphcwxn?X2Fe;y3Q+;l=KI66;0Fgq zh`g2`h}!0Lw92bznBA9pDv=Kz3e>X#sKk8832NF*L2@*0&!xk$fVu$Tm|Gryj*bPp|`pB}N?j5@2==p(F%Dr`m$UuTc4=#;1yyJhCtr3FEL( zX-WlyLJT!1@0#5v^}wHGJ*bd)s>W^+d|{4~g6REMpPx~!>8wD#SK_xyk7dXJ>^y4y zv=oqbt`xejP&t;L=kYFJOI9_UZ5Xu6D4J@Cc^%4qs#+)W*L9{8D16ZXO4lo+->7*R zuo_+jLdspJfm6(tpw>lfM5BvvNSTXJRFA78upJi_E`l-DEdi|7mI0%%RXMe;)>MX) z;tfy|is`iIX;-74*Wd>a4#K<6VRwV>VxiElj9WH>6?rgj*@Vg1ydv!uLjb*))@4Y1 z?H$k=gyM7g-h!Wp8xS8i{=AkQ+rb3xaYFzlyf@!6)plg!s=4tOQuaoPiWlwtDgMfD4vqrWoJ_GkHYD@*7Wd zEHA%iC60Db6>x#b;fZh!41SFF5Py+Sc#eoY%r~TuKx!?1!P@I`PSwmXu6vX%Ogg;+ z%QB8UZ*=mHxs6v~;%>=225Yj%_%GtWO#6@99C8~?8}#z?a=h{Y^kW-Z-@u7xlHeZ{ zepV)DD*oh*lX)gwwm1@E7965yo(|_JXWJM#D|-x^84qQA2nI8$5UTO1v1zBhX?k+p zKf=3xKF5fYxl{H&jGbDTR4H%{!`QUIGL|N3Dz0AQu!x7^)~4=A@n~qHqcVv9msf~S zLS0K4fBIDLUN^%=*!tyE8vnXY<~@5S^D$(BjnIE+qJ>D9@Jt?&_ja7jha`RLtJBE% z%(^B#53XL~aWX$wDQ`)qflj}X?qtqoYq7=M)^Dr`8p2_Fg_}V5y=vHS8)(lvAYewK zr4e-GN=DjN(2@0w9Ge(E3eQ06(C>BUt`RUb|At3L;i2ZO7_fAA14uffax(wHc4~4m zPXVzTn)v3M@}_ep2et5{ry$E|_??a)WhqbiQP&WB5qnOm8Jp0TaauE?7e0MUmn$Ks zrGwiV`3AeVN!SHp;6$}}dAYA=5J}VYma6{UcF8oXMy{GaHahE1RHnR3F7^x$(T~=! z1=*1bh&<>Pi!_EYF$bPtLSe=?%vL<6BLqmnqr>yV-m`Rx=2>Z7pzM}j9V^O*uNzhw zI6yHFM~jr_o`Rwb)V5kBP?cvI5p@BJR>XNNp;+5yBpLk&7jq7bj0{9iXSq{yK`7;^ z9*D9Z3Y)De@;z+x4V4CoS^C1fRuO8Z=}Fr#@mjXlObK<;yJ7`#{ZWPSZ@k-03&o2H zA^fsM2nARVoE?^mxWuE|3-*y}l)!dr6jm*BGs7blmFBqrZgb+^Pp-dK*7@1t@rhVo ztV?Py^+Gi(mXoortP*oY#)`?JO2nF;gEN1j+KOD1MY#as|M<_^J@W)wJO2-5IaLeG z)<1B;>Hfe8bGnazzR;DZ^%0FgjH0l?;POC-dJxLwa?U^9Zg@ z{ZmS@XTh%<&B^>7(%?i_lGy57|1e$8=CI3&T6`sjkBK>%XMts>vA(QyxgNECBh5aM z{Sd5LC$IMT=7^K|jno7|*kg)e1zR14l&L>;-Ne}fgCI8I=FA7{rYFP3PmFc16ob|2 zF|-!LSBB@AiULJP-90y~Onp66Kx9to5@64hT!d~qHPf7R7#|t@*6a1>bl>kP;{sOq zqqNh9JSpcAm9yp?rPg3OwoFInQ5gs#nC$RSC<`KHAZjJDT^Sz< z^G{_?&U&h5q893ku~OmK5T5d#%oC1#Rw|yz<(-MoaNTEYN=!ud*Tt!)|}Jw7}&Qt_v!^a#I|leUSE&ah<4aI{%g-&AVj zKeq2v(U(ud?+o3ius!K2`}E?b?ued_9Zn;5IP21BcYRl`+%hvghxH7;kuSPPzOjPk z%_x9{KD_Z`M3l4G`0Rp<=Tc`G9`z-<8@h6FaFZ__L~7S=9DYYL4&ik(f1tDD+ak2L5n5_(LQ3!&_WDiIC5Bm&E~hXU_p2 z48tSS;CCoZq}~!3LOv1FrU34(Zch%LCSd*-L#Ltv@iw3%AG-b7{hi&1{bJ8hgisX?h)3K`Oq|12*d%tKFjNA}+g)*}f2aybN6Tmd+`Ckmb zD$)P{?Xl?Xh{olvJ3`TXzXJxFem7Q)J#c=rio+30Mi11g-Q5FR4Z5L3OFK7WOr{(d zRdaMc3F`qkoZ|OOE(MmIb4rMAdS=ZM@`yrus#t&PH|lWxY-DE#YMsqH0XL;nBiDwrrmGW!oGY0)w=jbO$LECM zstYb*1obsx0z7M+;*!+^BVYFt_uN$G(bU|?F!(waBq*WDFkm=bD&-DfadT9-v%4%o z7t51@L>n6RDYFSg=(7V&7rEL+q3JwH;q|8~D`?ehq`;lv6aoMDS@BCQYf# zr_+o)GA@R@AVMJ_Cn3L9h*T(qOhsVX3gsov6?M22l?unw{jgeJ?{wF#|0!0B7!zeh z8D+U8i)Do3jI0AgRjiNtcP1z{M{{b1EKj2;H6z0O3%1lw5fUbLF1++MGdqo*o|pB0 zwhlH!sp`aW*fN_6ywhD*LN)q#7GP>a1)+ z0Fu0H)?|ES9>urYWad*aTdo<0baaggqf=wJSkC8D?k#nx%+FR!+SvF6r|JyepBuT> z4BXD{?rf3v?fqn^{Ny=?>O~GeJDw%&pzN^{0rfanMwodG>tAOY0NZOT@y}u)sV7! zQZ!-|4~tm8!u?L28e=065vM8>oOZ$Z`c)mq&RPzvc>8i7_vZTffC`$oaFBn^yotn1 zTO91ifPV!A&FNI;?Wgl%(m3RE+<1#qp`>3*v=oMt z=~x2BQc|l3($TZZ{bf3}_2-R^O)|21SR>mNZZjkX^V`JK+36o%($b;WU=hP&sFqKY z8QP=jrO_nfWB_L<*tv()RyY;F%!tOF<`lW?%Yskx|6-MU$BI@LlTajA-+Kjsa0vV+{jyLrwQXQ8W6NEH}DFDjmu`kq{!+)-K zKLrH;M5SCX>MYA-Z$LB;@!O3{lCEb%k@}X#SIfgX=so0 zIPt(TjW?^*)J{qhwL|s*nQBRP9D~_nVNk8p38*Z%eqzW#a}fzIV{_L|jriDNPR)&h zsZYYYKO6A6)$T2;QtSVAgS(+0nvZ_JgEdy4+sQE0=MJvJ>T@R+VYT0$qhri*tgI6> zt0A_{Yur!PV?##a^BnBMn(*6*pQra^=k*`V6@45V@NgW9CH7?Q1=+&od|#_Qi^dqB zaNeQL!6}e$&z1(e`@9{nV#5(VuE{_e-tc$a~ zokRU)uLGrB0+@1F|K(l>io8?~<-HD+d07^AFeSjC)XwZ7ys+hUpwKRW%QuScW>&0> z-gcDRlg*Xn8|7w|xq-JG<@RRt;Kx~SJIdXk9Z=sWw~v|2hrR76HkU0QDtDC-K*7(+ z_Oi0uQSRk{DHXfD?I^fETPo&?z=MJZvV(=*lD7lJ=CcFTc6vKdY#}QUxFd?~9aJ&i z4wQLC7Nc^1*4u$HA+_LW1a;kkLNTuR`Uk8B3V0Z52TCrZxPH9Tu!G7l7JV3HplIxV z3V5!y2x@nr^n=;{0^F4CMCpgJ2Ma^}J>m%1Qw@*%AONS{Y$xb=ZZ_A0PTvVao`+5v zL`geA$d%dt?Rjq6yq%!r`Pu#*edvyzpy37h9z?V61Py++KQB2z!wa)Rd5Q|&PEat6 z61qz{+(W|!51?Y^3(){091&UXLKHm8&q41(6kN$3>gAJD7oy-X;eI^_%2?)-`fQO=CXWr8~e;%AOMf36{IJ3fq(^c(*bW6>U|s& zWB|qPLb2E2Y2$$bZ#PO^%oYa=<$|{xg43Z!l83h&#lI9KmWT4WD?DE1dl?~nd%WE!{`W{&cOP90jsphbYjP%cCaVUJ!nliU6k012|;#_JZ=)gR(68>LA!vJ4nA< z!b5qyJ&2LsL0g@BBnpj%@zc=`+V6Gwz%^7=AREuWb+m)>`&68P0@ZI|opBBge%B6~ z{{W3&Vm1Up@BK_I>oACY05$I$GK7HGH@ajD@Bw%jyB*>Hv2Q{g26qpXBVewe_CZr> zFX{+N$Z_B7X1P&PRU+GcNJZE>k^Q~}P0`Qy6%Qj5h9-$$+va{o}s2lqk{#6E(cYSWGm(D`=ORT9aT|A-@vlME|K$97Qo4h*0x zhA=%k$erIsRH#&Lh^qu>dp8D?1ZDViYzKLdN^$6aK!CLOpxT}J?rcBnOoshlrh{~Z zK-~LXp2qeWlQXOhpyDwbiJ2qZ0u6|>X77Um*>P+!iaHdI&>EG8p)48 zQQf~e3pU`VO8=wJpRSg2oOQp4!)eE%g$Tp}{KpfMSKz0T8N>8uBtqtMHsiMiKiZD0 z_u=qnbbMMa9B)|S!tq(lTsS`4hw8W|SMYnX-B2q!bxpp{tIPS4<8C&eh`vAsG`F4q zP&k3&;xLXZim-v>fVzA%2mmTL-H$KKUe7O z>V+av=KReJ_e)rY$}J4%CA^bE=QfwqIQLwy<-!gsQEzv9NhbDRhdfI(*$X8LG2~;) zcCKmnx&8k9VS zf^`CJ&`-}f>*lys^kFc9(`!Cpb`=ywcmvM&j}I%OuEuYo9Cz2*MTLOx_PWK?HlIp~ ztW%V~nQuT+JL76S+MUdIFgsNUqdOeLXjZ{yzyM;nGJIrQW-%Nxob5_38z*_=k%EDd zMOt)Wd$De$?wMz9y&b1)EFN{}V3br!g4-nswkb9@U>*4HHRu_7Tr&j!+I+Lfryx-h zSd=FLOA>a|JEJkok&8w#AOAzFLwl4K{8}~7daCdD7xu&Q7S`78CVuu{_prakpO`+{ z#{C!Utqyd8U+pjX{`u#h--;eQijCytuvtajVfE-PO{#;5(JyoQO-slL{2?#6Yia8 z@DrP-Cx7WgJE2?m(u>~gx@Wt#_i01(atA@@0LYWE^(>63HvG1kvDHU40$b5@QcuI7 z<{7wQa+Z$5KX^6R@9D*EWji-An{qnxwrfR8=tNa zW<{b^qcJ%6uFT^{g%1%`cJ}@;XLNWbfzND) z`8;Nvn$>DvUx2E#dxwl{Kt* ziI;XWtzM8KkzVtb_U(($uJxxG*DxgC^Dcb8{oEOR?g&1&2cI3mXZ!OhoxM={?;!qS zC0%AL)fy?hxOQxgYmyo*w$stJ!0X;9W$-)EE;f?=RE-msPFZ0GXxfS2h4}5lk9!>4 z&tltyp`+7NXTnP5ELf>XfAC}_m&b+|+e+9%3>?m950)W3^vmr&(e8*DhJ~SpHKp}) zi7^Y?2lW(}=s;RTj?ObhjPI$9mD@jpq6FP(i)=k;$x%p#B1HQh+(3qW7=yq*7j|3N z`Vs^i6o6b21L+((6=&rh20RKN-?PJ!ERjX5&%#H0O)EX z6@xNX&JYy{u5#0mFA6dM-Fz=}F7!b~dO#4M4#c43&~30(gcXdcU3&+?4%Pze?$czo z?*Z7M7}($;bSF+Mc=16M+P)iLlMyi3E}2egQP%}FZEBIPZI{e0@?y;SVrPu|qmg`( z?&OV!nMkrm``e);y158C)50f-&txOQ;}L|mr3bqYoFr146|GOi*G3R?yk@$eBvO-& z7;lbYJfw{KG)8lyr1iwceRx_C`K?jpXl`|fL|?lh)0fLZm|d~EH=+A0u}eC^^_5sc z=(5Rcf^yXzBcH1EKIk-YLq+a5*2oLS9Ze6D$Qr#az>K3S#n+d?O@i&%ijf11_XHTB zmgI6ES3Rjrx=)fYQ$nDHYi*UB*h?&OYvi*{47X`(ed*jMVFsbivnBi7eS&fQYW&sUj~U#pF;^KH|{Az@v7@f z_*}(H@QeH(FGnKhuY#Po3^!QpRFW5O+=>Xc?Ghepdlz4ODZ{UQAt|M z$db$NOB_18z#LREB@}OLW7_0HY6BC2If(i;w|^)(h z!Tj%*y7gotGQ>u3yU1Dhvdx)4bB3X2_%r87=%&uPm$_GpUBu`(?&++1nX@i)?&{{u zr=8Zv#63NXEN8D3dpC6r)oD-tyKAiKn_yB;g&*{Bshg~=ebdYY+(i5EdJpB`FOk@o zdMHR78J{^;!MK-HUK8=0)_01RR>PEiCFbDrR^*-*EbEnNmAOh)7qj0=HO9pRQ4)a-mUW6;$V2NDg!o{nxF}n4ZI@8K-=GqC||KYtg zWi|#fFprO13-zjwNjasrr0X~8YGih~8#V6CJ6)&syOCm{s&z8;a##9D<)}XbEjA2O z)%|1M2ZN(0A4dNpus@?GXWR)xn~FnX=pk_*X9PAKb1=l>B%|WIG(?LAn6N0{wu~Ce zUychcd7o^#djRHo0W^|mP6o%bh*q9%nFCCovN7#H4BlcV9v3SQ6pV9Qf^`m+`!t|( zZp+9b?^zx82Xdv7SVAfvw@jfwh3-yVz=WNj@p8*}A)r(|kXQJXt6Q7UpBtdPs&aG7 zSegj*sZ2UeIlN_BC#<~%o!Duh6_o2+K{n7M#x*puqs`)4TQ$irn0=1iKN%WC^EnMq zsZPZ%X$a~|kbYWqVpor_IH%$CXqq-&l!j}xNke&k#!N!i*=UHVrjzJocmQ-{Y$8r9 zx!mgJg1sPYfY%49G(AN>GM@Dq>_+Ad$;riouoS^PoTu94AZvdC+F7UJX*LO#MOo}w zP`$F4djRbjHj$>UojDw6!{YBu8_Pk}KY*JhXN96zVGuUp_W~U@T~5Q(Z7NQodA$VZ zOHRWxBC)yh0Z?;xBn}0NJ(bgNj*Vx_p-8{KUmDJ7XtGIY>teP$*PCNoZwyD1qDUss zrlMkl1gtI!Q;oL|9Zg4man{5=f=YxlfVs8eW z8yaJaO`^Sr&lzOOKF=npVdGy>KqoxY#wrCsS**)h#}=CcJC3rTvYpgw(|U5fz1ld9 zL^};zZ4&V7R&0yJVT$0I3yauh<4GhAQ(@TdG@Nf^LDEofZ>~Ehm+i9MPQwK@jRV`~ z(O;pLqRM_$zCB2!$2yo)O5>LfIt|-x5(ag45K0E0R(Vdt&LDvuRWcmwLK~mUU*StP z6$-Fv#|YhJlQ5P2Qf{D#jBFaGVYf{ZlWuxp(J6auie(e}f{N3yH%Ke@^URXYwx1nD zazg5PywAqM9t^DFfZ}x*+2~*jV)NxRTpUfH;R7VzQXl<0ISrTC)Pc@!HSra{zSJgk z7di(^7{L9PqqOHZ4VT#z8ZoqEo#-0CO{qKtW2d3hCUWj7%@Yl>orW$+0cRCfiwO)P z6pnyyn*%4yPQ!1Ut#8S!YN8-v7C|RH*mbn*@m zn&t}GLySRce|k8v6Zcegq9~7^5l)oiXeZ1!Mnx0V!7b0(R;M8*)N=B^NK2J-sK;R< z1bEu2G-lWpPp1N>rP-vZEkP^a= zT8o-6NR+uUR0K^hVbtou#8hc_G(nkCOaRfp9b$;D5C{kwMD&9Jh^(VVKZuqQ#bA(3 z@@RT0ioj?zrXv}Px+x|az#yG1X_L`thof{+X{)$CtgB!r8BOKwA+8I&HB_M06AtC0 z5ZICDdJp@9hhTLCd&z^pDcCozCf5pPVvN4y5%2P|H zoq{=43F~ROh5Ls#Y-(G*(P?NR#>c#tO%e&mg1BZ6$(c&4)_tCOL{25`^Iqy*b8LK~ zLgmjs$Nh7QkGG+~6kFyibI@$qQW$LWnwwGf7XT|4m`9O3Jdf@45j>FQ`}FOj;(ebq zelaz`Wg7P3;6+ds;V6KLroT*GjsmjXEt9UJKL8MOS=T3+jFqga!inEaE3I**HXG=#wO>hPUbk$pi;w`Tnien zFo;c$ozH$nuXRy{;fL*>HJ6}gb{s?8G1@$Qji1{}}n1=Z?%BEgAkzAt~Jykx5d+=<-9tc zoK(gg7D$$8%gXt%Hm(WirhiQhsKKFpp4=SGi!OL=4XC7Y@3OGm24d|+hubUUua71w zuFkvpl!)$*CaR{fx5)2_rt%)0Tx%BqYGCh+0t7>(#SFd>LD!M<$#9iOMMx}C6A+8F z1*6C>tu|QH%%-M4ynY_X{ZsRV zx5b5Nw8j*N6Ni3L%-{xqFk@cT8XLx2kzk3OfH1Dq+aEYygS$rjT0$_O{Q-+iQKM06 z^4n$>;1t&sClJ-t2U&s&z{}9Y{4rYxpn~R$Mw`<_zuQKUTBggkd`3N8kPH4rK za{dK>A+i6?dfku}L7#H#6N)kR(N)g4sJDgQ7k{M_tQlzdRn?<%Pam3JDCNW$8?;CK z(IRZT&*GD{v}Ow`42|*%R1HhuUDG7@|I7=i zo+vsSRpj{m@dSL+i{tjZxClO%z;Wkt>^cJJ!kgjnvyhL40)nm_fYO+4|Fz z*EEYqGI4P{gxJYE#8z>(-VA?`kz{AHJ1}>E&#j%4&EwL z!lgF9qG*Y~+>XAfmo*BL)c^y1}_0-yzF9qi*Be!jU;VXm|vn?z)XK35RFkw(UE0 z8;?|mQKlLDD^eSw!WhThSRpm@^pw;3t5uxxoG{{_0B%wvsuCOlY)gr+ppg;fRSr^r z=Ch}}m(~@B;if>YT_dK_=;rE*ngN80czdHeRVQ!YDaFcmC-Ya0?#ogNG$=On<&=AO z$}2okuiYL=m&1DPNSar7;aor}!LdJ^cK;~Vxc>GvI4m%-8?>}TD2mrLuEsB#-*VsfyJQ`ddTQP^sb# zB`}&dl#EYB2|0g-`ymkW-B2MA8F+jSug^ij5=RkI?jsvy@KkZ!#{in;nV6IL(-rQg zfa`Bg!(oi3Px2KCU4Eh5$JUBrWD3qD!Zorvw)0eg>gAwTHm$3ZM+r;}n%^eod!d8G zc}1KA(@M~k$CFG$LD3jb!hXA}a0u&LLP>b^P^Bf5hJ3|NYygonp+MxsWwaq2SFCW7 z3&qYJY1aomCyhNleFUCo#_&9>lS!>~|2Ca!ebxGKcQ}_dEiB;0?95xi$(<%#cXl$j zLw5;}jyfxJkE_V!xlq7ih-fznyfzdQJ|cv(NHuzC=3)5RIuogeG!FRGx|hL~eGafN z>;@ed1ASWlqm5Whwq#CQu|ah#Yt%9VI*!Y ze9|O-P$y!Q#iP)fPa?IY@Gt8O(_uY<;%oI-qYMxJ7r?X?UYiNSSStRzzG;eg*TLQJ z{CQ>_I-|Ytjtp=-b2U~k9?xc;g~*+S$29^ZU9=j$1*es_AFlYes9r$sDf}3ax{_n7 z^^y;lY%_eCCo=<(i*OYF2H<(s>elzIzY0PQUdx5&N4_utpPBMc&KoNDi~{&b7oUzab|oLD|elUQScNoJ7NmMq8kuGsVhVXTsq*? z{@C=4b#-!@IC%)ioL+d>Q^W4*&^!;UX`(j6$-HX~oszcRe1;)NZ&#eY=El#Uotj{r zTfs5F-vG{$nuue9Njx{NYfA};PZI0k3Kc}B!~s_}sU_Dyu4+08fs9Uj7Hw`=56t3W zbB$|t6XbSof&5VGu4&Spm3bdJX)Qx+!OS*L*zUC6cb2J1Xx}n|7S4b444Ef?vt|pV zy)Bvh)~bJf_+-sI)X<~~;zQezn4HW<8&Ki=f7m?I@g@iVMXs-gbHOnnoNXglI{(0# zrXuS1@?2+f)nMx5WsQdXkUiSnVklj8aO9&Ie^y|esJa%^a5}V!z<_f z{1jYr!uueS8Vfg`rIW5RNw5mZ+=#RdPP35E`i}|CLO1TI6Mj5Q_ zGdrHb{tOvucpNeCX|AT#CitKUisnLqC&%BtrY`fvvoX{lxrzUI<(&$GiduEKbJl^n z4a%*D4#GcGH;mmBAlA5SCr`P#fc6eTeo>?ja6wX5z>Y(f zVCGoiz$q6M+d3(|0mmr%yM6<80}85fgW2y(CU1jibX3}9PBEwttND_rxR0Zncb^0L zq4UPUEsB&YLh=pSLf(F0Jj_9OB}c`loz#QpG)|MDI9Hol5vU{Z{`F}%s{3>mNND2V zRr|~b0k!XuCik0bz)<<}_x$ixe8T>9&gRAp_QBlsZ*Jtf+Z-{xdpGQ3fXrdu5(t(` z<9yv*Ep>Z-*yR3GDyGnYyWkJOoE^ceKXIv7Ei1-ROSLWIZ~59MwRfCacr>EzgMZTnfVHqF}SwCx-+9 zmt!{UT&J#ScvzblDUl%EG(UXQj&@~r#ck$VEQ@fdtM;6YYUne50}-g$Gbs)5(w7RJ zjake&(E6rLW@7<|d}79>q#d!{QpQ=tl*T4(MEkjxjjdz+qrRze{aMt$d8yGhcUHKSPoV-Hp(ET;5A zr8nt%M!T5oN3oOF{@=n4j@FdZbOP3u&m+Lp$5XrqS_P>`fy|kPS}jH#eKQa#O16iIrQN*M*5U zJL55u=_!%IG~hX#=vP<9v(CFhy$5kAWh49?=X20#J$M>@Xvg)K&Zk4sQDz}I zF;bn2f#eeWF2#>$^bO+wSy-re?-4K1!KO$oP2m>?=4bo!T9wUngr}Nqi2%?=8X08? zO6)QG=eSRcq?7aJOe)U#&WNNc<*&|*1H&^TsiM`^i8wZVx=G}T$Pj&hP`|DUeMUG9 z+ZC07OlQXuaGnIiEH4%ddw^IBRO;eAMhXCB8%;WFZ)wsE8d}g_I6A{$F&oyKH4;Yv zRnB$Sc{S1%erRl;WiZ3(#Q^W~j>rY)xi44T^JR@! z+!WEFGfS1jK+H)VL4qia5bmag4aYLt;=+&$K`7~^j@x4>j%(O?kReA=*+dBVick<8 z@Z3}d5$L%U5DuL7*8;Mba036FDxm%F;84iJ5RS(LK*keK_O_DC3#U|g|0 zbheBGPFq))XACZz$I=6fgVGYvv37(FLV0=UC_TgCO+KMbRgF~%mYyTDIZ0~JE*fIO z1+%RuxYNNUAuUeugF}gsob+OhXpw>i9bN{MwX^VGpwC?z-cUiymggmc!YLJWI^euP zC(_6TuQ(<&8dX2NFopSl#C->RRz=qS%)Lnn2_<>y#TW=+0-+>?4oXNUQA$hz3t$K- z5P>8lp{c8=*t@R1p<-{?dvCjTU3**Cvg*1P*23yq{?9pcZkd~x1i$_K{``#Redf%Z zIn(D(IfJ95ICE@;K_y=jHwS6&fA{n(jvZ*f3f`$4iMBQH6N+?XL zmBU=Lz>_$Z|R&!y)Lq;N-5;jV7qcUY6rlDh7o;6Q~o#X#COsB*?}e~ zgT}V}**c&c*0kZp^IMMhF?4t5~KI1$P`;Ec0M?{%ktm@ z4@JVG|A;l*5aOEFAx2Y(s=8_p;)TI2c9{DgwV{fpYY=l-W;S_&gzH*MAd^&lwGP+n z*rXSxfY(R7VZ&%%DXu7b7c;#t6f;e2Xv|!+gl4g=(nGT8dfv^g{@CN$b6qu0gpo!}ZlTVUOg{WE0+Vx^;U1c~XjCSwd1PkC zJ@Mrq!Qv-|mmq+bkkF^dA0QbqlW0DVF=BaB!`jAOkRCoyHXN1*!t$dZVHAmo?}Ml|Pu^kD!Hp_=8kG4CNNFc9wlsdjFU6^8Z8jz3OKl zPt9>(3dc0DUX_cp8(8|GCd8NY#lViQEhL2Y+>>66CF2!1V97`1aR*oCe7I<9zBgJY%JULQ zbEc$^4!(|oGDkX|$FQtc>GC{z(xM)4tvtSKniHh0Mn&?cGYIuXTD}#a9A6 zve-9j!?;>H2BoIr&s7EZKUPHAIS0i@m2k2J&mox$ta3MX8w9m=uE-Da`<*J{Q$)rD z*3fMl?|qr3>+Mdd3|f3MOP-D@e_SW*PTR0so!!xxu?LG~%TMs?m{~;PE*kp|Dz=S} z>C~*kdNS`An6)~*g$mn9A%{foVyB4!uPD%74;#dDuW~qA+$W*6P#k}t_sBZA4+PGp zS>rJQFtDAA#q9O?)jh-S$gsE$hu+v#x!X<0t9I$J5_e#%0kjz}Ngc0pUUogzoAE9= zy@;DU?@B!OMCuI23x|Ut0HM#KhYc%f6Y@&PQ}Z5mL(DtrPzQ^O-b&T|!%d$-09cz~zE1NN>3}nd$>O zhJ1EZIhS|vRpOMRHsDoDvn3U~90z%@3x%yz+J1^%L+5(tozh`2r)F^MCKTtbE^_!# z)RI$N**iT0zOXaK8yo3dBm-l2Is?;|BR6tx>1ans^){EXQn5^mj#s$-G^JFXkT9UC39G}tgLVf<{qelGsBkQaR_0NC zz3a+mSK?MAFm3K>9jTtP*2saQ5;E2{V!ays7pGxyy1VR{r=5vAThx+FZ>I{e?mG>C zMY8^zUr{k1PgK$Ce`IFSEx@b76X!0=%qG*Kljg28KPJzGu~i;SrikybIi$JEhR$6H z?|TZ5=0nC%l5o&hZbJO7T5q&yyU)c75gYlM{NlR$s#R;NYp_w}xu{*RH-N1e(^Zq1 z(E1i*U4YJl(pK2c`s^Tz){z>4zh6gg9}gWEdqkDaFDk5Q-lt|`dDRM>l0f%$6%6Ai z=q|4{AKbd>iD{LPed z$NdnL7ACs5oilg7SNbDR`UT`p_i5*O*Wbx9?U=xoE^?9S+Hr6?5O(q_=n;BeuEpqT zY}y@eV*P!~8E5R!IOrry&{U)s2kJg!C_*TP=hO4y5AO*NhPrTFeL7c*dpAK9;rjYK+n zjTZI0=6}4C^r~ugWffc9Fuhy2n={Agk;LYW%{WK^4^;1|4UqNT|4|zVMfQ7@QPd#w zz}S=2^A#cLaxzX#{oV~^Fe@SFbQc{TXMpr~E8LF)!zmbCV{cM#=l&2l?vtltU&1lX zJvFeGvQIvaDPp>p>0S{yuBxeRX;??c%X)(~iYBczQ@#j+r(#RmFe}7z2|E|#!609$&zM;sSQUn;rB?gO54dR;5=js`%YE`gAn+gU9ot4lSKl z2SUKcdm~uvtg+oH%4e0#z{49@g^n=TxE|e1nt}CVoL8;z6vERHSnKs%XavB*PY{^Y z9qMr@0p*wiiS^1xH#_5PV94~J77+)VlDKs>7M3_3qER&h07rKGIr^zGG?mSd2lIqZ}a@% z!}>byW^LB5S50{Px{cW#l0Tbn0MSP*jO3}Rnze|FgDJa`+NeXqJv{| zA@Cd=JLXTAfic{y;C!NfX$H=(@{5kK`HudZ?n1e{7)LkP;l>K6dTH5Ib=8|JFZytqql^D8lgK4=*Nj*xBF|FWJZ9D_Uw{TUxW-+$0;OV zLf+-zyuPdSBSvRzQ{y}-NrBm(VzzfM3cGHP;V4GL6?=9sk-}v6Bby(%%jI1O^M6{} z;Qa|Ys>TcN^n+I2`Dh-v?C1fHL5}>TlF3FBhUR3Ooetguc;AbTKhDa%NV%V4gXOk1 zGzOBT1+zh8x-)Fa;6ACbv>BI+%>3AoX2$HonRH5vHeUbkyDnHzQVhck<#+&yc$j&7 z66N9S7_qRk`l-c&B?d1TrZ>C@&Sq0cBzO`GQDrulhe z!O24!V3#w($sbQFq+xr&T8N$x)x?BC3Sfm(LXoi$7~+^-2)i;xl%Hh0;~SqX(T&b0 zPAwM41CGdK78&+{y-rUPFFIC*jC=5IfywDII;llQZ(yra{Btu##b={5h#rPI!yK^7 zVcL#@AuE2cnZ{lK@vz(bpMV!WdqNSz2QA?LOg>=#p|BWd0~c(=`Gn;5*%6dRO0j@htlSkcnp z$;@2Q(jZa67O?GsgBcGZ;RN|ARCl6NioHzT^?>2=!Rz$!c-H+A2Lc(k%wwDY7{--cyW9` z_b)%NrBAt__&LC4GD`{4blQRC>z zzbnW`@wA!Q@eHDnNg2b2ReHAU!CUHqnH0W%@Egpe(2nud6eB-F(ngegmmz+f#QKd< zUQbc-DTAL*JOJj<6*b(jz?7Y?_Th#{-KwUBhSk|{%gKag zK{ij0UDgs@9G+PYYoODah4=9MpmvzH1mcM?KNOCSR|hfSoCzWvzGs8EPmRV0qsw6z zfJOLYAB`(p$c8KCEqIwi-|dT(G}w|oeJod{?}>(@RG3spb-@R`uL{kiV8X}`jGY|p zZ>}~=1UZ>_)QipHVuK4Cf8q+;BEEl7ao2*qULNF$^mg+Gxmmz~*iv;tA#JItj$-&<6t9cQ= z&(LARJ{nuf=BkgkXUzdm!%+H7+FjOf)E(iuW>`@$e*J^%1UuUmW8xcI<0&`)YDN> zWa!b)t+?t~J|NwsjghFz!gvEgJ>AW`+H*~;8;1{ETxt8rb-vTxQzf6JW z<8ujz_2Sjo4ntq?QOx^cr#7lYZgHGMryRSS%Jn%nsK#iv}ahxMhut z8n6>Oi?0Y~(?lNePz=|GDET!`%SRzx1eM;%=mf+KI@UYi_t?S%6BWx_@NYB$=)ZO4aM&%Q*apc z&`ezaZK-X5>7%B~x@H*MXvT45S{ldU3-oaGIA8_Yuf*IPzhD&^;M%+j3-@Y)^Ay@f!=(@eI0!46ngdo4;?3 znCKF(Yg-6>49NZ9qKBvOQ;LI+0l2Rxa|Fj68cm9Alp{;H}e>ES!&Avb> zuGQ{r4?UFV-)r?hx=k*dW9H#>%G3)y*m?BW(2z$Ae%*tYN)( zrp+19hf~IR z=<}f>I+Kd|uyTgZ14r;+3x%SJ?Z8GJ4n3}2CVGV9bi_=Km+vml9j^1O;2FK>P;V=H zc}cwG$cgZc%OtCu7m~aRKysw)#TFo)DfQyPjeoi%A9m7QLn@%WUn|6=(zlKSRm_7i z6{{<8IM(Qwlu?USJ>0QqY*|@SzaX+SW&Mm&hH|{pjkdetSc!ZtNTlj=% z)v}7pCRk;trURl7w!$R?WB4ehbqJJMS{9B$>RX-eIY%c)zH*H)n4^-HX)@92QmJuW zFu+kc_a{Rhn*&IW7@+X>WxO{-QmGdnH#355Yvd71iUrQbwOHGB6bMZP3 z8~a&^1DkkQoQ6DX5Cc#WCMV3>)KPqHNTB3YuMi*M|9~;ZLWjlwu-iO)95K=R&8qvwZG;nY#1j+%>#M`iPr#T$0n+#=0>lOS~n)o`hypVS5P0bT(gyJqHPe$?c#Yf{<-p zDTmP+<0QTRG!&g4Z)wJHi=Y6>7xlbUMO4}njQ==pVf3ounz*KeehTt_VtLYh;}u@G z^=|A?<-Qm}_sTS%ttuo)S0Q+ zkuI$Le3`~ws_v@Rc*`5uTsE)IVGFFdOvS3ud%EYCc@ zcz8Vs87u5)`c`yi&$^R;i0Knr1%lv~2G|6RA8zs!-Sp{hciOwdDsELH&OEP2i-F~! zj}z$v!XWgcWRJ}#i83T3vF=^nVo!8L1}*k1!>ia$9dUx?A~k78H@pYXzZMgqidD_9 zPX<$WD*cE-+#b<-1LH>NM`$(a%II<}+b8W77tAmiVxN*Ivv; z4!C-)&oF z%)wX?eTIe11HqgSY$AsosLMqAr@J^ND>`$pw;sKVd9|*KWzMH-Mkx+b(&8JRQSrtu z%czj#mr*O0QEbc&6&jsA?Yc!Ws!u4RU_|h#KJllmt;(%@BdkHqLT^bEBrku+h*FRO z+_niBBudO!TaPPJetMH4Q^*bx#XPIPG!^NDJ5&9=jz`MRnEca& z>^W_ZcvZ3|RY`pCM`~)X(CBMwB8JwWn)X4DijIfAjPY+izAj6X&6g`petA%+hr>?B zfpfr$)Aip>A^c~}<97TM8``is2oYD{Zz=vFHlSwV3|VI!hVO#I@LdxU+%%jaOHac2 zyBiSBRaY1ZZJ&LoPvYOUErt0HNiE@D)u=8#l4O z_+OlJuB4zu^m~1?Q^cIt%aF%a_^Xz@?p#4z!}SdnD>9Ytf+tu zrkY%^>&q@&;qnasQ*AYG!D2XtJo=ZA)~*0A_^y>MOZEOoG1j82mg8@QlvxUjY5qKV z#+#4k<2hJ?^rlgE9hOAvkY}fPu6)Ygdorl9rGYFIVl|N-C#I9-N}uleq|^1;IL-_S zd30?YTiXP15nLi*QFPLU3grwh7~2S=vdT4KN6I)Qy7WkG*64{KyH>8KCe7>W*~D%gjviDwQDD^S~b91HBJA0T5QQ`Knj>RVJ(0Y$<;<2i-8MD13F(2Kba9tB;zwq-s z)qtmM%`!5f`kM8ELQ_G=$DHbTHR*OoPwFq?P_z(tUR0bB6$*SF0#EwF(Q~|jWN&wu z1776ngS>zkfujMV@jT<|de1xhqV~N1=<35g@01@#tzWccPeeMb*diN#)RXQ{&}V2b z98b@8H6OlAfTNT;4VjwI%VSiBnjs$z4X@q1`&w7gTBp4^eQ>N!0569G@uIXm(Ut&R$LYrZzFQGByV2m9r@wW4QF#3-Frh!;!w zgd@iB^i~``vxs3m)`~Nl&MIPL_n#i{&&*`=W8N68%#Tdi8o^*Ng#43UzEM!xK`xs< z15X*w@`G?t->=&Xlg!?jWcI-%6BiW%)0?z4OXoNF(YVYBmhp?V5YFyz}4Kn(2nVlbrXTUFV!UQMeQxFiOaiu`-n;5-{2wjA zp7TYA^Z&v30e@ETCL`8Z{BMNd%D3syz`ztjX7~6dUkLbR_VP~e-1Z#9$o}0X7}}|r zMk_x#5BsK9Flf`F5w49ks{`EYf(xv0Rk2I4qKP|Z!N+5o`&{4!mWIt8vvl`Eam6h& z5{Ce>HxPD!`%~Z@_r73)xCQr9w}X}Ao*Ud+#d^y+db=ss30qbZ+*<;UJPr^W0!E3- zxyQGXViZ>&X?Z^Y%W3owgZUy?;)rc~-gGcu+6lfZ+47fFn?(0g*DQW^_d-=v;fOfy zsQnRfV!MmeI1@yxq<77D1L}dJeWRjY00Y2_|0T z8QEt>;$cZ8+r1$nb{y|KaGAui;D`qd&hag{(CZnB*3)SnI}>%Ci^x{ealaMexY9?D zF!QzGIyUD*(`jP`#^eetSij{9Z)#jcTR6ch6L|THn;xf@HVtXLlv3_u@nMaZ-`Ht7 z(zoqW+f+wJahmb+L2?G~lB=`}F}a4GYUqA@q3kBWQ_*$$rZ1(H)NO@ZcJmp^Du0ol4+Z6_oW77HVqZt z%bejCrpUc$HtrD7hP^j}kRy$Ua135bB1btrsZw3bFCO6LS5?DLA(3}_X%(lDW{{vn zD};Zvm7Y6KvRHiV5KpQW!svYmi^Jl~YsPq2N#)$!RYs=@s%qnT@e`fI+sHGOv7xf6 z#q6L;Ex=7za+3Pt)eSTt^is5@=()gZ5I=1aRDaZ5oRRSONvO+f=uAJR{Vo26dk3jD z^0I=|o#X+=vQ-5wJ}wUyYCBPN_i8HDH%~YiNmx{E=7m>L9Bzr>wgL>B@~tZ`++jC} z-YvmHE4=&_lImEs#?KkFIu znu%AOvfa8iHKh}br7#wWlg8mHjoD^-;2wCVd6DlusMnay`mRB>rc;)_bMU~|tZ5Zw=+5T^ zwVK`x@tuPjjdNXrb5Nb>>|RL8;OQ=&`SY1Sl?r26Px&t&(dd77YKAwF^IE<_KNxiS z3B8jCz=zi@%3^o|DqG#UwS1SP4$~s^Vm>E{IsAT2;F##w%~p~UypGhD;JVMp{G#Mp zJ>Kxci$8d!s-X(YT(}&+QpsCRcr}LItT8ClJ*8W0hD-ek-Hn?K_WOci_Qj5F)*FfLx7}hB9EyepY+TR(9L}F6 zx+isyjq6O#WarEb@lFclC%IR4k4@EVri_f)^@rp89o&1n$Ifxckw)fN9vrVp#WO_y zOHn*K!O26v>*D$N4BBW4*HUri7XiY3ueh77*--ZzcBjW{(Fd!XbN%O_DAuM8c%O>a zd}8O)qevNK&Moaud~DJn7OEy`17rpv9ZYxXjc7TF<|Khz(g2w^gpHHIFJ7Ju-p~S0 zKv+yL{o%H|cANpGoL5)2RQb(7sj=EdET@IS=*r`ge+e64NSmH(?^r zsSD;u$r&3$uU@5iF@_V7N(ruPJ_IYVUV7n_G@vq=A*AXgo_zYVQoKHgSqKgf(HJe6 z)L9KZvd@6y*&Pe z_QY#FnRxsO&&iz8FA`2=$I(1$IM8$_*e%3#HNoB7FZL_zXByq1kerC2LiNQTYAyc# z5npH9J7F)(e8#eySx;$zherIZ!Jn+9%vdlN*M+fZ;;pE_aHW}ol{||F4^sEPpK+|$&7?)PqS)-84wNA zzIt?hVIYFZB3^r%)xvvL;JqEC*nZ}qkoR`=$)lDs7$JhwTkYjm9<`Mrc98b;qPDU} zBuM+ZQG3ZosC~+yU)%L6k6KEO_-#)cY8^v8zwN6*?P3_bd;M*Ds!)r_4f$`sFUg}; zF+3DxVPX7UJ!q|Y)G|g$5L)4lJ06AnQ@a=$^50IEn@4S8l=g>bTP^JcqDC_n zfxP7|++%GwHPmPdBVpQa0{PTxrXiU3nkdiHc-^hdWKqj0iW{u`X~k%2L&ed+?UdGN zYDLqdfy|Zp==3(|N=8!?nh`J5E~rT@X=V@>FOrv_X0@j$HKkdtLbX%bM^i&8i5F@Y z^rU9Bck8h2Hki@W!uBx%Lo@F75=hN#cB@eBC6F5194pi=G||!2;^wvr)m~iG=H|5y z)qaLhyDLRN>Ott6Vj7IcwbcwpQ={8A6rlYEH<}t;St!VYx$VY6jjbF(XdIv&>vqPd z0%~9LL;l+tpbDsIEeQEYQcFRk;~#rtEf3)^DFcxHfX1<(ty{7{{EpnIxj*&e3y<`9$KrSq7u zGe&(RR3;7#{jCxX$%64Zm=PoU_H5;EwXpC2_gM+?Jc37(B2#Uq$W??Lt zTV6W7sANV7X9~SS)*>9QASpgF=mH~wc{sCCj5Rh_jmQ77$llJG4L*EPi+xaBq{4Mu z>+I&gSq}cUlk?VAu;1%=#X#PZn((OBf7IQv$Vd;?;EqGpN~AG#F^PSFm51v&wCjhT z`FMjICps?-f~~D@9WZtb`9(1E1A+J-M5t!0OSa%|t*lRm-c_cZBAmvqz}b2|)c!yd zR(92@I%B-k9v1y$PTaoe)mRCT>z(SUpl9PLG@d-;ciD0?eOYuYS53vAtH$8}yI8&= z&@WsZgh<1pI~}0eS=k0bey@V{?z+qA8N7C)a-MN$Tc=`KWi!rK*VWfHs2Q{(O~sB& z>Rhn2DPkV8@v!5*9vp`;zE$j5+EQ@84j4GEL0coSkHP5fo)A3?!@OU>8{}RY@DLF* z`r^z=0WRvmN;OWtn2V62O|dGC>Kr>8%Qa5UTmExKl$m6Lnck&Ij+`+uY4H!jIK0qr zj>6zPD(#Dep4Pz~D(fv89OA%L%jVEtNe7klgnycc;$49&aU896{3P_$j}wte_tSAK z!rLFglSJWtbH0va_7xD-9sUs)iHcH)J7#nxnOY(5V1=bcBXh&4!yX6@sdyn9MX=Yu+M-b3+7de3#2k+e~I6@>WweYl|Y(WvG1W1&;QCUG3 zC~$~UtR@?)6PaRsf_YH95f+H&;q?)`^Ddm0T)rYt7etJSnC$ZTtwguvOr9cg*>?`? z#o$sbP9RkO=QlO-}>Z2V&+V8Z^42a=X~0-i0xPE^S56cJe{Z zcJJu43Z`1QkRWNhBdVy?`S-w}njG;&vqKuNQ)>=>dN+SCT;T$l91aCQk;4N#Tk{ZL zPrk8JW31PZOe<;{Na;Wzb}M&f9IX2NE~q5C6-BU)v2tQ$pai z7N(P0lsAYb<8V@wch@DsKau)xU4i>4xG94UIUxfV!*I#r-_$E(bN(S!8d&i4JjLFn zIYrKc4n3FWnO&e8-?-Zu+Y_T8nQow~62`+;g}*u5q9ZBy*r(ImC?j{zb}U9X^_eJ(lvve#7o99 z!V0srFGb(CD8Lm7c*Cv|7m;}si2C=3RMs1ZFkele-i0P1@dHRN?t=_JNPin9w=s^a9P7Xb5FPnV=f2I9vKEs^oXnt;NV`|3}+8q4WyWngO7GVnFe}A%ZTO~ zu}2XP)j@g(ZH+Y?o8-f6f;S4A*^Jf$)9!$0cT=)C;L%O3fr*cG6`=!2IDmIaa#{ma z*Igi+W(Mi8C(vGc;60IV@t5Tcj4i<5dHDMUe|y92G5nqDde`Y^C#17Z17iyl2Bu9w zgaczs-SH21Og%H96HVput_gCY2G?_*Q+g0uq{){!HVepudqc7^(LnEm3#{bQbKorfEJ@urP%r3Wc(jW;$H%K!#_c= zotf{!#m`6@OhS1^p^#VVFbL2C)X1(7H2@f=b9IlBo)9@mrKawg>f$PMV!C#d2Pbz+ z?3bLbV>%61O_FRUr8)!-#D_;Oh*BK`P=tU+LQ2??f~0y5o{vsp2cPA25NB3;yCie%k2mip4m!3F{)Pqz|s#mHq zKYEj!Qhg9W_4W99X-f4oKImtEa;G1=r79vBogulT=XlsU+THwAD${c-z`2?M9!O2? zoZ1PZ2X&23&UX;^M`Z3?Q;gz6XT$>j5Ms3=!H`n$33s{oVF&7>W z@Bkjjk)Kd{k@-m;7Mq_+E%AI(oCkRzw=2O4fk_0G8elk;29W!*0z_|Ot>T}EsG5FI zG&S@CU1B1W>>Tw7Ix(Ys|uGaxJ- zV6?_~g9D@zAMjXVU42cpVJ@$!ufb9C8nPD9Oo&^!@YIc{9__~E0`2$AGMSg%|SYbmW$O^L2-UJZfO zHOtm62aTlIRy%L(sQlc#QR7J0wso&;tZJSzlI@1k5$fOyqAQO@m2J(a54F*tEK+2=O#G zuBzjkKeWEfWnj`+)jFBW>(^$IX1FX=U)?&#sd%I5#?n+VSts6~MQ?1wU zhUwRpVWgFfod|X#I3a=))fbTWCtqY@gr5|_9oYX(zW)vpesTnNjNlXwU*?BTiSSdI zkFiYtrAGLjBK%GferM)y_JXU<5q_5l?i#^q5u6^uF_up+TAP2d2)`TiZ}8ZvTZG@8 z`I~%x_XxiS^I`fx{`H9Pdq!}t2<{!heImGT1ow;J{t>)e1ZPC>?h%|B!2=?AU<7AH z@Sq4D9Kk~(c#jCq=KQ0#zRkbv2tSAUhk0z36X6eK{^>q{XoNp3f^#EyIETO04?jG@ zAHn=gpFbkPAIW@7!sOq`2!9mwFYwrERD_=w!TAw9n!~U1!;g;e3z&bu&o7AZ$3*yJ zBK)xtJTBsYT!cTK`JejnjgRmrFn^oRpAg|sWd3_Te`16`iTO?V_A&n^Mfj7MAEbA3 zgg=G(Nq+b#5&oXc=Y@jFHMom7j(?;PQGR*Nitmk7U$nr894M)+OTV2hs?;isu&i=Q6hr>n0H@^X*r zV=Tgtsn;xiw+O$Rdcfj$kMO&ztrovWgx^D*VDWoK_&wFZ7Qa`7-%FKR{N53MZhs0n{23JC4^mHC{J|0aV0E>{9}?jY zQJXCO9ufW?s@CFXNBG%luEo!Z@N?8yi$65NAFA+PivQ15!y^1)D#haGM)0m)8Sy_-y(|7{PUfhQ>Q9#cQ4#;6)YIah z=4cM)XLnov^CJH9)V<>0^v`)}tK~mG;y+(qW%z!} z5b#i%_CHbe zviwhq_@AWuh(0t2b<`x)+44U*;(xO0D*jD+C##RZ}AVr>I}Rr~IKgsssL4 zmj68?{`XYd#Xkjd)Sl{n%l}>x|9hzq#6Qi~9JQBv!SX*f;(w}oN&K7qoT~1#{1-<2 z7pfa9{={Gh`7*`A5%x7mt!p~G5e+Z_= zu9_9$&r*vdJn5ssCrrQ7Lzrw#Q~%}hbMPBGjXoZW-`E)N@$?9uAHh`-+!Vn_0>hBC zFYmMnz8JVuh<`19_YL94@H?#EixK=TaLNf2TdFdSx!4rVP@@D|k)~e@! zU*NEQOCq=qxL3&krU*Vaf^Ul8CxEg4<;O>7OK5MD;$I-;N%6a?BvRfbszmtI9yR#W zrMx{nO!#1fU#ikAysz4E0CCJet;*E97A{whS$Mv>*1`+aX%=3n)>?Q!waCKzD_C;! z|7mrA+QY&Js?HW(r2e(P?;ZLtR}T%nG&@KUwX!j-Dj!pqbc3siOFIP8Nc!fI4!gXqcg%4IsEWA=pv+ydlhlN+GP8P0L+ZTrQ zYf!IQxKZ6_;WcWDg`3nd7H(DtTewBdv+!C~VBvMDkA>H(UlxS**`PkO@J96~3m>9x zwD6(oObZ{T)?4@wYO#e6SA`ZnLJhI-CY5U8Bh}Z`naMw`j#95$_-J*ng*U59EqsjH zY~f>7orRB6b1i(l8g1bdRBsEPsD3W@w4wHTlKQ~HC#$C{e2Tik!l$Y;EPR?;XW`S; zA`73Prds$+m2Kg(RGNkVsCJZv^*dX=XW?_y6Ba&K-C*JK)L9ljUmarM3sj|rFI2NE ze32Sy;fqyI3tyss-Z!k@rRpOKZ&6QM_%gN4!k4RaEPRDJ%)(pMG7Dd+W?A?uHNwJI ztL_%QM*UbC*6&*NzJ;$-Pg?kTb%TX(P-j~BMzz7hH>raxe6uRH@HREn!nde23*V}~ z50=DG|87(7Son7JsD15->ZgL_&(Li!uP9x1xt9) z?*a9Og&$N8TKFNg)xr;}6D|CRYP9g9YN3T6QoBDFIxCzb*F{@ zqAs%VE9xiz`~!XD=hq}I>Ex9 zsRj%GLoKlI=W3FL|EUI8_zTs+!e6Q{O2Xy)mHLZ?zgG8Hc)PmP!v9joSoj;Y(!$@W zeJ%W*8fW3})ovEvpBERi926etL<8`|Ifz-c1j;aE9(-;obGmwDIHXm#IIt@Bsas zg$L?8ES#k;w(uZ*jD-j5)fOJ27g%@?J=wz9I?KX2I>o|6_4Xo9Tbln3({ETfS3hLo z;rc2IkI<)Bc%*Kz@F=~=!g+d{h4Xceg-7c&3m51e)57|V(eGJ!tbW46^fn9E=`$^Sux_#NO1;p+tMqsauhxAnT(5tc9FD(1zh~h_{ji1C=*unK zq&Hi*S=U;)MbEPET0PXl>vSgzuh(Br3hT2$zi8o&`c?}cqW@^&L-jffAEx)W@E`O< z3m>lgTlfh5%fxW}oAmn@K2kqw;iL3c3m>hIweV)W!otVsy)AsK&b9Dyx{HO6*WXPD z^hsAI>KA}DoD%RC!})@1E$pas#Q*K!r#my%vB2b){?eTiHCy&LtM^=2TjE zqch0DYn_kBgu~BsuCnkff%S$L^) zpoJ$o85SPyyfZ2s{uzCRg;zOM7T%#VE&PpsZ)7<9SNbXoyUq#=cW{PTxU2K|h;aB+ z=SB;^pzAIClpbZ_hxB*D!{I;F_geUMeYk}`(S;ViL?>GK0{!RQu)I_CsTLmOlv(&H z-P6M7=y!&N!~a!pvGC`*#=`qJ1s48`{&{FP{C)a)3-9GzZs8)Q*}|9WVhgWudRusm z^KnjCex7rih0oMSS-6)o!@}L1o)+Hd{5?A?Z>@8?h37d(S$L+iuZ3^byIJ@q{plWI zdDrP{E&Q1NgN4hTxfb5f+1g_|q@~WN3EWEpOx`o#`)fVpOjI;0}C)vVx>DLE` z<^M-tXW_T?;TFzu_OXv2X{c*1}z#(H2g{n>1m0FX$HshVfJSQVTz%*I4*NU1Z_cb$1JYqCXlCmUoH1 z!@?KnV=a8D-rvH5oE!^ZrGLx}%R5IuXW_rXHV&OA%s)c(xkM0%@A9Iee@CIj=g%$a53g-$06|Ds>&8xCLPoMYh( zXQ71~o!uSJ<`H&>F;}o!)H79Te!kG+`BK_Y8-3oRck_s$*DbiPRN*%*(u>YFV5N4>_v@9KODf2O~6!{JMuyDU7`S!dxxoB|8q zroVH-;WM4PEWFrRYvD=Gcnhy~e$e6YgPmSW&G+<8aE>`0)GrkVQ!|Y@$?9Xl)NRCY zUHW;!WsFnQHo=t5F(*}>Y2i+4o#4&P@2r*xHuAfuV!=j!SG9-5Pg5xtKV5A<$mn-C z%ZsTu1mD28n|es_CdS>>Rf5lB+(Vrtn7ZYd(^IVyoXNPCDzo^#Re@j{)?-c|)z{+p zRX;5;`WSvc^?~4l?7zQyTyQ?)-PCm!KSP~t@po6NEPke%W$_27VSWjrjAHyG{o)v8PgVnVbe~3ED;_snW2)>BrWvf!bhcV7k;{~72c&HjE*p%lm)k&}^ z&s?=*ke!QI3NceVF9Z&R1 zSDix?dR{^lg|wCE9j@92>h#ro--_bBn=tgCVL9a^b51e^Mqc_8MtEwcDYv?6Z^83H zDINP0MLI|i3QzHqJQ`lZG!2;2F_b9M!Saxf8HACJxkRD=GNRC%(}8$f2)_Z_i$tOK zW>C_b(ns=7CK^ZYXga!3c*LJg6!DKGiuj9(B7RB-#mnW0c5Izca)bU0Ne(E6Ax^H~MSSOhQaUJoRE}GSdg=JuoEuI7<^28LoC{6?W&DF+(7p(l@+%Ay32hH^`%Tm; zpZtTihv7}BIQ>8xg%8!|iG-2gvxuVHONk;sIN#A8>j@)24kPO22l@x9zmzX$5=Fjn zejs1A08_qfCFn+kzMmSV&qv_a0e8j``7V(@8Oz}|trFhOGig=>!F`L36Ua$Rgej)y)tfn%9jj`1C$QxKerG? z|4Hc~JwGA}JrY2v|Mw{A=hrvn&sf4<|AKtkpRlI~@`d|RRpe3;O+U>y<+BT<`L-5mBnY88^G8UZEc66Cd?=Hc^xh zw?~u@mjn6%)(@2HGw4y|5A+lk)9ifqWo?pit^+9Lis%mOy%e07hv3c>JMis zKi0>q56GWta!0;UeIUwufO5Hkl3dEqSBQ`DdY>@L>r+rFuYVFnd3{Y3<;73MN_(Mt z$@K;4p9Mape<4w%{~)4BC-)nm>ja-j6zM*XDB|5h6zRT-DAK(RlwRF->m#Dj zi}ROS}Mi}Mv9#NEsLVF;0vhPN?ztHhS;cuGIQlX29qTCJ! zrE+TlrE=Rq6y%fOURR1TE>UkD@paN_iLlJxWZ8tJF}qV)GB|42W_hk84gFzV3;q6mDZ z&g8KKVSJCAF7B*9^`-Ekab|xC5B-;tyI1a@ z+)p9CV~G#Fsohe&rgV|setbddg=K}rAPi9&x) z59B{f81W^LKaBg7&(7QCPN9Q9nS}djPM3pDg3{&u&3wN&sNAK5Va}W4caDTPLZaW8 zd5H6qQkw|lTnfkc4`t?MpP27K=X@6yB*2H!*7ZbJD}^j%dIZr%GtVOTo5a0Ls1**0 z<#3=Ju1UfHb2v~A2g>?4!{nyOVca6v;}>bee^dMy3x@G>_CHy;2*UE; z5&kT}e-&IJxQqDTTQDvfviyAnBQcC;3*Ihxj^G~!&lRjB{5-**3Ll*h>+`W-Tu5Ym zhTt;69|$fNoG$X_3qDTx3k07ac%k6u1n(#K1;JP(;`q)Ie1PDy1s^E*T)~S3pD!4L z42S=-U|gVN{EXm(1V1IXLhvzymkRz;aHZfY1TPbOrQj;TKMSrFe6!#h!M6ym6?~iE z<$~`Jyh89@f^p%K^}k0j22aMWB=sXlI^54XWe(5(ooBS~&i(Bj4u3~Fh4Ni}xx?e3v&m7YBFZ_%Q7CHV zU~+{j%ot5cIsLVIo#h0Zg&)xtcqTl%6uWqm!I zR{D{dEDx0B zy`a_k0f??urMcnkRlW&OJCqJ9{!SU*sf z_mZp+0ka&?Ye;T)$IR!D-iHW7zo&@;Tl!(VV|kz~?`7EQB7eZ>N|>UHRZfqfU7*Wi zc`p)$yf26j*6Ihrn#u{~$>k3@7(!VN*8{j?>cZtn`wSG%0HH(0eUwm3PY7W>L0Qkg z;9M=m2h8OFimqQdJspKEo%P~&i*&y%_$#7AwEB3L1k1I+0G<@EGvCp|gR zFGK$h6c1=`p=c7E4z5pd=W;+gFtt|>0gUbQ+YCqvG5?W0Z?wmeQD;=0$ zaymdc9j{9|fH@tYoQ}Tjqyvr5D;G>LIUTzT1&cAa2b9Zn!I<*0-un_oJeYzq#ng}8 zYluSMI&sGoiTRkCu=`;`t@L2<;PilUdfw2cKLfsj>J2FOd4ZoPWsQF_a%8w5i9y+&)3Aa{NHz1?70(mU;-x^DEGMNPdQ6=2wW1=R2T0uL4C8 zupZwKg?t_-Fqz@>M&m=J<$43k@x3GQ0dsty9N+Hk$A>93$IJBw@$h(r|M7ez8t-wE zPEd~bU9EV$1ip>rfbw{h>8K|}F4t3}@2`?BE8p<_#_0fMdGColV3r5U@&>e)hp7bX zjZb>cFH7!oA{Uh9{?)86JHT8|L2svU107Q@px^T%@6CAfUJ!YpEbo1h2h8$7Szgvo zA{Uh9 zen^%Tkbl4|50t+jhB)fal8>(n{V-m-&lh>1Ebk+c2h8$7S>7J4<-IR*x!;S{Peji3 z36$l2toa;*1I+yZ=%W-q+cD=4P%hDQd+i@Xw{r5ZUrH456biNK*)tL!D987Ai4U0L z1LgQ~TF3W=q(hTj=+RZ=^Eia~xSv7f`-^*Hy!fAz_(3`TPq5BSa)BQf`Z&>{GA~3t z?-2&wE)+u~39DMT@d&lJq_k7zz0Bk_WAyq`+Ezz>sLP>y%l&f`rW`Ot&=d&uYh z4z!fq3vj+f;^*-c?uQV*0N=MnDPEx`iTfEs&lPHw6DkYW3sBbgGwCmZ?;w3a?;(og z(a1X1>n}pN-9pbDf)hzTaGFpaN1-3j4=`Bpdfg%l>#AM!HZ$ z9NvoeXNeb-Apqc0p)nUl>IwkmJiD9GEcrs zAsJuNVwCUQmvAyEgM+;Cm_GKp!Mp(0)DgzE^t0t0!m_91keR^DpVgfmuH2 zqZH4Wo%iFY+FYKgBp>D5Q|KUxZ!A%Sx6a1y>4m|U^8=Li`d0J-MwTlF6#pq_T{uU+vv0PqlP+^zVY zkoZ73z8}c)75o8nJfQebIg^9$qQ6RfUkm-2DCD{{0`~y_HhPl_?w{3 zz6sp-Bn)cBcd5h&%JFH5518Wv<@k!*kB`SgEG~?Yc=&rG8sEhdA1KG?NPNH?A1KF% z2XCX}VchghYA1acN_?OkpDXbJb9|s2-;DO-3qH#Qwd8FS zJwaJss>nn6vYv2fd7vzBuE+zQ<$In?mUqTKFbBY zit+)}lKU5t3(9gki(KSC%Y{431!cLVA{Ts?3(9gquOs>3-%J$PiU%KcoX?;fPnSqM zaOZeHIi7tTb8hHOIX{Gt>}ezyftmIa{EpziioY(}gu}=2q2&Jvao;W!i&*TA!J8>M zMW!E%94Nu^KMZq=)4&}A@p0Jm~XNBwL*6Y zyp>-*P^mB={wv=obp9oX~!!5=A>JB8v7goha%vhe!Qm ziu%Fz>Nq*aagNaQg*UC}Ke(d^@LlPuKM?)JG3P4L|D&k+J8y65|AD(C7`ms>MxmDo_4+CspdSolO*RnksdU4P8X^$Q#2{2JT8Inttcb z&k>5Nj~w3Qe@{7l1U>@f{?-cjvg?=Rz zT>;0xyHK7N!T)}OYlOB4_44&}!D#9n9!-)dnh?{!2*pwcV@y$)VvC6MC`G8-zYX^kPSSCA3Fp z6TTl&xQ`TECiqaHWWR#acZJ})1ivBpL&2$CjK6fEkT+QHETMCSE)%*z=vhLq7y5+I zw}t*9v~yP@e}AD(LXQ`En$RbNJ|pyfp+50g51+x<@FQn50#Jm%{=KhcLd?s{}NXnP2sYFe(e;((_Ay3N)FslC3iITGl>p# z{e6b-38P#vrD8fy=$S$>G_pH}E~Xedm|_aY)YFsoD05B!iN@i%v!07Y&jE6O3Fj7{ zlz1(Fqr~6$vc7hcqjD%d&})QZ2;+F)6YPi{J%nNlllhfI5$;Z*FNym%LXmaMKU~`B zJA!{9dNcO1q`l523Vn|g{12j#>*>9o(ox}>`OV-U-CVA7q+GkX>JjpXa7Ci`I-#B% z_P<>G4@db3|23gGqBoY7IDJPDg`W5XVf+kH$WN1WtQLwZ3G7Z+PKf^kQIt1bEFgMT zBt3_bo(GwGHO`Z&7&Kg2cXA-4tj!2A`$AL07@V_y1r99U@XxjFpI*;UECEu@*{|@1Me5#nn5;FA4o#XeUY^{EZS?E_4G? zr2jObKZ<)_>W|_7Bk7l2B!K*t3tcAkM56F_y5Mbs-w~=h7=AKQgf9?UFZ4K}uL=EF zXcy_v^N2$JRKW`cZxnil&})SMh)_hY=-e@v<9sQ{zOMOR#yY}j#0T~K9YlDxx&PwC zTytIw`rb?Kpq@YOho(zElp2&@3;Ekm=1;qsdpY57hY){%bN|xG2*R;`2a0}~uDXo; zU59l6DqqAqL+bSsp-n=M6MDYTTZDRg^1Sr`nYZrln)L<9`;_G0;HWH-KUU}|LNV3n zcrg`c`i{^YLg!OF$hSi!K6K&i?=qq2A{f6b^jo2xUPn{>6QzH|q|9^Ye8r@U^W#@p zw}!q$B;H)1p1xRG;&^!8b285L3VuT93qn2l%@l8mYwq!MmHS+gb7vmBHil{Igo-`$Jv-+&=R$7P1wy_0bco>7grcise-8_NQz){U-O)8M#SqK%pF)>Q|Gir1b5g%P5c;D~ zuU{Q3^=Z7&V}-sW^aG*F%QvB&gcb^2Df9-S=oj7+{F%@ngeJ*6ySvcALQ8}$6j~*; zN$6&w=Lo%A=ruxLA-dU7-wJk9O}^|Vbhyw$q4R`R3;jT7Z<*Im6*@!cg+jZ^yu82A zT%qHH&J(&s=mj*-hF%W{-9Z%jqh;QlC3GrLtjEq2yhw1Z&?AW=-2Fn|B#Qd?xlnH& z-dX0=eT7yEy-es^LO&MTH{Hk?DRgh4)k4<^JzD75La!2fpU`)RqMdYz8F~GMjup!7 z?ed_#@wk*P|9R4`J`?)AP*>Ust`6{gb*5mi zU18|s{KM3V_a9yn?0wIA^J09uvp;lwOtDnM6iX;fHxWg;whG48RgMo=pt(F>5&j3l z|4OL0Zs3gF+>aM`ORpl)tD|f7U*PWrk@u0% z&Jqqw=A5ry_%n!K?3#7(lt51&_x6@?@BeXkF7Qzn=fZz?v$+640tSg1brTj07%(>= zAhk(ImMjJcH$}@io7+MnxtVM*P+EgxjfxdpYN@5C(b68Y*pmphwv~dFwzj3Gi;z|= z)@^GKP-q(!Yfj72?|J63?_@IXIEg*q_xpYO6DPa#pJ$$V=Jw3x-32HACrr+-S$Kwp ze7=AyPed-4U&ZnXv+#ZveuafEvG6x6{4)!|B_VQPiXfALj0aW?AI>lCtSipzE83e-$OqOV)$jZ)yU%SWba>K?~k+a zGz+f=gQDDQ3?UugS6RtE53;ZgLy%AWc?iG4-am~Yq&v*G2z&o~_Wm9Ap7{BYPYRo7 z7PD{-h9GYnd;d8W?!yq|a)0Oy`+O>!cjjOS={B(U53?}B!V4IJ{ocnAoX*)e&%pcj zEF}9r@cHlA{FB1whmTi(D3#vG5ZZ0*~JZ zO3KSV{~Qay#=-+Ee1V0pu<&gRA^ljKZy>ya%{!GW46(3-h4--V^DO)t3lFex51WU+ z#lja^_!b6;Ygg6JB5WSSXjftCKi5{g?#>anZ1W0m)Heda3Tkm?j(evm4q+^6FZaf z0rC&C&$qGgi!A&P7XFxpzh&V73zOLRkj}zf7M8G(tmi@gzq0qA!Vv0rKZa0mN7(1T z#t_;+U)TSgjT6bNKVQK@GG2hZ683&A3tL%uKMTn?0UQ}8Ap8;gobS{AjlEA~{rgH5 z=CZH|L(uak_P!3o`(WM9!be&7J=X7k!ot^C_#O+nUwSR;@AFx>7(!&kWxPXOASr}sBr&;(g3lC!m@{Y0hud(p2 zEOfK}I*El-SvZe{0T!-i;q5Hse(96!{SR1pl7*MEe(hu78Wyf+AykXy{<_@{$-WgF zhHS&nFJbF*DF4^+J+zmnS-*RZg{Ro(L=Nn;ko}E?Y=6TYNAIg+dtiKog=bmF*Hu@u z{z&!%f#1g7^K~E`8IpQ{qdXG6%tF2&;bHwSm4#DTn8U)4v5@!YJJ@?rnaJb)8kz)o z|1=Au7(#owz}|yNNIecI?+vWHt~iUI%lJ`0u-7K0C)uxsa>0=%kJ_AopSRp73W*4tqI=ea?ZfmIN2#4CO z+3n%BaCHrY_5824P~+^nP))~%U~5NBb9EC^_Gjzc;1ltK#)jr0?;D!ex6t_7mge?w zU3Ivcylt2r4mSqd!`0yqDzE|at`3LTN5PIlhP8*nN;R=3ewZb`0kVW`slec?Z=9 z;D|y3@4Ct+%p%oon0Iiel+IdOtVOB^COHDugeR<=4=vc?}=6u(B#H->z9LHr;mM@WeyDp+cEE%3EX#Sj@RZ&+W}cI&)(x6jWH zRx~*9^}v^Hu0j5`+g4XLZdtUkpuHy8Ss?N2TRNIyDrjhFo{dS0eRDBMaowu6{FTLd zi^2uL(p)JC47!9})xH_oIZG>6wccFkE52o3aLERVtq!*|HPjNkU?s){Z(e@KiVe$K z7tbrL3+Ce|VrfHdZOtu|M%g*R+=|AMwN3LHn{TciPUBoe;Fe7UzHNPZ?v}ZM_T@PW z(Hj~&LImDWc_&Iy<+X!r9S_LTT2$_ z4OawkrU%+8xZ%#u_T1aotZmwuAH*6MBD%Jzx;6;&2vw$~nWX6SS1&27@!!c`QiNA73CzZSaoxlrr3yO%?aM#R8m~odQ<*Ne`vV& z)gj8>+DX`(3#tpt>K1J%D4DNdYimR86kocr7DdlpT6cTBzoBN!&7h3jx`?+>7g|rW zuWV>03EF*y1zR@Ua%W+6a9$y1DHy({k=n&KXAZKPa@LeK-;&=^wz4o-iKxT|>)V6i z?h)~UEf^ncE?Y8hQQ5NAE#(U1fZaKsvz*{}20BA)Hm%C*oIh`PX*t`nh_LNB`Mz7% z-a7a8R)uB2|81a6x2%$M)BH8nZMpvSn{%7z1y{@6)NbfyHF>DEuX=O&THoz+TdE6# z^DsBDq#LSRNfC1j2-{H>uB-^Is%a^h6C|xuWMPyHZ*FB(8VHl-)l^=0Q(@b!P3srU z3ldF+CV)Y%c4H8{`;DPG2-<1)-bg#u+Tw|IkaYZ>73z)!pXOd8mpj?6lOzRZduKeyqo7Ysp*T}Jc>&+S-TxTs>y&E+-0Ml81o+j_LrkufE&Y(ws?%a?Ax^|tlHZQ=(b zu3Wu*715=vnM{T`OV@YYmbWE%d)xeAKo;NHf{SW4YLzw7?pC_w)~1f8+|Zi&!^i)o z){fwvZQx&U+uuqD^|H>*o%Ks^t8Hml4AGbi%o}ZVfN7aWioIghs^a;%w|17@GC#Op z)~hZAOSf8Bbk_x8{6#Mcx&W>073~NIZ|?Npy7HDK)lKCJJHSfvc1Xus2QAi`=Gx-< zb8pQnSzP06xJ50^>l^5Ryy14*yK9#guf4szX5*%U;mI1BH?+6V$+N7Pl&Z6A%WXN; ztCp|cqG(jLEo~uigYrrBtev+J%dz&B)hlaCmabgVmJ@8l#v|4~OW^NlrkO0I^X=xE z^4mLtOSf!TpC4R;Nfc=Uu%$tpdjYBSpf4x5boH9f&9^L8jD)~KS%_Xs*}%DJRa5TL z&YbpT3cR|#9Xcz)3;dXWFwjz5*D!x+NlCM!tHR_`6B{(CL$YPXno{3}n#R(gn&-3b zope@TlHasubKz|_&)rlwycXIww}YQav{|#7RNB({rNw2pHQco2PDN|10aq&A(h{Z) zQhPJbSHatT>x&oFZ(dy2kP{^ClxR|%9Ghuz%jlSY$I9F1&e>eMGB1?R^%>$Mvmvp% zy=lnDvvV!>9=ZeFf1(>$jV-khLw2BQ+S{#$*)V*PxhWWKt8Rd~Z9_Y3w2+OAO|XLz z4t0`c#irc3^lz)8p~mN18G_-WJ?!&=C*RmmV?j6AL>4J+7K#Hq;S!Vl4bvVOa)Y(? z)eX(DkFaCI4g(DNu>l!YDNV4k(ip044-JnX3mn|XK!NQIO|39tw01N$;+B}|wP<0Ta+d%n73w_EK)C<~p zc)eBISRGv7SiQmGD>AYl1cOZ7&`)r$fFtPf!k!@7X6Q#v?Hhu`2JB;ut`Buu)ip5Y zSuD$7XY4N+H*0aR#bX*{VGgu;#kSai7SMO zO?)9KF(1h>xyev2Cug%5CO4VJh9xI!AWS`i9>cB9Ckc|=ah4d?Uxnmk&coy;liqOM z=@g6UR~XE(a(d<-V{#M!SW3>^R7`E+r#h!L@wTPZwzG%X7Z`YZvH;sXB?U0>PZbiV z8;t@?{AfvlxUxhMCQD0&2(p;P^d_s>;py2*6$O|qRfh?fU5`mkmabA#(chp#Ojdxh zkl1pStUXZ`lf|c_6sm~Hs#g|)JB*n92&PUx3=Cagk(w}AU`Yz_eIiV5vQZ=_$3wE% zU^If+J5~s?vx&KzY;8)plU*y4)?nL8PD^%wFtN$nT1ss1kDvgP4U%C3=xPv?n=A*V z$tGniZla?IlU;O4#ONF@uDp=Cz+mHC&YNw6q3S04U~+P{Sx$^c zCr<5d`S9elv$v4#LjCT!l-6mN1648E=8(iOx0S8@QHaUXUoC`gIS`W?>^Z1qz&-~G z7=i!H8-#EQfD%lO0b~_G6g#It2_^>>vIOSBlQNi`MLDFe#r#LG1mHHP2`e_Xi8Ty% zwk2I)QOdS{QGm&|x-7unGeHR^neV1kKFX!wki;Wh2a?49j71<5G|CkqO+D)6A4@*!wI5GU`_Kp$ek9>2SA8@s zyW@cE&E%4U*mudDL`*n>^&ZW1bc;Qb_9L$JhRC4iHd*G4?0P3(&7n;VE^UqIUKL-n zfozkr!x3J2VaMqp+~jPK9|j_Ba25#oh%UU0^ghjK@4lIw<=HpXOqNpi@(G)O!CBqN z?~aZ5PMf$c02Br-YcVTnd_ zpL8UbR%5<8sAb}+kNlw${#=pib3&XqeGWB2Ja}(Hb_$L z4U;8?fjcZ_OI>43If8q3Bv^bsRWYT`l<&6ZxkCTR`) zX({b!&NjHpqdME5iAQ&~LDG)yY(q|J;*g7`vYm4@w25~a5QHd zB&EIbAoXkT+@NSEz6`;%Be)Ysavs&$22DANvkj6^T&4<#Fv)f!+kFVOwBmz&?M=a8a6UX`L%td%SR1S@m|s_& zSDOnT2UnKeysF%Ug2yQ7T`t8lrm;(2K~{p;Q+);b^H?(YUKd5I@YL(@*t~pQ+L%I0 z$vN|NX>;;4vHA1o=wb^CwXwOn*m(uI*tt4e<1scBuFe{{b9C0ooueBWatm~}%FWl>Dpy-xMYjBcyrMMl z7`?BcP+_ z6#1$yPa_;kp064PND9>mKq6F~pGG*8JYUu2NeWeOrx6Y%&sU8AB!#N;(+H=Ms|Ey; zLNyj(M4oCGpb-uw&r@}Nl0wz*X@o<`^HjZ^q)>Hq8sSj#JXQB5DO5e1MC3WN_Pji& zlB9WBxbHEcM>y4l|P9oaMYkcWpk1yUuAU?lc%yf zjZs;i#N?`MPhxT$Z6JPE5np1Et7rN1ootX_=wyTZc}_OSpXX$Q{JBmx$e-h6gZw#8 zHpnk`c@>3(zzlrO7DusINCtzUy(FQ2aCoy+Cb@IVVYc}k40mgY>=z;vPc@G zn?+)jein^!vO%uW(;{hytCEJk4#8l$ocjZqnf#;7dAVicyKF)G{87?n55Vw`M{ukuGpntYW*%3_>skgsw{ zX&RMJN@G+`DT{HkLB7f@rD;@tDT{Hmfyy(bX;iK$i*dAp$~h%z@>K3AjZrzMEXK(O zc`7HBrct@6EXK(Oc`8?xrcpVoEXK(Oc`ApMrct@9G)CpLvKU7jj@SLHU-G%B~5#W>nPTAM{DG%h7Fo3Pc?9`DAmxxqa3Y~ry4$3D%AkOqa3Y~ry4|9D%CK;qnxdw z8cJ9y)nLM+R10q&u{PzwGL-7 zjz&#BucOdI}dY4C~oi(d`+BW?Dtq&3X8e~*h_oPf_Dh4AZW4YTQOP4>%Z`K)2K^s8qLv-!^^(cj)7 z@A3DJV(IYVB;u1)P+ir6oYX#~U=2MzSfJ8Q02Tdgx`fza^O#bvPyJuwCwtaG~IZ3b(acMyk! zJX*?;cOBC4#Ae7MhUWzlYUNqP@DyTy8aMyGGe$OtOx$fVUT3VuZA_u=CQFs$KeMEN;(=E>xyGP%jxs2 zE?*i9tSa7A;H&hN`fl=-_*VHU%Y4NPD)REyR21Z{smROqtzA%&o9kNzpR9sUR>3EM zva&Mx|1G{XtIAg0JlFT>RjY4WbW~-yJwd+bM%E;9}@+S81A^z~5^5+{M6(Q|(^sSxJ zR|jdU8_DeJtFwGzt9U>B1TOhi0LukGZfq4vGrCo=le;e|0=j6gYsyTD#70zF9!@`f<`0=9Rl0~Iu{>9}1Yf;{8*o#->H_44T zra_)pxUP=Nbk#zp@N04w{!B5dc!_J0%f0-csL3Sw9bD7b)Js7JfblnY@l^o-;OA#! zFaGxwi7RyAR)G0Mc?*G?6q5$OYs>zAA3hYhW$<~bf?Fubs{>|-P(H3-mc-$20mIK& z$6h?&u@W~3Tr@`6W&bl6MAYvU5Rf8pTwX-t&On5!yw6J9Mc`EVeqQ2E!EXs;JK-;0 z-a91jj03kq;w}JpkPCy5%PWw$eGs84?-Yr94meeL{|3K-F52&B4)XdX?llK_&q>^Q z;CdD1__D<9f%o{k+WZB{$m`P**9qlP$*Yz)Y-cZVVGwe8B@#CPoT@!vBXJ&Rq+UTD zZ&xmf^8u%l_Xa2++PM(8bcMVZByP2Xyst`Jy@R}M61N?=OhvvyiTeg{c?zyr;$Cr( zca6mT-9g?zpq-0$$%fyeSLt^`;+6rY((f6G>jG}Nq8txN+&6&3v68=d{WeP6Zyn?< zmN?H?wLGuHEd)-b-@BlIXqOrXdB2vpJ;0seg@6#MfxNyiaofjP7EZ?e#ksFaTn-Fs zM>qr_=kArb0pL{Q&_;=~#;eDnl@gZ<+yzCxMG}{EiDhLexEzVg0WM9!T`qCu!1>Vd z?8VC)FL8|%)brM#A+1<%VF&ItiQ5X?9-b+LJl`KnTpAd89cI8@oO?#%!V}fpS0pY1 zlR`EZ1|bxaydIFai@=>{aTxG?J0$K5_#gY>GydXSt;Fq`te#g_NL=_bXjck(3ngy* z6w5lvl^67zEpcnFP?zI!i7UMl<|9SENfPJ1%CdGTxOYJZ{1~Py@;Z36Z8Q9Us~UyB zMeaG^S{3qMlDI6dWvzzK_>0^5S@=Mdx7BM|UWL3TByLZJW$oj_Ams9PNL*LZ^#uDnB}_%IFoz_ z4CPhKF_YH=oXI$J(NJFHTr+w5fvYmGbMid1c2EbLNjZ)f%1bLWlNScgq@5l!l$SN% zEZ^k^+gWBNugVYWS_63n zi!BS+#Qeqol=W*Z2mg;p0?hxExl;i%uKXs;>gGZ;@*>dq!UkOFGBbI{mYbC~X@wbA zx)SC$1O4`{GLsjDLD!`HW#4RBgS^r-_Ve9h*6y>Q^IkBJmwu~|neeCF4$^Nk(=YWC zX8NT;1{V$VOZ^wvCorgw^nW$$zpX*b>NJpdrpmJF4Y&@C*v8*BkZfmP$?KI$$ z+sy1--fq^!adS1(u$ocj@sNV0Cxw;)g_n)2QB|l^)?+9?cP)`1GlGplK%X*GO z5IS*L4-Y+`;T*U%u{0>=C~zu&SLTv-4o&DJFX<8Wd@jqo2pqT^v6qv)%Fmf`dkwik zL$2cUX5}c_1?S>idBH?-dDneGJ%7mDu1D45smw*cXj!`r^6mVRdc2b5oq0^{zsTIc zmxrEjaTR3F`U?0PvD&rUoXqtAhfRyWoaE*F8=PBl2tp_BC~(+U`OAs(epS6cBToo?_gihrc1kOai)sLIWI|$q!gM2HWFst7I;PxBH+w--d_W+#A zyM3>E{*ddf;_EPf806av9Jo5Mms7sJZw$Rx;KaQNTzyQMbG=pkyIHjBP0UK%vgs#vbh_0|cTiM#>e zo;Q%U|7o*!n({5P`q&QKNrQaX{)bt<&jV-DKXSl%fuoJl#7zis9>RRL!*P96o$ zWZcO9j{00zF2_FLRP)xENp{_!**wpgaaD%g^T4Gl>O;;qV#vK|$PF5D$=@|AZ#{6O z2Ibgq$PF0gTk$>1>N3dp7;q-_oArG&Zo45D1 z$VCk~>yV-S47nmhuF8<>GUR#;xg&;L)R41&0Q+GE?X(CulXhAKT(*I{9l)(M;NCQp zmvY!lUOjLo`t355cOJNf2Ia^)0_$!At_nESJSfi#M-Am&G?Z8Mf|-81fiuzXB5+>I ze!1A6ayim}XvQrBuE-W=Imz2jchg(5`kH>UR`46T5hRq%Oy+lHZvIoG-yvkhlA5;UoSx z#xDH1Wqr)XVsSFJ8Mqt+?n&U_Dr4-$^OEKL%8-jYW?3_1(rn#jd9w_;TYxjsZ@VGa z2VAa!e!n;5F8zhNJmO_&H`6pkndH$RL_HQy{!Sxq`iCwxH$&-e&0~uc|&;_5zCrqkndXHZZP0J58P}6 z?gijX>h~Q(c^Sve%{`m~Y5!1nxS6@;(aO3fo)@^iiMBv4uL3?2^F8_+oDDGd4;?e zCH=ZGZ2kVM(QhYkbqaa1eiwi(dhR)aL0HhfS&wMS-)<0 zNYg~WSAbLPvxX%7il*86y`|Bw61Z*y`@I4jwl)6Z<&fK7!E|-|%aQbZ4mfVVUug7u z3Ak*C=P#bGY`+U|>C41^r8Cs_y9mmFim}&z;JALrH2OUcTvaTUbN!~zbSdvE%l4}W z&W8gxd-3xAT+(j`JP3;GE$qKP*XY*+-1AGgG-v(RZFVWoU1a?Rf$KuUuou@a=7+Jm z>VyYwr*a5F&h3%Pu?IMAXMFY>i;n-~d1gOwZz{%JxgG3;%W!)X`O4+Ue#B*kal< zu3t#fujfm)eup&r^#V7bSP#nj_4KI6D_K9!zOwz&o^mPoCuRLwf!nQ+_oAd< z(l>4W@HI8`LmLKrw-cs{Z^yjdEh#^FbKIk z*?x7;nvFxf!0lAX`xi;SqHo*!o!01A30#jto~+*haQhXUY`;CKQrTxlf9kH>Pon`%A0WL)`UcG**eZRAH3rMj&i94y$2*T*JFzi67R-=8%44FHGVwZmUrp4>lDGtBg>1MUnL z1|gTXSkkW|)7J02M!$8y9UWr}hrn+4^13=;s3t zzx#;4ob*ebW2Rpna4B2}2<3nNVf@hk8=hnc4+WO&lu{rq%&jHst*3OvAll9A4?pChfWc%#~?x-y;rr#Bk ze(Nf2{f=w&YXq)9FG z--E{OEZZ*voXUUsfuvv6T3f$2HTtyzm!_x>S-)=JsuY~8-x=Uk&t*L*=~sE1t>1rX z^s53+)h}iJR)4~66qpnpJq{Kf732}!@`zuNl!QKR1ga2FNwWc|)po3+1nHEzoj z$F;Nj?=_NsRUuoyA8Yh$1OJ;8f3@`~~*<#C?W>4Yqzi z(&$$ToT@#``ke$$weFGiYpi!$*xvbzm*a<$ew7<-{rWZfRROnMAy3xt%_jA{HB7%| zw-r{5r@JKmqMh#8KFA4;eiwi%Fz^quy4+R~HwuK@F0y|0!0l3S*YY&X78ij_S8(g4 za-?mu%Q2uSM>cTfOg4(;`pI?<-{UsguZsYudVWwYN7cRRez`y@M+7)N-oK_PM-({K z_$Qa6{64e#=mt*ZPmYuH%kH-IdtIa7Lg3)P*vrYzM;~xoJ7SbwA98!Ce9*1@o~&1( zjf>-fXNRrdiyHk>fxD>4SGHfuLolx@I9b0ia4LUtzog$q;P}4d4>kIwd=|z@h5sk( zx9*GTd}aOK1TL(QC%4nJkGqxU;-8etu>&|>4m@u{*9iZ~`;I-p;h4i;PVJ!JY4!Xo zmm}+2;J?6G5r1)caybT$xUEGTf{=3+QaK7rd&T6zd-6A=#n-}@ z&DQ5#z#T+`u@{%;mG%3zt>0mte!w+yVGwe8a(n3oZo7h$?OgB*lvlz11=^6<-?Cv- zgO67~)9AMlILw2;ob=lb+zt*w$T?X*9}JE?3hs!c-%;SWe(!4ZI|-auAy2m71>jWk zmaJd*Z`{g#^v_EA`JnS~{eG&^uK>6r1O39l9aM0#epxVh@8ZSGwQrnsWVq zsnPEkaA&v>L7r^CgHf~gSNJ<<2aq3sanbpben(+Z#Py44^g9V$Iu`~ZmnZ8t09>7d zlkK+}oWDH^Es4@aIlRen%JJ%(l74%E1U*l*{AIHP^wlfb>C zm}e>_{r05B#oFl`8vS~KQ>}Ys`|X+%r}QV~`YlY0vv$Fr41e*W%kA{ow74PP3(L8y zq;i}Gj<*B+{$DIQ{*(QZi@;S}%5!yYr{(kGjP?_E0(a3C7i;%_P8`~gb}X>NCSE0mh z1+EJ|$NLPJJ?DH9cM&*l7d+14T!O@T9*!gXm?#gTV%%9sB^3D<$rtz)caj{{g|G z{XCzu<)sPSZzL{R;4T-qLlT!Na90T2mnAM;;I0(7Pf46l;L-)|6B3s#aCnRk(Zo(4 zlehwbyISC`l(>Zgca6Zk2ZM-czfyto3fwOxu0r541nyfBw_4yb1@3-{TPJW+1+HG= z>IBXwaEm0aQQ)QtT)M=C1#Y^);T=EGE?WieT7knoQjyyZ9PdY20{0z>Oa8pwk7fwm zmnE(axO#}k{yS6Pa1ImmJq8@_N7o4)Y+n!IP6}MMz%7%wQ^4{5J4@geN?gS*n9m^| z^_wkla2!1(-#UT2Uf?E6+*aVan7kZ;b4lDq;COj+1@0_N(xP2FU$D76frINLL%3w% zDp|hy0{26STL;{3#uW(Mwe}saII}fzB?YZ?KfB8J|l5^f$M~Lv@<^M zz~$W`ap_;Q+h3u;1to4TaJ+u!3*1tPOWkdkcY(kaO5A?ndLbV5V{Qy7?@WnX_a(a= z3k7+TCGI3}-Ao=n@5RgOk+^k_+4|imaBsoiVmr71Tndx-ae+G}ah@;R`V|S>QHk3M z9NHJlTP$#W5_b@|F2Vr;~oi1nyrn+$n+kR}FVw z;DQ?NqQF&Yxa6cfosul7X=RI2PgX__t@?4 z4h@$saBUhcTj1I?+(Lm1Yq$!5>(FrP1a6atYZN$~bDiw6Rp2@`+zx@;tl{m7RhRYVXdo|u_Xt?md$C2OvKzX>f%{`&vvcGAsf4`>T_5z1~0hV{KhD+UV%lo>9+W}l9llKh`cM3SPDdzj{8m{1J zTOQiSsXn#?$K^e#;Z6zip3-pHumQ^DeN)422acC_zlJ+0$a`ADW&ej=AK%h&dw}bL zc(mVtXt?xVyWVj8aI)Vn;4mKL;ogT6SK4Rq=RBj~jseHVwF4Ti;2B%LgBor>a62I$ z^?O#sEj(c7`)v)k7r0I)?>ibU{h%%HISscRI40t`2FqH-YP7@_wM<>b_&kJFMYO0>|YY(QvDuv*o>@;f?~w<^52@m44T5 zr!Q)_W5DrtdQ`&|e9x|rA8EM#z;#1B*2j-ET*3G4e1D?h_5jD*)k_*K^?BQVKh<#C z1@31W?t;MmT*K8JvhzKr;Z6cq4)JK0Uud}WAJBUM$o;2=TL&B;uYRfFk`LSU5z%nF zfLjaknD227cV6IL)^Mdq?0MmYhT8=k&-bK;J1=nk8m{yOyIuWC!|eyI2;#B4zZN*G zqcQN0zs>`f1aFXg6+#dE!}l_GLEv7~a2EycHyY0KLp$G78ZKGjUe|D`0{2@Dmo9K` zXgHt1MKxTu!2M3c6$sq#HQYjh`-6rn6}UGwT!p~>QNyhkxc|~{>jdt!hN}~}Ga9Z@ z;Ld8eu)zIE!)+C~a~f{Dz@67{I|S~}8g7@s{YAs=5xBoQU&gP4VNx(A80tAz~O~Dr+Fb;;9MH6K;YaOZlS=%X}D5>!?R{5 z{VD`5Uc;>xxC9NiPT&$XT%EurX}Cs#8>8XE0ykE}Z56n28g9G5C2P1H0ta6e=V<3$ z0ta6e=g935xCt6=ufXB=5jfTFeu0~);SLJiBn|hxz`)*aA_Luyue+q;VuZ=6&miMz+EYDQ(>$T{Z7wOd;F`?aLEE!t>IDy zu13S93tX*+^9dY2pU>+}E=RV&g*04&z^&JC3k7b2hAR~~e4f-vzY2kC&~U2-?sg5g zPT)3bxH^Gr)NqXg*QDXX0@tkJwhCN}hTAT1tr~8Jz~LP(Cp+&FxHb*9N8s8u++KkT zYq5_YUJI2Ve0Q=FE!jr;GSdL2@SX7m|fmqYq-6@waP9`v(md z2F}amoz`%>1n!)MJ1FG)R}FUzIQ)JZY|rm#I3GMn!RzBa4Oby>|Ilz@;CMUzK*Q|- zj@u;;bad)(`vrN48ty1?*k`c3@YRBj^3o&rInx9UcMv#U4*1GIM|sD9t77?1(Qw(v z?ep_1HQYtuc)r&NoIJjyzHE;#UV%d!i1R`^a9*aLPvB&E3k7-81WuM$3LMvOhK5@w zaI-XASm1Is+z#M+Svlqi+^}+-uN!Wd>;bNb*?E|XXc9QN92LNE zJKv$Z3!$ZT%hC1;$%!&zl8K)^FGEZT+?g+~tr5R8#D=2e|7mjlGRMYdjG? z61kth8)v;!J)8qokZa{JKe)xC{JzcF^&5iiZJTDdT<;~X+&S~-7S5eJXWl%oH-~&e z|DT(aGk5M>ueTsCr=Xw^BdW&URaW75xiBaCa=}byzq7389*f6__yQ80W#z`tjxYLN z>*6EuFXdS)xO^jZJ2MyK-BdD z{8ijA5z?ci%lc?;miOOI$9ebQaaQbA0e?+vU*K&GwKcTVd8c)Fo7%@>?3W(s9McV{ z;Znq`v+pnJ@~8SI_{Vxt-ZsDcDc6%!X6DkV%d(&ZWBYSJ|HR0lK~K)1!6fh1fon)9 z%HNK2l~W5%h0jwU-pZ^;DIPzjOC;$$kxc(2R_+WxVnfLGEh1$%@RNUGcsO$9RbWY1D==3fNh3$8wh*<9SaCNw&oiKU${hs*Q zn&#@7#*jDM;%yH#*LgvV_omQh?<$J6h1y$Nn%hHTt@ocz1gl)atP(F+#Ybv&T>n&3 ztF~3V0WZ-Rt$;RI+Xtm2e--t)y5UprBPG)!6MgQe$7e+?A6hSqlrO_iLv9uN&LUQs z>Cg2SGOHv8CXyUz{QHMoq?NxKtMh#$u#Kr5W}O{ez6~tV?VsSqQr+#RZ6m?o`)*e- z{)F2>_wLF^7+It>r?|J^|fgBQ7{M-R^fQ+a`B^y~Gn)*?l*Z z#O2L76iD~X_{#|k{vugHfBazi8-oRpC-~w2k9=>?vhL~K?SIgJ#51A)OYrVU;v)3q*QY(+{?jZkD>)LnYKEU`R@6sFQ46Gu@xFLE-uuF7EXyrWjxnqp@saB~Z}X=H zGKucfyY>#cdu=@m$@oD_92XhK`W9__sOOQ5-aZUp*f`ePz1Z?T66*z))x_$oITQ}s z_2#W^Z6$BXh|$qnR~-)Fme#3Xx@MW2Ua!=t?f|X zq2_SoX3{YJIpeA8|JrzZFS8Yt#~wld*T&QF{zNa_ss4|fk|xq80Vs`8&kXd^l#eJ^ZYYnBVa-F$b+n8@$%K2Ov`%v4aP@5O3Asp%qd#g89H#Fijub%UViXS%f!*7#4 zJ7x(PyW7dwZMoSTM^DKp+R@bct84lWBSLF zb{!w7>AucCE|5&>p}{|~9IZT=`D`#dw0gTTGpeq_PYc-$K%cR|ateJizZ1NfmNp!) z==|d@@2UrvIC5lj>tfWy1@Gx!;Fv#qS^4&QEBjjTC{Z$u!uM6(cl2zsHF2rO54mo# z4j(;t)H-r*drJJdE|_0CTem&f2Qw)3DC*MP*)S(%BoJ*6ooOvvnBl>{54Xm2#5_~s zU+c5m8{+*f1CtXL9;n*v&bs!M=w?@z@0Fe{cV%U~LdWane|x`m-!{)%$yQ1rfy_)9 ztOpYd+-qe_s{-vNjwv4-*j_c384v+m0=V)kXK%3asNX ztd5_kPYNXUtlEOM?tv6VTT%|WS^FSL!vA2&Me@a5ywh4qZnJJ&-v&M?jy=RbrTJNq zpF5Txujk|(ssZ>1i?{jn%JY`xFYoqmubzSi>+zt6 zuo&xl*WisQPnK9GX85{yBGPF_{XwwBeT((86WZVt^i*bb4Xcy=*$QAaqG|!w%d4J zws+LD*S0mZlJ32}rOn$Gstq-43e|b*L)C5Jnou?PSZpj{6<5s$gLcQk0QqvB+&d%- zwnPebwl=hpMuMy`8`QOj`NUA)(%MeeQqX2_Nmbp6L2XM%bC~r`SZfx0mv#BQ%X7fG ziT#CS^;hD*DsVMv$r($jZ;O4exVyOQisQ(o5N><~y429z}_s{t~~3k(T$*F^>qA@x)fub#-m56r_D)|HX3pLH9auMRiT6(Yt01 zcsyuuIwKC5|DcaGRflWq(f?7>Ahq?`c+$h^3f$xGYS=kA9lpjZsULhpQhGWjVEG~RPQ>eYYdP4{oWyH|r=NNd~x7Zj*`$rMH8{R*<7=yO=_`T(quyOcm)D&us-SNbOuI@)l z+{bfCshZL~v;KObursBv=Rxf4eD(ci1|R7@XzjTN>xQ@NWZ3*B?bKeO4japnMZM$w zUG>TS8Qp*Cwz?;lW|bCQk+HdEb4t#{Qcq^rGwyT6uI`e=m(v63q!cailVzAwbvIi@ zZl+;13$5v6qSoP_`X8VBu`6dVBZbCpO80K=EqUjZHGOeyZ1haMbylQm-91ZM{|cYG6Fd>mfGctF9S^j+qW(J`Y`q_LEG~t0SjCaxpYH8U z>OcBUQBv1nQrFn31y#oeEw3k<&^E5>2K+mxDKQ@6yW$qL-48J*PWv&;`K6!_)-QiS zJukir_MygvFY|Bnm%n|Z>-9lz7usw-^Sx%Ukgs2F?DJ%l(^<3LRRvn#=jQLbU0r{J zeCS@q=zZ%;KB8}pclfc5{}X-d($MfQe_3Db@o;9qoz^}&L8R}QhrhauL`qc-A z_|^8RLiDSBfoY@%h5EeUSKl===M~q?*^zx)c9vWcd8!TTVr-PIKhZxgN{s7I3tUT5 zl)rt6k++=8`Ixti^4?>f`8)j{=Gp%x)=Kcc`bV|lhxtGs;umXej=EL0wbVD%G=yOm z7TKW=I+O#~z_@2L-e2xTYfgi?a2lBlCz3hNX|>1aM>>{ztZ@->Zp-vfX7vU?zL!zN z{74$o|65t^*OCL%d&WlT`lSR`hP3D4j^a#GgGE>)i$JT`%FrTb#~;=9i|nD$+ln(8 z_yo-@y0yrLP*@y5X{sC?M^P7PtyxM3Trrp73zzp{{GCvacE>fyB(?@|vUXx1kys?I zcLsRlFs>AdR!L?)!)W_7wt+(Em)je#SDxy^Rq%(ecxMM@6P<9qyQR-Hb39q?E@Az~ z53Aj2xY}Jr*0r$OUH+#dMJM~Ltg)}rm2^U+YRjd5w?Cb&e6#ASw^*IqN-`sbfiazr z_f?VJUA1Lx-z8BiYYItKlz3@>N+6fydr1^mB-m!X58?lJ4Ngx9K>ttaqwOfJHy2tI zYJj$amUItP7kN$ji1xxd=W7ywTLbP*59?RRusFJA@Xor?UOiAfkQvE1@Xu^Bc()q! z|0r#yEY@aHwwbk=8v-{d+Dsj5GgZ)L@<^L0M(S{&93G|2S{A|Db!RPs_JwWe`5|p6 zt3Gqfv_M?v$C=y=(uN8mUebEJ(0VeU^<=ZwlLh-MHxhDcw0yZW4O&pAb@)f;egy05 zds7nG`ugq%OUhg%*QRtg_>h=C{s*MwuY?6@M@v&KzO&-uw5ifg^8uts~Fid8EgmO!hky`^S;> zNL*xWU>q;k_NwjM2d7!v2YnXqksLacQUs+F=BH1>SuW~=a|52o-0i>0|9SuY>_lcB z%&xerh;!xS{(|MW+8h)4E}S>P*+3wV$-r30~D#ss$Ci?cL8sll3px?Bzp8wC{m_%!njKfL6HMA)tpim%tgQ6NE~qoQXJ(x% za=mcwNDB1+j>&&I;)0oIhbt@YRjg5Lt90E`wPRn2D^hfI)%MmynGeOYeL-m3@E&ug zuU=Nx`kG*CN6l=qwEzoovh&CKTWlQ;yBILsk`+5Y>L7bb7Sz)RSqYJe&@PLwaCy6n zx}YWE?AE$?;MoUzt?4;S;vV%p8vkg*qlx}|8xnt(_{{=;;)_`iJw2FiW$k!+&})4G zTIECVFN@5DaXS(Md%R25NYd{yAzT>(NOHcpycv9iC zJ*)51@|}a-Zn_Gr`rgxnGhpu&?LDr40_h!zkud?t+dI{tHlOv9M_rG`O&$Bx*o?S+ z?nhDLxZZ(7Y208!NcwYgLl_qh;DW7(jiT6=2R+ODTK;KpLwSI?S<@| z7x%s}Wx-(KHS{mOcBib1#rKf4IDhvzThITFuj|>lFkc_qr{%b_Hni8keG&71(>`k! znhJXk9d8`_&MI+tj{2dP2KRo(mM0VMGl}hvg4MbcVRsbEjpy9Bn`}+J0__kR;nob( zaV(5;@4@;z`4MY(YW*97Nsr&#@LgDo;W_A-{>R|2BZ={m??X*341A2pzP9_{-?fV1 zOnSNNWmo2^Xiw+FEZ3_aWVw$=J5%7V37LUt=H|O*dS3ltraN*y?1YYq9vn=pIye~L z^=&xGPCPL)kmsM<6Nmes*-wE7th9ou~ARvRR6drZ3}Tx{yEwT zZDj3^>%A4dO?GC@oB0NXy=c1!ml4jgvF*#wqZq$Tan_CT@;wpb`pgt-)3SCb^uzkR zyZ4R3?T@&3zcJXgZ3?Um>>8!sJFU^%0=E%s(UB&Bo$bZ5Fwsw~J(l=)M-mev*TD(+ z(!h!y>x*c&UWdd0zlA`#7^ztYd^`H zY0s&2&V)Gy?rp_RLh-Gz|IJzn^#;kDiET&N8)$FoXoJl`^rc`|7YHf7F4P`wXr?o7 z43Zeg)87A=bF|xPunD)~`Pk!z9$Ne-D>s#mqetIKoJdC;v{Wm2VYs5O>e1#$-Wg}* zbb0HG((#=&CacR!#-=#jbBB>>5Z2P;{V8O;_K>?S2`6B5Epq!O(pxx(;pCe5s#D0E zg}0o>vb}dNNmbNmWmu2AcvmLuLeQ~f@Q}xAO|^Eu3%fo^Y>ee=K2@LO{T<88C-(x_ z8OM3-9{&Td!$S4j#_r_A!`k$_FqRQbm%IH1)XzJ7!?J~B_a%w!zJOm1-tnwJA!%WB zUF)%?z+Ou)jINyd{ax4jeT><6wL5G4%h9{6>9A{_l@@Wsznmy7%j~Fo*39G2kr8kf z$S+Eq+5h{yT)o$kK9NfIxemK$xg&A2;vN-gVw?!LP8H=l85zjwl&Jt1QGvPl0;1Yb3!kM`WEXI>|4!rgy99q)UO*~_(L zXV>vAelGhS^vTck!c9uj9^!V=HvGn5qznG-Ot9RMZ$qtL!sew!Hh;wR^F6OIILkat zQ{4?C#;g2Kp1Z^{G{c(>ak{e-Zeer<| z(q?G@*iyC1+D-8Xw0d|hz=4DL->~66ORPdJG$KZE4 zmbTP|8reMb;rBNQjk3HYD0KLqDE8BB{>#AUzm(JqT9&q%1?39@?#Q!HC*w|x>HeuF zq2GehD-LG-xumqvKkggTJ+J(1 zeHQK`drEL;!*j08+IBzQ)2Jk6z@4NEa1#Y@&x-dQ<74+7QP;;}_4Rwh`oc=I`!vot z%Jo3Z_OW#|UVY?8xun0ow;X%KgTwm7QRov#HGKl_Euik|K4E1QMC@KMKjO+o zPnJjar850#?CzkhwciS@J%P0Tw7%rPtiQ!k8!^u~O&Z(IHE`aatYeanR-7tF8l&pjm{EWlUA{in}%L+NM0*q8xhV~Q)| z>}gj9jExz8Je`>FhgjX=^X4XXr|J{9rrFWElX+pwmLIY)ywII>+7{+Ik_z7gE zH96w)TIc$$yo~Zi*3S5W#JHJof>KU&rt6i#zNDv$iQWm;G@!xSm0YkBy-> zhYx>c(CdY}n}f-{FsoF-vlgxeeyYv3)6WeiSk`ntS9vX$_cZNCUb`-~8P)~&Eu7Z5 za$R|07fl?`ytQ!0C%C?`dINR(u>J|cE(qh&CciVAd=?HvOYb0m%F7VaZrVb`MQm!I z+e~?#-Yk9<2riX{;Vu$hFYah+pF#IDx_hUv_HxUz;Ge7{cjP&t#jIj2W@TU{vHm#H zVhZbBJ5$)ok=6%qHSugePHZ)c0ymMg(bJUO7F$8*bpM*PnwgupHL#rIPFw8SzJ#advv!jj@jU4wV{A{~ zHPOLtYz;|leoV70@6+hPcqc_&@Z=4B=k|_+cXnF?O;d9GRFAI=rU`8g%kcWyBv%Q^ zt2WlVEvx7M^EQQN3)r7=^~%o;@Q&c!a6T}ZwX{OmNqe)4d!WfD=xQy2tUTiS^I}CG;_*Y%irbW+mV^62P zPqOtc^z^@552xd&**D!R>qW!*mdA)}ybmZ25^RAY&S!Ks%UhPW z+yf&$oz3vPDgj1O9Oq}T(`!1LQCmJem~6$7Q!V>xsHuT$VsWp3Hu3RWV>4T#H4&b& zO165KHIu=bR}pK*F(3bL%$Ad))5@)B@a$Tj3--iG{ehjR^}Mk2;Oe4(gR~SFsV{?h z(sDyjo*A1VzZvT#_^keD=0FFNfe-LOaTh#M#@nCAy0-jUHvbRxwWqSxD73w8=!0`l zI}_#~dPj%b$U4AVTfF6q_@I4w``j7vZ>3mRc4}+-f4HueK}!s~Ur=KHRN1l9v{m9- zDcN#mo&!sQKahDkW`{qI(hjVtK)LZ*DO_vNH6UMW%vm}&)?&t;z!vkb{aMgrKGBc+ z^*Qtzslz#RoMb1US;VJ9k0vYj4Ao4wYM}k1{s3Kj#9K4L$DzGKex}Ou;R@IFz{EZp zk2kyDRje2$u$!s&6H=}WSc5o7{q1SG7h|#4{}|dWwoL%Xr?5?p(=1tBVB1sr!K=hw zK>A!2wee)I@kB4y{5@q zqH4(bkL6o_q05hVXmMwy=UuC~uOy!AuH$|vS`zK>S7?J-)vbrz0XHf8h0_nQHYD6D z#_Ln-@oF;mFBnsTxaWBpo6`zlPCMBZ592Vd;N>~(`T%(z2IsV|(tb63PMhhU#%~+> ze~z{Vq*XTjapwe&BHPhn4e*z?(S z{spn!%_n1{kY(X_nEZ3c;{osoKGS=D%z6te7B07KN9QmvnZxF>J>LZMJnu_^ySUso zNG0}rVO+u!idk%zB+EaK%wd+V3T82GyGtW+Pf`!iV_kPVh1f2U_yaH>7SX+`YrwaA z?=-%5`!0{-JVkA_`@0FmFE|_X3$Bi!Kad8`(~4*5mXFPCQ|R1w9rR!B9enjP$Z%u) z#JhhBJ9cMd*1g=YpUD1!J;uwnoU?RJY~)EMqk94w-Q)Um*sU@rTjCgx=LXYRYxQzl zPO}c!w!AiGOSc~_kaA!Kv4%MBQ_J=C#dp!atjvjm&C%Xq=So**0=Idk8}^uzGlyDm zYRrCLkJ&5hquXowy}kGN(W6hc>@$mn(0?z)`tNwjC!NRk*@!3ga0=Y6KMCs)96iu8 zonDVO3GtrG1bA+cmN?O$!gjyoz{j~3EK1J<>4^VQY!@}rx+;QC-|c2SHj(w%LNeCJ zJy}jd4?NA92D__#y^4FQDPTL?TTRBcY8Bp1Q=lBXWiop*Zwp%_pBKIqvnc$g>L_iR zP46d7YtP0l7}$C7(&tuTc*OB>af1Jv@+s{0=h%Mu_5rX^0_+Rrk?$Q4?U8c;#%Z{x z_P8JCsBN%6blLHq!Q`$fY`?p=zP0a2_r8*G$E~Tb{`w-W0_AjQjeyUg2YVeC)h!V6ofJ=kAX~i@Df^qmaFq zJ=34VZ~w7+n|%C+0F1Z{@gh$T*hMmoRmF6jvm#pNOBD6t$)%L?PD7C9#ElDO2eh1V%@4 zdh+#q=(xBWS4@d7hkz%q*k;+iyTkLz%6n*=&GXNs=d$ch80`2* zqIcoR>SQ=sy&@8qHTL+FsAuZbC~cSY$zUsMZp8D}{niZ94%hZwN@DMK(b%NEaZ|@Z zjf{zAvh&n&5n5x|V)Mwj&ReVtPGE<&*@VDl#15>ENl$tOyvu?6EDOI6=YP9xe$?kz zrhUZcSFU6Jmid{d>9gU`WbSNf+vr`5N6)xN7`rURpJCxo?c~795pHo-;cfZn;Te`J zb{oX!@MQdS_Jj%6r2QPZx856Yce-FV_hrk1-ce*(JKeCKOHWfSIpD3gI&<#8{#5?< zGG$I#`0392q<+{5h56O#>55FYvqAe5y+MNCmXgl)etdA& zU(VVsWfHAxU{y(H*DnrwTlw>E^Vx|dtsDHdgCf#H)B47+^AUV{gFe&ZVd<@F-w^8K z3D$={O8eH$O=wfu{%}O(4b;K0Z$p@WyAE-ovEAPT_a^xF4ZSg#z3p!Ju9NIX=$_*w z_U#~|UBAb^6XBEH3%ZK~CBj%mN8NGEd)!FU7A0=z&-2dYIQ%Z_sfX1Wu!JLiCt+8#6udstHMud7r{JUc!2bmtg(^IsE6&3@c0b>713RN zG?%d?m#)Nw{%=0`1vnSEl#Th+A9b@ke<%xLQ)tfoBzHdBL%^Gz^!sygUxxNRoS*P@ z@c%-c#_F6@X6djyg{TMCeKW+PH`*Rv0KK)7J^!J-OS;Udeek&;!Hc#T`S*k@VSUQ( zE!0oP-jYV@n$~Yz@A3=PcfcH1bX7Uz6uXQ1mw$p?RefP)s2#3p$A*72okhN#0dnSL zPGV(-?+YWN`jy%dW-_~NR{nMtD>G@CY_t&n9&QWg?@3wuPZ+zU^3(er-j$)oYCaUe zFzXSVIdNuQs> zsz0sovOc=QhxJGMKdrOjf2+m?dh2=kxNyrqq5gQkr!_Y8ChJ7+RudU`S~^Ju1Lk_?VElVrk-OlHE&Bm_hV zE{}-#V0|IFt`9_1R1_Co)D;yGUBnldooPgZU6t9 z^xV2tr%s(Zb?VfqQ+4a^bm+`8Vd7A@&ES5@#H!@}L#?4=1vPT4FDqEjVL!TgM|c)y z67$_VhsooCE0j)9d_4=N+$gQglfr709B@Xk39z60lhy}CGOb_33;Hw5I?_MgsO_1B zGHZ$Ih1>jJ5lzo!6 z=~DV`-Y-|RezCtRHK4o9Qz#sH zho$YA6J2HdW%Ul;l)kUlch*Hgn7ZgE)+Nb(Ux9}ycn^eY!Nu=^d{ozK!roJtEcSAi zuINR`V#ESKSSI7G%dkuHNIi!?0Eui7iCnEMS2F`wHE71p)}TkI{wME$$$Nh7(fv=) z#qDyR-t3&Rto5c~*Me{*SqjAtt_WsdvV2 zzWw2kncm^l&;S0sBC|BElsb6FbIv@$v2+D6&3P=IeCii&vi<zdO+-L($kHXW=# z!0%tjzrj8a}hT2 z3lKI}9l|F5WQ5JN;y@6;5@B<_0AW+^VuW$@iCj=6&Kw%i+p z2Ljs8v%=>iY-s4P;u4)H4`IXG(-Agh9b<(TA#BRsfUvnXB0O6^oQ1Ht&PF(H z9;`dwBjjPH&L!h}3OIE@?yyDy@t40SFs=l0^Fx6O!NKV+1&P5Ci35@YxeDUVb$H`j ziNHANFw9+w64)yn7M%fXqT;?lrkgM@`(btPqO%M}!oxLraqEXQs2tg^LF!CkuP{igQ6}KF5k7ZtIbmI7K!ax&&(|f)L|0VHvDJ{Oh@j(lnN%L{RKtUEEc9)!{U>K>N2xt-z z9KlNrlj?N?DP1zMyJ+_7YDlz+G6#uCZy-MZWHP^hu;Z}}DTyW7bVFF#6f6+Qd%qBn zA-|jGqqGadc(v7!^b7Q3tlF6lhJz3x348Yrqcea=6OFRi0Bi{8A)|>9z6%;bDV-Yk zj5GTC@gi7%e{*|Ax~qOP2Yc^uQr#WN)WpQ#ZnWb;{duzlU?wd;1SM|7b(vt{)!M-PzHJ$?-FW6er@MjlEa7?vhvx*#1Al6YL)4rP%ma z;>pd1Ck-g+FSxvc@!dOioa(q&9<^YuGs~If&Wg?QYHMoawTaqUwY9agYmca%GwaCO zqa5c*p-=rGm46K!v1!m@3<^?m8h*`nS6v&!mz9d?F}P~o+E{H#ooY+!gev|`;2@vN z)n%&oNg|)Q9z-Bj_lj%d*VSC_-2m>S>h{D2>RvGuy!8et?ziLDT(|GqS=S}5kKa&p z(0es-$GYmA`@i(SmmmDf!!yCZ#=?I<@b3@ff7uZ}{^mLTet0Hjt+2{^Qp(zQ?Ge|_ zzP|Q`SqBrZj^9}G8js)Tni2mOTewFNPSss`ZOwJw^;5~_RPAZ={Z&Hi5e z{_2_=z1M)+wz@sLj;Ong1V2A|mHtVZ0&u?rzY;k_+}{#jTVK-oH51xwnQ8|P%9M8< zC2D5)mLi|I?nEF}w?EJkc%BK3%wsMdCdhUvY5Um4rr&<`Umq@C&UAG(c{>wY?f$ z+BZT!#NKHshneXiyPW$q&r58a*vk&P9NRuoPO3|C6X&Gi>}KxjiiWb{{`N=)bJg&P~;g zzw|KrxLt>wu0zP@u+wz!hiB9Wsq6eJx((WcmVP)hCziDyXVxxunLkJ25$#e`X4_$x zY3q0TT=g7(8@M+kUya@W4@w;le_XTWX_wIG`%TVQ3;_T8bqL19;r5BEH19+5^oqli zC%X>!3jSgrS>A6;8tOBt1M`?`lgMn8{rC=3ktyfdQ|ZN|DFklEUR_XPH&fq9DQ?RzRl#|+8V`&5X7RlGijrydjM~EPujC8unxb(yHsEW8 zug-Y>ZjY50N;yUT^I@YBW;RyZZS%6?cGnvE%TUoXkypx*x&8}*NZT)Db7khBc|tC< zmKpk!?e=-PT-mWn!@P>*d0augTxn!-=30~ZFQH;tiHCrc15_p zGis-#RnO}YZmuhuYa(tYvS-sd3LI9u95%iMf=||TTOmL*vQurH)gPvBNL!Lr8#AKS z)>%rgm-q$7IC=AhADaCVMEIWCuRffbs_aVmIH!wargnzi{*7V&&WNW;;4s&X2t>?{ zro=m)_5E7lor$d5c3I5~aoB6EmVD2Mo+M~6*K!1`zSk)-H^cEHX^`ShJKDnAeK>e+ zS>fEv!aJk-+xV31z4EZuMD6zF{Pu8VWTrUmx%I7}qZ#W~w$Jzg;`H9GBe1uNTf6+7 zU3>`d>q?)QKJ`@j0LpOW<}UYnZtp_jxITfgQqxfTe@nxjj=s*!)}F$aRC|Hd?#SfZ z3a#DQOlONTZ$8M13tes`Tzl8nLau9Tru)#K-I?}OUl?p+@18wlU@;Y;5ga$x<5xl@G?<5=76k4Dh_}DX6Rh1xE0WOPKeHTf!6Br(`f1Jd)y99r-|A= zi3m5xJvM6s{Zs`xe-IS#vgQ1|dt&a{bGet8oA~82U_;pWj2*o5-bDF$;g4N!88--X zOT3cv*vZZ^ega47oY={(<2@-tKg$;SADey;Wua7#(--7&`i8bU3+}}`jYEAqCigq@ z?m=O(oBR71eml(2*v;)Io$DXfYunouU&4HQeayYbom=`ggTR^`Ar=lv1wX=i3~k>F z{rk^ktoMZQY`)F29~hoZ?A)ut`uN>P#dl3jdsTUIKvPlU#tO}2VEnL6cp#=%~Ox_`RA!OdEWP`<#A-+AZ;H{4H(m=0L2Hl+N{g1og?T$O! zX4bQsS&MFuvB$OG*EhUV2_^K{zs6|L9$>6Kl1?XCKu82gRr&d((7?V~#82Vnt33Db zVsk^U#{{xqvWA6C&K$b_(B7|^I;zSQ;Id7A-`KYL+UJIlMoz2Y+@!Rv8~-f zJ3B=qUlNsYy>G_QcDOA6`-dGE z54cuTl^?J2`B5a3K4Z|$-xqU#r5K}MmkC&7@=wK@p|ZksmT>9D*n)RD?h!VZTrEs} z;1aY1ulw<<-uO^2G{BbnlKYP}Dr};5eI60pzm7j{ZsqnLGBvj3ewX)^`2CcrKj#yF zI7F+e?aiIhyrOl`?_%y-y@YwCj&DE(Ep2iR@wFdI%M>XcyzTGI`xI1p?B<>!{SsG% z8fgO!uJBJL*RYyzzR6`^!~H4Rs`!yu6(R0@ z$5<8kLXNR2sHZ}0M%#;#p_Yr?d{Li%#mt}lI2)=etA-aLzI`g@zNW_Kn-;L=&AOim z>yEMo?|YSH9R#wP`ie6VUVcB{yKf8@({fmC=l#WXKUAYE4Xw`w)MTOPX+v&>7;a+1 zt$@(dXybj)`0(z5@ynf|y%U4u1-|6#V4QRMBsA{}?5FDD+I01FHfI&Qd>#aX1TI_~ zbMLP4C;z4+ayBF?(qtYAbdNQTd5^m^fa+`k`gbEhiVfXB6T5kjP_U`0e7I9+DAGUo z#oR9j{YYNpB$$Ey>*}AKQTk^nq~_I|!GS7rTB^!JzE#325FzOB2V(9Y10M42Sh);r z1$oFRRxswmDiR+c4D9j2eI^{z-iy8zz9<-Y+@JsS55g+*=s->!R4e6DqpfB+fL=`{5ZWy}egxsMo?5e(OYwzjIW{&-aV zZ@}cpuRkqAxeRFK>faamkW>-3;Z{9aFb-4rP?zhYF-+8sHbewI)as7+Mi4{#>6)1P zpK*x4Luthm^pCb@WX!_ohUM2fpwc_{#C1 zSa_?e$6BNK@jtHn@x)v?QNljDL=Cr+!DK7P7EjGP7TNL;G4CKQI(@3wcUz=7MSA={ zT=$EKxmMNvVcUS0tGDI8^ro0UuuvXgTfKVo%{^X57x=Cmm@J=(xete`@An3iYdY1( z8UXxSq3Ki98bB~tU-aqN7eLWsP)3&y9AAs>joptJt_t=AaCnlds{Av$(eO{^>#vHr zx6GQ$d35M_AEDM{m=5cHD#~=8-FdzrX$4eQmwrn(M2H8kjkzBw;(;$dCPU?TP^3)X z1&XTIr;L#byR}c-0VZnuwSOaa>$OpB_Gj1q)~va~p;H25Ag9wa}CRV3&mubjJIAl*7Ee$8-N2@YdG^CX>zE*v+{>mbso` zE$RQdl)sM~{+2AK7V(Pg4%T9Y`=RyNzT%ZzX$ASXq;d9yTP${SOTWa}3&7KBMZeuP zfn(3%SG_Uz07~bj?bUOibKQGq&(&uO25aF51PB@haoJZU@`n5DvGG}*gl*) zJXn|*8N+^-ZxM*LD0GipPvUR&>fWuXFm?Zh>;6FME}mK64QjxiSKXHbw`*6`sjh8# z(9~7$#k1xo=fcE%;`mu+OJ2~za`vFB#sFkDD0GV_+2gGi=TITF_MVZMN@%Y7OVdrw z3Ow0U&9*7wTibk+$z--0)d@yo2McinlY6l{fSayy z{wdBJwg<-{;!{I`C=w243|im&V5up2Qi&-k1PxV{m(K_d5q-l_oaa3WQ+FKM8i&)W%sw&ryPs!`YV(wi> z`T`vsAT60p*6DEkx1#bxn{S^mD*vx4);&UMdsTUS*OWYdIOhIGz+=d>ocJwSOvdSO zSj~k(3q<~0sEojtFg~QC%L(mHkXGG2Nlz8?GuS_R9=0ZZV6HE*{;b_(nGPr6V}fHn zq=KV-Ol6pAjd{V&XUoKMsw<1!;m^yM0`~CruQB&$A>PUP@&azMO^1KK6#j)I@iEia zeeaM{PKy?89zP^ItGu7QrkJ1pzH&<_{}OX=Kgt(MGnrP+AnX;-oBs}oZDm=e!SBU1 z2${`K8oriv<>FDRryReFO5kdF%{;Kkyr+@K^=KmjK?mr)G3xAOrVRBEW6`qz>SZFWY z{o=3R3S}&2G9K5$s`5Uki12wYBL7C16!X;7j*F$-XKYXHOrEkF4|chQXL)>=0=rN` zj(_tmMPH!W6-iujsova|-XvbWOj_#rOELH0d|5`89oS~ux5-kLEtW2x%0__d)w|=l z=wY12gX80B&HaP1PSEuZ{EStw=>FINJhJ?-x@DxS*H@2^KNlLJ`FLy0{dT}ddmFgP zH62z?wT~f^mHmd5j>Ab`^?0+ch&R&re(1WlEZ~ctTnjLt%n?8X&Xqd-hNkxw=}@6D z{XVVGn1_2cs#ibb;4SeV`9>p_Cm{saE%mo>qrs?gIK)Z^G$`l}(w)NI!Hu?uwGm`#4Rs zluKxY0#)@@l^dS!!7Id@JFuJ@@W!8*8Q5~XSs`!lQuBIh?`~*b7O{6Xv>n^*(O&fa zSP}%WFl!e8o^Vx{SNAF+N_h1L@GA86ET3a0M>&q!3#3!M^Bj!V7E9ET5?tvQx2`pS z{SEMHlc7-R%vD$^c>`JC zO|CL>RJ1KY%@sp0X8UtRpSRd9P`aa_yVxMH-{ibww{!=qA{J-aTwRt`*pA=aClYsU9=wkBPd=D-A zS(Bit)~bB2&q#tx+*$sTN&lj!WY2O8S|sFxay|t~tDdc#&~kp>Ctdgb$Efj0oy;__ zYjSX0r5d0W^Bw^C{Gg)F_1{&ceZQt6WUt{}t2^y_C>R4e9r1V`?^;pns@HZcQT4~G zsrMhFd?@A{qt>oVlcgLVyzk4zE;O_GW{F0^Q7QgZP-u7>fB(k#@O#&NQ;J?#F(eePhyqmTU8A*4b)v%kUPiI;T~Y7Y{2U!gG;3 zWA5u0%`N`6u0R_2=`dt^@2_EVAYN~u_g!oqbNX1Oz5JuU?Q0!lh+fkqxkiX znEUxfN^e--9u`OgUzT6NjDBd((7=Q_hpNa4`#+*uLhEbhY^Gu-Y<2bO%cA%Lz51O+ zbIn)G1;W6U<%?x=D7_jw`OMd=mVYGRq?Ewr%j(I=e?{@(=9v2%#Rp%(7`O`Z!4{*U z$vo%A)#C|AI$j~Y`}vsrwPTI%)c)YMfSN32*%R`D4ULTt< z?ABsskLEik^cjuelNSSB6rQJp`ZZPUgTE3E7V+>C@Y61qgDSZp)cWYX0Gli}6GPL( zP#@IiREDfz-@k9o5Cbb%pH^oU&Gzo$pzqA%Y%kIM#+v*aYlMvF@V9!p>x?MAq2E0N zzWMzQgOTi)7g&>{9NV5xziX+g%-j^!?{EgopNs46_dAoruKUdToh2sZE)Kgka>7Te z_wh0OGEc-Ih}E^VuZWT%*xJ`D(c|C9@WhaUF`z@@Fc8;)<2@kyDRhv@XN`Wc_yjkh zzpcocZP)C5a) z_ZF}zcxkyg58DcUyu@E-r--QfisTz$+Za)A)h&9|T?#B0;%9Y#BChiLXAcVvMYabH zfBoN}lKxn#y0^(O6zKh-K<5t)jqUMYMzPMl_I_7t$o;&u6M&lg@vEMUv-|Nn_W{@a z_of#yM{G+!v2~-F$>^w0K3I+ zbO&Q}Fm@AZb>{~+>Uy1vv+M6&nvmfZ4!Od}*p7jb!o}lbd-o^@UBCj9rF4~;Hkswk z8{!^=2FmM@zvEjTi`bO}1mBz0`w;?#9%5l=)`1)k;#WP{F(%V_Uvb^vYQ9k=?H$L9 z&+N&d&M`pP86}?;(WdN>`j&`(BH(TKRj)3z26<)Q=e|LO^byLAGx|P8Z2ho~z6_^>~9<3-cQKMHdV*7RY>*nTde>0!761uahG*cDu%HHX|Muo(1V{r7{^7ljX z_a6S0tGe`_rl|nEU(i7lHTr!qCb=zn#HHOtEUk#xo@Fd!s;ytlIFtRdn ze<@wtZ{lNY$pdmGH@$ygpIn7<9~EifKKD_RQ#s{JUcn{u+uM=Sf6WkH5E~bY9tCx!37FV4_Cf$%xTA_;=Uc z_`BnC_(QQ7{4N4Je~CX!cK)7!TYu?(Hm1g`B}jKCVxy1a*%|yL{%-#hgEF3NLcnv@ z;4j9w#9YV4g$H?_`g>D^NhA`;!7T=!vlf4WHjJYfh2w-jcqV1VNsSYad7n5w;l^F> z>biI=v5*900S0ql1 zpO9D_KaKzi{>6{*C*mKY>JqCF5%Xrr^GOJMiDW#sNClXb2*Pm*&rTeV__>LsN#(O- zzW_0A;=Dv1T+ptobmd{ort5vml?pFPtdtU$#us_7)MXzhb-E1YC*vN)RaY^wQtFUE zg@jIzc_GERV&_WslR;>WlI4og`aMN!EU|>02*r3_f`y?a*fi)sp0u0mjWaQEEXX4J zNH-XlI3`hdCMg!mO=Zqf2{A?Mk?6S<=<}|3U5tEH0+4ti$T^igkiGvLic`$nj8ur2 z{PmN|XA4RUsLYE@(3#G@^Bu>LqoJ>KsrGVS7;bPvAh!d@f zx_qWmb;0LvR9%*ux=6s(<$RPW^;n#!^R5)>V{0CxI4zAAM-@r!5>^}pPbOZZY8Lb6 z3&r^3d6$S-AH$|#TO6nq{RcgaM<*tZ1s|_wL1>c`q1dRsyhIcJHlT%$GX&KlLJdry zLA_s_0VOjT6J?MbzkJW+*cn4=@~Ov2*SiHYp`cg-OaoV6p@YIE^|->0emN47?B7(B z=spOd?Wq^O;0R~Ed#@JmJ>Za&ZFSz|i1ubl$Ix9Ro@fMoBh!13m^fZFP%ZlzK-S`K zTu`2jfL9<{ClPoDfs+`r7uCePXRpLljqBayae!r40vY&Arn=rdJbHu7c|7~r1atBq zl}|=@Pk`3zD0XF5C@$T6wuEEs2)7U#tdw;tiF->3aAA3H!h? zB1SRD<1yYe>w60v+q-WC2Z#HNkG&ZpQFw-LG% zntd{H3ewQ*v0CcFJ(a4%-KGvACL;UP6GcKIe5+WQUs7di#{sJ@lONieP(SQ;b+Ne8 z`70_lclm}X^H>Z$SF%i*N>P{L8IRB_a+hct^Cywp==d~g7>Xr2@OP;)V7%FED^Aj2 z+#wbAG5*2MXYbQfU~i9_ZL)Ds^cJ5IuNBi2ebYBhYdD9aMTWnp30X&zB2Q~(>UiR% zWlfOPn4NRh3ThdT!4b0rnLAgkKixWO+Pcv6r;3fscbT%w_b1Li>ZFO-RR$HmF+n0v zB)YiwP{VmpmAdz^)yy2eLgQ1+`<$)o0{_jGmFlC97`{a7ILJU`e^qO|6&Ry_ZOYf} z0+zy~0*-T#qI@cY!yl-m-+1&=NP@RB@gfbvMx*0ES`0P^o?#hMqSaJa`8No~UoU?6 zhfcuRKRZApI>1I`mp*_AGmB@77qdWlYM>`8=BIgot?n1}Z^Dj6q2LCUfi|*0UgB*0 z&_;nS&hU&VJ6wmG}dhir2Ci~71sv{&6bs93r7Su@lr5l49KY7!+a6l{FzGW zfqQ3*3@(9R5*-EgfJb2#3}SI)Hh`2G3?b-h@s(oEi(3gZmP8#r2_B@uRWq6zZ#M{4 zV!AT!Ek^v26oFSTl3XJPU*P+g-cc#~f1v1Bv~vue1$!3*Ea<&Dku|=VIV4s(INc2l z)QImhF2MvkkN7xd`!;LE#-Ask$5EW+&x09FFD!K(EozEa+^aV}CPffCJK_^#NORE} zFw&qxd+}E{fHJ)a!e7AGgO%dz?-gHX!EaAyc-?FaFJ=9T8q z4M-xvA4vPzx&b*6RgI_95@+Ihr5Zq}DUlOi6!8@{`J)E#Y7ff`7E(o>3N>(|={2*6 z64@5TYdG{M7qjw1#uCdA<0j6BW_URZUIHaXLs*TYk5#H)Jst1@1_(${vMjQSCnL*> z6);Tz6Z5)7bRc_jXFp7a*wCoiaJtQgxfpclO^4T)NJOfknb8CER6e#$ngfevs3peP zrz=&*j~}V~YwdK}d!4RiCmY9il(4TnkM?F>zou{#BfNBBL@TRa$aYqBeyCD){$p{S z%Nj?g==v6LO%lKt$?{ z7t>;t%MJ?Jt=PQe7c;9jsbbAo_Y8hgZ&CVerIn(S1i+AQRi7L_Wc3S)Q;xN&uUT*` zXE8=csq@t;ps(*ZO84I*h#p;ODjoGAEzWHr9YsDsbWP3m;K-WF;K&p;L>_Msj&KYc z^$nwkWk;)TB#73g$g!tG_>MKYjQShsNq|w|mDFwj`Fwb@M)T%^65g=8YpDo$qdneX zb!{mz^Z`l}ZHk3qwt0)#0Syl}D&6+qmC|jWK3e2Kxv8+o!ohnst3=V5YAA2g^;hE; zt!(tz1g!MXgeO9E1A_9QrWBTrL*pJvaDNe7!oo1G_CzBBS|?0as{VhRr*$DT8raN! zuC*BNV1low#HU#?zTY@s^+UCC#FCZ>*JBthDBnuTX&q7BB;z$)=w-9S6D6ixBok6RXua4a;IFRJ*b)Bg?L0SBPN^ z{xgQ2Me5=wD#iEjJiq#@nt0y6#ETZ1TFpzWXRSau-QBF!ti);<23Y1^7@y}I0e+$V z*qSG!+FXe9E|bkDFcJ|Nt~ot|F8)yEqMj9#uUi)AcBXBn`j<>p$n%qyAX1*-c7O*P z<$j}5{KYY#t~9B?Kci^v6azAA3l4GE(i<~Q#6(ACtH7SQN-KE% ziAvG+u%c^`?nGQ4rtVl~t&=VzpFGaVWL&Gkuq(@?OE3y@mQ!Y#lu{W|L6ng@D@FHz z7`mZi(1@g)48(+1aaR<8UL{sq$fFigs)AjJk`ri2S;<9Tyi`U4q-kAUvAO0y)@fa> z=;fqtQD~P;1o^BGeyAQz*kt@TUu*?fC2=yME2!--wOEd=X&isdY8tD{%GY>v@OM5t zFZ0I}FGh%bK(pens23Ed%zHI{pl}&KuB=qsJ*IdO6N`b?xF*h6-Y#cYp!_N%QRYuq zc0-R!+p@q24**%^dZ(+_zz#j?UwUKA%m}JSP>`)j?w}~~8Urho zI@LT)4dCN%r97;WtmJi^NKxVAMUOvLDSm%=p_aYpS>Iqr=+{?jfO;h8=+KqX6)IO5 zSi9IlRl*R}rWNy{|FpP{Y_chq0@mxc>_S~sd$5k|NWRZoxnj_XpcRhOZnIz+z?;n` zm!4wj5}F(s5V8D;g&g!LwZkzkI~-pqQ%Ny#v{_^8M-DrRC%MYBd(6Az7`A&X2EALc zzWWiuiH#T38NvP$c2zERDTNt*vPT`cv1dlWr|%hC3JJ7;1hmmeNqISCaphP9Hq4NX<2hlM_8tE z#5INp#xkfQERk~&4{}+ty#!x0bx?CLDiX+KFtS-Rh$|aqS8Pq>yQ*x(4-WF>ZA-D- zu;_v3xG3o`(FL1nWV&n=(st!}i zn10V^Po?(C{f{maO-Ze@%y3P_%NMG$vZnb$-jG)`Iuo)}0{vXV+`d5RL5ifR?ZYpW zL3S3iDb1!l837O^FVJ!VOc_$Iqj8a2_A0|OK&>XqP~Rb3XCp?-r^ zA){#sxG-?E?ys1whGV2$phly_XH$Q~xvnl{;Z4yvy_tBJO##6+SQ0|jd8R~q7ZU!M z_-t8(0`TR81kXiij$MfDvv^*F1&Fx!3T_Ffl%2%JJNX#=MVWN7_&I=g7N4<;gQ=)H zhB>xf#r!UJqfvm_Q_Irg!GJl%O0gyI1EFftBOAxWG3;AGP#tXIS`1p|669Sd z+ZmIf{%GAc7eNFn@*dwe6urTO3k}3gk>JT~l_~@0DM3(WJVgEVHm=0+==RVjvyKy| zBw4lykLEQkh%iPBf}C37npC@S)!QJT^RY_Ni6fENcFVW`MUN_7qB5khTX0{nUQSik z8b(13>X1571i{J*#{!yJRF^S%%S!g{Bh1>Eu`%qk34dQ#Po?l*qxw2_7KxAM+RET{Jsb_hwmDI3zLUh-T?Ut5jNMqhNG3xB z!q`8)2%QYu64}A^Jf>o68#tbabR2Eou%UX1gAjQygZg(pB0Q~1m!V;)ZC)yO*W>I8 zyDJ%qm*OB)ixCjrs}@WVuN?PQcQg}G7Nj}^bQ*0Z?A!w)f3Z~g5w=x^-*N9LsV6nD zZ0DptP=1#tlyK%MZ3q11Ddv+|8p1cMk3< zLhE{u^QBL|@S@h*+{7YN#*mb;Vftn48rwU%b6|3KY_z15H=9?qW%!Vj4i-{<8$Zs@ z3YPT_Qx?r2I2BH#VWMq~`=y);>>0R86*3nsEfWW>3v(N$e%YNWOTWS(eXb_WLxtJ&dtoq5>}s;*?&1}g7&|uQuX))>M`XzziRf39u#*MD`r8XJwGjzG`$HV%yq+58mCjqKhI@z=kO zLP+H|QOtYo03v5FJ%F(1yz)MWfd_R0ZvLf# zCDVHli;VTW->$+w90NA&COiW+$$N_m%bh-T#`Ata$K&Q-HjXC|%koU(as_paeG1qe~ue774b2KD69UXcm&#cxXHyq;4J)*>m1z9RlyP52w8-S^aXNo1)hMa zfp?x%#hUT{DjkoTT=bYS9>@;h#^fTrq!GFCQ<8*mErR|PE_Wf~0kMYni|~^sWMC(L zNLa!9Su)*6+nVcT2rvOf@4{_J1+T~LpbFlJ+ecLJF5Et@f{)<#T^0NuZr@kI4ZzM4 zit0f+Sr6XtP~m#q{OeHZ>=DdwUp8;rRl47JgtOCG1>{dM-duK>-$EqP>v?CTipx4O zBF@G?snV0YvsH`p+hvi-NN?bMM1@!IKCZ%YCpQVh`;T-y?~m(v-296w;`!>3nbOYo zCtbXMLWSl2kdDXAzw9!a5sQ3_d2dx=AC3VVmK_hUN!~Z9@Iu~OR2YAQ%jWAgL?d54 z@04kTmm1kdSY(`M+7O0!ehZQ?ymOo*4DbAY4Pk;(_^i@-e?Dz}kIL7;`@I?m?^@m( z5cID@$=Crvg03X**Qzl72A9o?O{xwJyz^{&*3G_b*!z%x^akGVS7H1OE*rKM(STjb zyKbij-l-uO&-)!J9I6{}1o|;e-V$?*$f`Q55*>N zlZ&GDV*J9Y>?*_@P_g*yUqlel)Qu;gT5OWfK!CIXRSq{MN9eR5|3LuQ`FG-ZNM*Vn zHzpV5w`EH6ZyuohD@>owvo(MLYrY|4oo>EA~28aig$^9)VT+jQhIvzLw zvSFV=Eb^7Kqrp|H(nS_@!!_`JmX7EBQ57zW<8hTv+WpI>;V#6Yym~(o0XtonThIHs z3Rdn9s&GB;S~to4DIJfSe@zG9V}K?dyg#ABa_63lsp!)@O7gC0-C*%3NgnZRW#A~w zgX!RSQqfcvhnAidyl>L5ytkbrM|GAFG&A;sa#-5FQwY=+g@!=S-%RY!_z%I4{ zY+Ou0`aIs3tFYWJ)bYIQ@ks8wbUbeUWtVpaVp%8Nsk#vM;TW)CKd92{d8dg+Sl;i| z@woYyo$nmQ?*`sCsjv^nfDKF4M|v1%PfKV6?=AR2H$5nUHasBf3f_NX5^(pg zFdj-Lz#Diki{~*UN&&e07xA#}f=|__-cLk8W45CJuk!HzaurVUKCZ$GdEc+X_#0ey zzDpZv?0j1gi+U${zfgsJI0kGUELQ1@d0(!=a@YNX(f(zZu@bQ;qn>vTCgd~kx9ND^ zKd8bhc>lNx%l*GpxNN;Cn8eNd(>fn+{$f+ zoqJ+|uYvcYRCopN{4N&jXkRw&pDP^oy#GptZBXP@`FXc#J|hCw#+y*-(gXiRg*Wj2 z1r=Vw`vWR0_eWKD1MiQk@Cx1yO}xKY)nxP`!*Gp`#}}n!23-qyaHMMD~1sH z!Mo<`JUXjqLZhv)s9lRYk6Ow!uT6pHm%)= zro8aZQdkF58smdp;W}(runoNLQsE@;FIQo?->1S2yg#VIN#4Jz!g7CDg(<53btFQh z!@d#`ajZwcvqlBsQ~W|apN1b8MeIy2;+fqhHzFBjCUKMNEc`teKV)gftwjZMxRFzc zy%INemLi z^DG3=qABx`&#D}TZp9Ck^ELK5JhN3%&@DRID${ieg_cxLrcg*OPwl-pncR?UY-ns) z4)8*uC)*(jtJj>>(0JC`bt*RB(~<`GY5|dlEt&3owyTqo8#k_L*w`*fnU>8y7{dY7 zng*4bvH9$UnLKc$D9LC=>{g>*;REwze7=leD?BmsG3~IC;RI zLbkI#+euWa0EzF&c6N0msxbh~rFznB?U^l^cEmSGd_djuHD@#?>rr&_;vGAZ{3h5c zRq@_@rn}IdYDTVHccwMF4Vfixx-HdR=YLC)K?<(^E+2dJE~U?w-uHLPwKsF`d+kq>F%!fY_q_nyE<~&_DmtuA%c}$N7_32Ix|~)3R_a`g=VC6Wb$o=d|RfyU9yx- zEp&9XWZLs0AKA{$>9%YxuQF#kQ$W-r*^z?Jt4-j$YK1-H;Lon4y0Kg-sO9{!#k6F$ zWYd{KXR0HUlr>R&0BGmnzQX7LKI7;*ZRujT`r5lvEviPV8!4}B&d%-vA<|u) zotbnG`d?l|ytO@r`Y94s$s~haxw~*dZ>Bd>XzgupFSKNudpApZp@3#WW9f&1@!dhl z7iQfqsqS=JVST~C+Ofo-x{@8+)7IP3tOY{H=eoOE*+xZ3S~IDh-tJ7HE!Ez-wX0ik z7dlAEib+-YRPQcI>ga9n$>!SoH1$QPEnU56v+{^rvRkq(ndrQ|ovC)|+tJDC_6wsE zGTVAG&kVd=FY6-PPOKqxqD|rSs5Ohz40oN(zO^p}o7eYjhI!o1iO)M$G0j zg?uiRHk7JJs8FNw{0PxAR%{{PkwUwt^3Y;Ex&R-g=)znosg(B#f80NG#D;uiwP_5iixoPr-mc1Mc(d)y7+uJK`h!IfX$ z;&nWJ3XsmEx8Vt60cgNC*Lj_QpGvMrGONwxy`w&WGG7Qf34pibKCov`;gZ42<+DbN zS4Im%oMsThkYXVDJxX4y@C(yoAV&ta4~`V}?i~&Y4{At{IVm&1_^j0EAa#twdXkUz zQwUv;U(uH$5#zi7KUFmS)i$=!rxyvj!Uuf}q1WPP3JyNOhe!*KoVA-E_=+9jf{M_5 zCVd8<^`$ogF2_&NSPW=BrADaJeJFbNY;+MHDq{v^NHRpBV+PUEkze&9)XDfMG9E(6 zhqu3GMKD}I=Ntu4cRr5rI;Hmb+WGDRcU}V7&u~0>5HNw82e|q8Ex?bjF&tCCN7XRY zTwEA}`LU=#-JQk&SUS`$W>Ts-n=GKocZ^Kz8Qf7{D2$Fx4vmjpw#spjM`!Qp#t4Sd zAdQjEiJgGK0H`|ij=RDH5q)MSh78AT;0?;F#%Tw6o|95F34eAZeOCYZgTo{JD4M@? zx*t8FAA4noM|X_u-8tBg{w?I|tp^EiAvz%V@W-i{cSr<&cA!tD&rF|sYBD{xd(ZI5 z;P`3DwP!RmC129KcX(uHa{aoO3I~Z7m}_SF)(x%594(f@q%(h~yNcE_+hield<=ez z@H)$*5pRV-I#&J z(T-sd#hjH%ZBAu7ldCcCoek)Y3bWSFfPG|DT)hO#lnbs6Wz~pL_b}nFgn%gm^ zpvdzu(&sTMqRdU1%r=Ze$<-(|mDvXSBe@!dHUnJ3C^pTkE!l2N101&{lg&#QL=#HQWm>vAl1(V{f=qX+b8{xy zgfhD`Etymc>e_@t^RRn5GCf^g?OmOllT9cYBXC!H8mTC{mqquX3>3YEq-HvDptcF6 zZ_TuKb>)(4Q2I7l3BBzt&Fx*trWlWp>H)kXzd5-EbX=IpwxH41fRLAaVz_jRU|Ye30MGwn@nXpS|Y;bjPSgY9cTLm|`NDLFvHMHyHYn299UfPw*(kj`ge zC_Cn@j2K-i- z7s>S~{*@@Pr?)eE0Xo0qUPZ{(mgIUAe>Dk9w;>lOIN)ZW=FoYP>p{ac@&wT229WV8 zdCI3dlN&(D-^ml~?c@f~ajiV5&I(Gdb2HiYeCC4W22gUnixToMJA0BFK*nH-f^~g9;SWW5t5hH@KOu94P=~awCYn8JSxx z7!dsTZYE_%f$TRT3N&UrQIq6G5dJ0=0Zgeascd_4BPf3}D9fO&wnAMsfb_S>b8lxi zbX6OoK>S-J3e1B1tZo49x44jkPRyz}8>Gqu8fY^rfWoMV-$#i^L2a(4F1{TC zk#5hVsMSI4`-OaHFFbhge{wl- zZp#ZPoB1WaQF6A$$A*V8eExys|uWoQ@s@m^(*V^>nD>h zT-C7Z^m7G%)hbFhmPYXNoDTd&O=iM(f7iQj#F8aq19J}ceA+;vdVWoyg}Wven8M0U zSYjN*kGFGp*DhrrpS&=48NT2=&ZkS)^Xg$CJ3{;A21sVaOfsaUrqb*rFdSwPDL~|uBUDBGDI~sN>u$- z4g1&cQWs`BY~OWjBn6)3d^$y+vkjv`ca4kydb=tLHMvu54;HESByH?42jxOVO8b*tCz zmBRJ_zJL)YAL8MqerypZ$Nhw8eopx5)930wKaZ-k@b)r4QrBE_c)uU7t8er9azC+@ z1?9MXB{}AE!0`N)L2Q`wR|N@C{J%O#E+wISD_rZ6h*rN9Yzc(iUFRq3<|s9@*_ejY7~mOQ`4Pt(k?8{sBDF`|WD>nE17r(6rY!4;-z?i5S>%|WUrCe$JR zK1hyguQvwCr3964uUl9Rtjk2Hl(+k76ef#n@07A6S8*lY%RK0_(^W*b`|!Xt4VCf% zDOw5$XDDCAkGN*tiK?|o;65587FF`&E>^q>sh%z@!9;QA?ofJB=6jF`w{@{ri+$Qv zi(R0^iG9XAq_#Qk7t8}_g!%bJ^9aORResr(g|LW9Jg8HOi1<2ryP=S--w%smKYHIc z7y;P|V!p{3h*J>rEyh5CB*tox{U@I+YW5Ln03YkgC+`K~??_~TS;c-=Vgu|d_TMBn zx&)=kzfTg_#N}xCfuJY@p>W&~g9V!JfJhBY?8f{Qk81T4F~g%Huv0NlMI@#yJ!oH@ zHZh5J>UIPmu!;`X7f2Jqn4+}*zbEzsjG<}TqAL6Iw1eD)UTUUUqhww1ZpS@cJxk^VcRTJG>RDy~B0QCXtuQh;FkuQ`Yeg9n)>(0e zko8uaPtFE~KR`&L&bA|c($2ACeF9%($NFTRtIFDCsJzlm2QiAsE8UhL%FvhzqI?ot zbqNL;*^;&56oH6*u@&jlcfJ+rlh-cAz$R8r)TLn5GtuWHefPkA-Dr6Qpd-)>JxL0* z*vY3rzE|S+0&OSHD_~i=m%fRfHaeHR1+f};VRK7CCL`?`XuJJ%a5U1BRyaS?2MY#H z1H?4>G4M1=Y`q@?m=`ue@wBQn;tu#dTDa3Ah2`Y*`Ea}dDJGSh%_4JA65I%FOu`-s zSSvvmxDK)!W3D{|XH6mB(rcwRgRAY0u&qmSrr_e0oES8=xJjL)i#w*I~9H99naM5G4M;h+zLcW*2ajf6(r?;ZtO6l!9zZ3o`y?idL(d>9> z1XQrVUcd@*XHT{@o9QMz%6pjwk4+#gTT@uUZiOohE7=4=<+y5KNXn%)W3vk!PV_e+ z8FjqKN>26mz=IBL3yq6KV+#-F0Rt9bF56iEPRasSg!5RzAvQ?Fb_)oL1YO;I1++yf zo$cu>WVWR<@H4g$6cd#l7N}K4i#p7vc18oWV@O2rC>v?^rnVhf&rWD)Xg9t+)AYL=R&=>`v4 zz(Uxac`^1)K!RJaCjvAHad?E+tE;!0%PL@03+80g%bw4qd%MYJI05tAjDg%4y4|N$ zI2HmRt+^gs@J5>K#-JZ_#L9%7Ny;OP%9(u>ke*zsn` zrMS}Bx!cMp3qDzNSJ`Hwxa;R)1?dbOwK6ELWI;Ac0Wl0QY%OcCT9J9sC&o(iXnBat z<+l*_5ZJ9lKkJ^Ep^~i#g|60CQiR@hsfEUp5sRE==-sX~_7Kq*%v|Vh<5sS2ECot! zQ$4b-B>X`?!-9y_|Fg2(3P*JzkWu=3CoL$Wp4vNdgwhC0;hC|2NUj&!RVwObJYr~-jU2ee{ znUcyG3FI~y;D@MThe}w&(1otBvZH#rOqwdVMJZO2j85{3FpMwnp<`J?m5)2de3*zp5y!dhEgCWQk3M_90V42QzcOUi+VMLL}5pZAG5HI8(OJG3` z--y7P0HK>r?Ws|@I)Ejz02)hHy;#^lgIv&+7h-(&5*%FsYiI#@wi7c7u_>?b*|mop1mVxL2T&43lh-Tq_A)x|t zk0rYxjg<*$WnV5?D@Z?9^uo}V)Hg!vvB(#sQ+hhFaWswHd3lJh9^y+X1#!n}V2}^o z>TLx$_Ew?#dWazbka?^T27o?w1=tqo*O*y%!lt7Ipw`M8_H$_+>xMxdk?TCzj7@zx zY~E6K1ee;eY-oXLE*0|aXoD@;u6D6cKn2&|v6g6ovZrW_G+%_Z^kQOxF@TbNaj-o4fdl0v`BbYUFkjz1!YpkWa*$R^bX`fLYGPpFANm-=#1fR@(!nG60{une*@zQC;z zCM(N;>|qfz0J3zyX-+fxVCzS|H>*Zy)10l?&PVCt76L4MhVb-&z3muXW%mU@AbeO0 z4M0M|WtHoMTW;4`Mn`&OjES6@2Y#phzHRMYH3J@}jMcV){-IeNwo=kJ6 z1!g-h?#=gfP|khMH$#-SW}!cOAS5&!1qSv7E3LA%bf-3NR)WjT8(0Mn@SB0uW>v_9 z=WY(H69+kzfhtSYLNfPw{G&_zNBT+!ytcIcxlZgy=G#+SWIN`2C5~omOUG)xTNgrj zTM*r*qp1|%=SMfTn0W5yxZRI$^5ZvvjQ9KTEgel}FEECmJA(K&6HoXL1o0hf6?`LC zem@w*x9RvMitmT~c+jH}HF2TiPCo$z>4df1j`CqY0Xa0Pb=*(!5kCPrbOP4-LF`?U zVkVW=wq{xV_?V=oF+mJ%d6u-hu~`W1AIQ8+Sk(*?h(9G+jXr5l<0T%z2fxr=jBQVrL z3z0W>89mNf??Z>mUM4H5`t?I)4V4US&M^%%SOkC<-#Qc)pMXdV;L&#ug&{=8W^6v` z=0^X34UqZo9SVm}MMQp#UXQw6n_DqKg#QKll!_hAL-)xKgM=J*I;9~>;urXl#A{d? z1X6kIMUt_CPJtgwdbYE*3mY_Pnt|ky-luEeF#)3g6|?AYDrowNr1n4;EA7YW|Kk!z zV^vX!l1UH-xt~f3oH;FBjB0{t{l@BxrsMGa3A%N3_5KtAg0Y(03{^e zgWBF04MnDde4;{aZ?=HYIm=)}#ouZH7I{oexym_2#9+!hEqFay;wC}qH7Fju3hGR~ zY=K**voimQ65RZd1*7K$7QKP_Y+;64{J51%jU-B>=*F>$fT3`=1*!ty$cM4;i848%IOR9Wy z?<^2sMl28r-!oAlP;mZ?fdoMSpR?d(AjGyfOnwUfUPypJjQ(PQaWRMnJS0YDvNT&c z*}uUHy0D0vva7Ubz;KPg5Rungz?Q@-j;a^TEbI`Mw_6#El2IB&P4Buf8v<@lhCg6| zmhm52)NlrNkCmhBoPyXPbDy$4bwpT5S|Vgev3-T=lvFB z(G1GsD(74eSdbV>;37ALq#E+{dvJC`a*+OU39M~L!f(gT zvd~OuqQ^==Eh*Q8SnT3Z{*#g{w!-Ev(r8_c)_c4pE4Qr|I8PIoN6>=Y@A^auv~F>W zMBhp<;uPWq8uw=LwP-V(Ek&x2%LKnD%^)+-kS!kY5KZ%BNsde>G)@|fuqd^; z2u<~?l1#a_KGXC8?6wAU`(Ky9`kg9%*?=@f-qV>V|rqx0>`GyriyHM++U?p)aZbpi|-P3MV(J^moz?~$nH&WymIbG}z1+Q2cWBt4&F$GXjrmo<;>Uc6iZ%LjG1vj)5^ z;r&M?RymNs1o8W8GCrn~wrQP;7B)JW0BF*WM*##VQ06BDqBV<^d)sWch6S|iKa~UG ztI#M3EqhM@0{^HSBOptDHbH38PnHJ@$U-0cXMvMZ&Y-hMf)w8y1rVUXROr(Igq3x` zaX(`x1X;GjfD2OaYF4vN`wqBoN>YQ&J7LQO$@(>M+n{I|gcTPF5g^$G`z-)Ly*GDv zVRj_U45~m4{)O^jK03(hR<0mlEX9^{m(TWd7LIg!%lDHOz6FMqIWp>ZBAg+Z_M zEn`BVfxanFidc4S`OkPv0m8XaT@?1VHstv(TsrX9q!3eAfaHxu#EvZ+2#} zmdkO1{q^50AXQ2U6dLGz7L+MVE#guM|9dFaTH3M9X|>qLe*1k3TFY3;`WihPKd|6T znQHz<($V0Lh5(9+#UOs6SH4V!P=*LXLJK@$LE0B_uFc_>Myl`?icjMfUG!`vLJ4*UhIGLi(6d?a~I7P`f7ht)XXpd|V z;@?ET5)EYMx8WpF2pomTkEgzFknj`oPSy2DNT?645#+?W?S%PiO_`9=fbHLQCv-Dm(;V|HN^E_rO%V18)1vo3K?~1W=qw(G$xsBMX*@5(-0S@_}j$@%`vD+EUY50rrG6%ex?uQtRG8ZGhV5@-d6A*~2Cs`X%bVAFg> znJ`d&r6d#U#u;%5K^(gtB6z;%{DN8^RGXAU{$|X9u~e?UBidV z18Gk$0a3ee5)cD5wv=)lHrtgb^WU3PJ0 z(ZgJu*`%b$Id096I-(1F#{w6v29Kq(NrI9={C6#|$o)Dj9a8^q7MvwUw$%qS_j?wU zo&l7a!?1S$-Ga0C3o0(MNC?39Eg;OMGR0drY2^MmPDc+83{Varbp#yquS=!X`@kdE z)9*Rk)z1F#`@q(#>uq?&ys_Uo*%)7~P38?~!~ zSZPj^4iwHD&!Xh=JtTI)C-KIN=Y2D#NIe?o$_|fSB8PGzvDJ0g%&&Ww=PpFMH*@nc z2VY1biBy|^&2~f*r`_*CRLn-F3*6zlFY@XRCftSS$FeABI)a|j5mRZBnrgF(#c8^` zp>`!nhHo_`DXLdGbK-uA)y*vJ=*&s@5RnSnnKR1=h|=@WHuzh%Bc=B?} z?h8HlQ*rNwZ>e>cO+vaHk>MB)9n0|pvvLF+pu8IQXMlR3wr1I0XThQx04&=#0KKAm zY7DRE`|#>bs8u!YuaV=q+S-yF4d~FZlR=CrLA@sRk{b8-$Z_}V`F;-XeX~uU(#0*f z6=mb7S(6p>D%Rq)HSQndUjDbU7oI5eowyfk;|p4APTY$%(gpi*=d1k-?zRdo42%i` zzEb1L_a?^OIe=*C1_L7xkVGoI3|n{ha+cQjt5!dU`1P7*$BoIr)) zu_cS;6gl;Efl0uIupTHRKMiB%LcEmK2UA+*EZ~Jl6)FOSB*-bBIV`JlD^9Y$0p9&Z zj7z6GaF(ThB?vEU)vrd%v8ha+d?-m+0@FjCFp7zbe~zKbbb_2HdWnCq=!sHfGtSeY zO@JM@3M^UXRKzW^e;hl3go5Smna#9(xgJmGuj3P{s?-c$c_- zJ=(P0g6V+h6;|VYKJI8$XMNT;t^rW49FTam>ammopq^r&#xN$rY%2$&5D}!`0>L&O zya$%UfoPbGW^mq=2DB&8{0+m5^ zbDZ6qKzHlTaiWJm>-rGmXCq<5)p;Ni#%$aadH!l72vs!pb(!+kvTuJq5|V9#7lA}2troaP zBH?hP9QHt?D_czYUL<68i`jgkhBfxdN6SF=Vly=lPsRvC{yi26#uFwvjWVw))Hks@ zzbJv_p$5MHMYqVWOQ6_E)j)}}C*dH}^&yqND+jC<&>texMY*VcuY~ZAkziU1)N+Ut zEa@tLo(dWsr7hU)2F1!Qa3E&s9bdXBSJ+v|*Btcg!5kB0RJgWm1{fUbJq%9G71;;N z0%NOzKL1+}IiTgHve4X@2QNYzFAyok`iAnLx_Tk-H%$!=^_uE~xKIXeDGQ1%)p+&8 z@B`Zc0R4`#(6XNeuO?w;1JtVt{I0UV@NsmhirrQghO-5nSzSuQ9VJU;9(?QZ1_?@Ze9ym97U}9o$T%C2c zOrN_9@08jtjOjzf0nEj*mhZ}y;?Ha~BhEExJ!h(1nC;#AhXq@3UxDQhb91fIk zu3v@c;fd|_*nyJ7Kmua;>@<@dK|+-sn@6EB#B{U z=lI}$NdTSyYCzj;Q2IVfK)+)^x7wg|dX%F531GojQXrI{CUnT*>?m7BB^ifhaRb_R zNYFnS(5;6Ay#}W6~lwOGBkz-I^)@Ij=2}=g7L+i?kP(Z z08`}IUyr#L>zt`W-%sGQpf;OG372Ty>`n#<>=q&7D`wqtN&B0o8> zu-vB>drX>$DM;!2(UWE^Kd8}4xLNB;anaA>$=VB(U1EAL6*+&;qm>VAsivEXL?o*~{AAu@*yM|Ro7w0_t z@mcPlO|4}g_95%tO3hMK^IDv#r)zE@Q3QyVv1(tMU$n8a5qj+`{LaSj9IfNd@W=J0 zLYrEU#(pNT-qLt8TvUkp76@DdoOfc$l2cE7kF68}t|kJ=RIDumKpmAFjrg2%a1Pn3 zG^56xBI(X21d7;3sgz*I%Y*_KGcVji)4X#(? z9dv7Ia4LlqOY4VRYQYLG_9S7Jj9t}8$|m=Xjo>81k-;Ri*#rj4dl1{@$0~yZ$EzDK zY-)~mV#^aod>nFv&EarmvZ?M`c~a zwBqlg(hS~We%P6T_Zi8H9ctZ$&JKLfq_c&u;E)@9KkyHcse*cSfH)#IF#ku8SI}-T zhswx#Npf^_}Xw@t}9|=k#sz4 zZn`cqwJhc!H!$B26F7g_o>B>6Q_ ziIIed@&fH^gPbf=ZBP}CKoh+#GI2_x0|Y>Ri{#$|&shNg0jm{SJ1ek$z{-gw zRBm*`%=!YM7;^o=GRe^-7a;)pJFWa|Oeldsf_SdWhsy#)7g2%)g?zLKhg3pp02#k4 zGO;{zKQj>DEqSp)nI4(0PIh`hi?Q$%5lO{JOELoGJwd+qOeWWYpW*cU>;FZOhxpLO^Gg@*cSbZR8(qU^x^ke?g-$T@UiA2W{3#hJt4FM7e( z%B4r)FGYb8z9AT}y9TyaZ+^2(tV{ts7~`8|(u)g-!~p!?w({fPwlIDSDUXy%kH%kw z;r}uBCUA09RsQ&UU6rImP(l#~RHzhTneG@g8zGp8_L?r~rReHxnwhfGT}fKHyPEFm z(5T}ef`Fi)B8ws*i=v>SA_}77hUln&98eKa)IkPk97P8A?f?CryS)3h?nKS!H)y5b zz4x5&J$FBMI~VxhcKC5HBa9C%={qUm$@mcj;D6WQFK>al(r%V64@|NlqVInsjUYLO zC&$=%QFiB3{4+w2K2C>Y$kK zs8Yk$Pdp?M&S3-IrNY(D6!Yp_zZjx}eCWh4O9+Z0#ux$lwtx=RrP#mckh~kk5LicIv zKDZfz>g9GQ;`E^06%Vd zanPF<59N<;S3gM%6ks(Z*+EI?d;|mdPg)4vRI9+8px6r6_&-eyoCQCE0sNm?2&mn7 zj-7{pRQ>1h@jr>7i8&MI2J$Z=yf6f}RdSr8$Wuvy>9~d$uun%gadNIlEfN9te-i`u zD?@IcM_aW6C0Y+EZs8u9sV47@hZtnllO-`i;`b{)ECoO{Lf()|)_2ZVaycG}DtEo9g`#YolNx2xX0O^yK z14FDqLTTI;^-n?ySb+2?%RzG&1`0jlJ+Xi!EQbkTpRqjHLeS|$`}=IfI|;}#0OoU+ z9>r~NP?DdI`X>PeEI|5_a1^)p!#WpwjbghU*YAsmMA4#b!262g>L(s8cx<FE-zHFHnYu)^`?sx!ct)aUZB3&B^+Q6yy*$fUgdC z%UsWQp!w#|JClP`z#|BNzb4@4LtjB=bE)>-Nr5TQA#MO)7x1=~iY_o($n{BqDZn9a z0N)VsB2F|tQ$460+?W)Y0vzH7@XY~lsjb{Xo84w`LdAP;VrU9<};1l$}82lOPF zipTroK^j%-9=5Y^I01QUz=w)%5K$#=iv^@e8L$EFLjhL_wocW}3aB#ZAU>QBq#?Dw zWkqyZ0s4_Jr&!FfGy0Dv2F?N;umk#zfE(#R&tnP;S^Dv$u=Gp_n1TCA#ak+}Geg}o zeHvizN(eIIx)~AW1?oM*iW)~a{YTGhKAjMhfEwck>b=4$jheXjLnD7KB{%`yvf2+| zAcijr1o|Z6>pvR(O9?><$T41^-Y=}|LkVmCYTU0R1|}dIKJ!;e{54^hsf;_H`Fg}# zS-CAV!>~#z zP3X)XN~JKlkq}832l0G61!bj*2VL8DQYrQ&9>GC8-%UW_JvJ2$n$II?1UeR{yR%s) zsWB*sVT2ACn}XpHJdMX>phJHmEqs&P=zkR_#iN=~`aRSEQTKGtdM!!5M%m{CHKa%+&`<238E&+OAn;7iVxL3sj zG^nndM2xTj?p?x#cN+UEo%P-tj(gW8L{dz(uSp6slB(uQ&^R-2uMKzy+MF2;*VeB~ z3QNHaF$4EK0dHrW!cJ6&MP6vZHzb9n;D(ridy~UES{%m_`rW3$ZcYeFLv>gIdW+`7 z+;?DdWOs2~AfcSTKNgS#7-9q5tpQiZcqgw^n3UfZ4@m)Z7=id<;p0q=R=CYyU7>DI z42z^q=ajHr_y#NVL?cwwW{V|+gLv+8P;j0loDvLmcc+A>#Sy_k4EID3LK4Vn?N6st%oa-s2l0G1jIvr) zA0*-4Xn;mF%ihw=r5GT*umSD!VJ0>9qjG;C>OUKpZ~^Q~VJ0=eW8l3n>OUKp8P2~V zOn6LjpcRv>)n+A2k_*hQrUYwfz0ScjCqh8luUn~BC06clq=f4jB9%Laffyc$AcTst zz{>s2REpVR3E?1~2OX41#VqhG)`wEU)8dF=Ack*85JD12<^E18#cZ*Ja1hUT9Tapp zLFIlV8lX|5m0OCzRPIN^Otx}=Kk7dln5o>4g_&&S{$bRAHZW7U|3jEe&0HC++>fUO zYv_c^9fCkc{-;Ke9m<~Cu-XE8YhE_PBHUBm-FiqqTJD`8>aQ9Bi z##C{9V%n~2{~;~hM4(mXK=vpKBKflc5j&0L>74_#aj12Xza$1~_%M2u9ni0D)Ga02qZ0V8fa!jv&g(CG|*UqX<8>JGyS=`sTH1Hvb5p4+fEQeoz_Q1ow2 z42;4iFa!950k0gRHn8Y4K9mrY26aSG|Kq6eg1h6}Vr@t4E{RD-B ze&^#+e}UpD0ySe|Muxcn_DRLm+Jap-ETf2AXtj4myfxIxJR}#wa~T2msemu&6j9Od ziTX#A*-s$L0;JCb9N}bsHWpyg=_HeA0UO{xuee$;+vI}^`pyVi$rqvl1}&V<5F_xu z6tHbmO^!F$?hEmlD(`^2d zPBMF30S+R1{la+aWq&}$gSvTcD#h&4SQNx^UIGRWU#dvZ{?1P$m^}`IfhaCWKtP|` z-yU2TyfB?)_GkheMD(T@3a+E~!Vty)u6am;Q1>pLm1wruB4CK{%?ViC$G|ZW)&F4$ z@-4H`%pRQ!h1f1jKq?Oe7t`LF7Cw6{1_Cj>JpsWKByXu*o)$iP3+P*XgPkfF^KrD#dJ( zI4FqaeTf*R`W1NO;g)ogx#BT6i0A`}D7>^|d$n8BN#=^k;2@$8CZco%Q>PE55zG~d z!ax+a#}Kx_Y!j?K<2@CX8q~9o%tka@RADSc_pu}-o_f= zRG&@4>FsO7OFniAcJFL7b42DqA-2yaA@%f_xX=}SA)R85m@Ew9`BD-JP4(GJ-_(Nd zo1JQo_(E`q^WPVi@qiYu}+i3C!J5Z^_rTD1^i zkakV+Jy7u03al9E3n*MyDlBg3E7Oz;-~BtOrR604JlMOt zO6=#oc|Yyvxh4o<0k5rX$Ig-Q9WWj{617CQMw!=h-^>|`*(lULjx|29EBo5T`(cld z5$&HbzU80uv&YctUUhPBb$F$+QHF;(vd^1$%;|v(L|YtJ=9o6e)o{$q9hZMhujBH( z@`HYM=}zy^%F?rxzgMD#JSi(L_c;`?pIQFahU_sgRueETJR(u5BY<~P1MzY{@d7{^ z>(hXT`u@`Z{8DD$01s(AW*~^wUvNy(aW?$j^5Ef&$h^)EWTrJhE%TRrn8(a4|5P@6 z%s5v<9f6h}Q^t!j-HuQGn9fpLi{o*0Von{6occyqV*M{CR&8)mN4%lIe-|RYdBJ%{ zWqz5>-JJ0kc=;j}0WY_w0kt4=;XGxI@CYx@A)p`cu&?xT|AMeW=7xEOp^XezH)M`I z$IsmDa43dVUhcyPyWY<{WI4(uaQquN8Ztj~ICLC%ZskX0X~OxtUXJ$&aclB~Z4gMz@vde$B@De{S=G460 zU$T7mhPIu^jTdb4wD6<88}njU%|=H)7TI%6t#(J7~w+e5?IlpKq~58#8ZM2x)y}N~sgHuSQHS z1qeQwhOT@|yZ-FXd{8Je9&zD$6T(ZG&x>c46^e1)1p5}gshtDyTvTOHpUp~8OSpo23v9;A@G5YmzJRQ3*N*|K@L)~V9n zh}W6aeO86GWFDS6&n&-k5i%H8Dix8J=LJ3WjlyZs-i>*=JEszVFo2xF*30dj=RcIq zlQzX{5%)1X(l+O+b(Z+J~Gsm8HR34Yw6yd!`W$ud;uJ&>p zK=?%vn!G;e=*%xP;ZXr1+S4!*kIv(wk3#${zWee0mu%+PKjIrRVl7iX^O0vMnU)6# zXkPCnLO$QE>RRU5+n45Xc}5}Ju{869W(qg3?}6!)OY@~-I}jMx1L8o_qvIiQ;9Vv< z9u~*R%JHZ;&^eX|%%_|ul$;*9Xo__-#ow_!+BUF#n`D|tpo4Gnutz3$W37eJ9_usjRP7RV**0K=T?&|u0)reQ%u5AEJK8Ob_UOv|C=P?LZv&=V zV35~@DG7{r3|JWLvCS(PMbyiEV1fT<6vFQgM|CM<(Ck+TUcN1GWHaB*sa!y>=JY?k z3mc9_=ZiC!ifM7?^@l0CbpaicxfgUx@;nJiI@B0HbE_si*Fi)|u3MNn_8C9V^Np%< zoiiT}(_qenLwa{sy9?)Mp3)${c3J|`_&7i=nV;8(<8<{sIxmOXbp1s$G)I+mB|bXy z=_Rp}MoU_K5F`r7b)83>CLGd6QP`>nOjn4$CZD`*IAcB8d^8tk_$&C5{)74iMz;wHFqe{HE(GIIzo_rit# zWeYOPZ#rT{-jJ}DH-fTtVOvxcU1Po^w* zr9-u|phI=FJ5GmcXOmYla}O_f&?5icjhW>?KVorSHhUDFmv86tqH<*E;MmCu-iTb# z{b<9n7*>J_kQ$;szQ}*NF;ids3??UM%0y-cr#^PUymM~e!M?xo4@deJAM_8Ra+Ire zSQ)NO;!VCyleOuIk@4N0r;PfB{JkA8s$J0!@6qh`j!^Kx*o0Cpy$v6Ij(^=j&lT`Z zN#Ig7qDH&Djo*5Xf2)?MW1ObTi~Xllk`oaZKF47&_;=6oKcPw5m3i|R&4!OZ*Z;B; zdv$ymDH1Y?*TIX6@aS{>2c2wjcpWxx=? zRoi@a0ONA}@_GKB965CHgfc^w(1Z=zaO+Y2TNlN0eIH`m@WZ41_i4_K@gbbPG6idy zS=`1`Dv7Ni)#})Utv}iq2Wbp(%r<*UrGa+{sdc12rK-~o2QBdRHokeO|Aj@W2Djr3 zt}Ar7@>)@yI_@2pd-EX^kvNs76J1&j-)~`;NzL2%!KMDUw8&5c>(#M-%%AIMp&Oo9 z>i==kbB%6@W7fMy&yd&o>MH zCk}p&bPCm>Dr%%=V_)G^MLPW*K#)$v+wiA?|5e4-wx>FD#w<)=^p@fW^WOOH9IQkv zIv7ou%PFQ8k`ScJI~7DP!SAK`@y*KyzM9sj9y-9=9yE5%hc>W^wwfWnP z=N8wgcmRZEtT6%Z!-JT3&>4GpFR4_vAU|r86`iLlOR)->X@gbmc04Kiu#e|R&qA+P zt?X5+POUWz}$|E7bU7c}-44sr9l5;mMZpNx!v~dveKur&zk5`lYRW;yZ-?n;2sLE}&jH1#D)~^gz0#*~#2!r)* zp8Q(Tmx@XBOs$~)MyUD+(h@5~zgLw=RSztdnuG3GOO&BpE`?-p8!~7w5?l~bhA1s^360*$a7jb4 z3@aF72&2D$Gae=4%R*QgIq_63CKXP=wt==8PCIH?^(bz^^RrWDG#8F}ae)u8y}O}= z!x(Mdr&VYGrm%MXO8IYdH@3?g`pRuV&}!WQG3cfSRxQi5X7$PI*3YqKuHR3?>mQT# z%_S^{?>=SK`tT$3;n!sL<^6e}Ox5%|HF~L>tKArF?6Nwat&uhJiAK9-Zr);x2xHOq zZMA&=U!%``ut8K^|8QK4<8vCK2jhN`_)Z?)H8?pePirWTsl$7!W3|b%dj`h`cUQ+~ z_d^Klhr}Mr0)H? z!;N+#&VThv{42H8%e}$#*JPIeqG55qx4*~B)qGB~WP-;}tYL6!$Ir(6K;I_yd9Ysn zEU}a5ukJ=4;pI;C{ejH#_b&LMpQkqmB}_P{1y4GYBA))*q`ejk4c-8R7p7;VDmY%N zmDfs(q-kC%9^3&|f|T-9!_+p02svOqz(J|ESr1Iz=&?f}w0aKI!_u|Vf|NnT-@&he7m${hPBo?n-Wpavi>cY*IuXO{nYVRycLus+xi6^$`S z{i_ewr>A6oro1rQ*9EQ16?1;=Aqm1n+Ir}M#_V5H=;Fhw+UVeJg@?(%4%9_?RKB}* zR;hLtXW5hiwQ;=OIygPtKC*XYs-}Ih#s({0asQ@#_sDn^ifW}xv15Hrze^=(EAyQr zyK3d?XmzNr2-Xr`-rNy_^>p?Ro}~ge(p8Zh{Yv>_2e9~wR^5Rp_&MQ~D3R8Eyxa}*{0~E< z%bwk23JSuGU|u(=Wx`UEDnR3}<-)xRx6aaOtfjRuG5URJ5|R@l@bk`D)q@xoy%yn z^&t?qn^08P!J$1>k|^>e%A;$f?ywyh^3)}Rm2t9aN?nBtAy3^iV86_vT&p5#%6IG< z9h}<38*D-JE0B>oO}6fwxxoLHPsM|C;8tiOZTPk8Iq)VZS{?lZcxz%7uD=j=h@2r;z>kH12SRjb#N zYnK+F4~K^CKey?wsYHQWd^-U1xaa?yZSc6F75VWM|V3* z>x_U+zq{RmWeWt11_6B9xL-WSlxKN!iQ9h64MbAG0qH*2BG%=PRXgSwr9_S)1Y#Du zVSPm^0+4GC!Dih5KyJf#BJdTnuzY!^+|kog>cZJAp*S<3z@y)rF@$q=5FkvcaFMnm zImmSwlqVjn=0jvG#&98@SXjk;t-FjW7m)3n2D(r@Zs_!NP}QdEJj z)4w%>!{TOl#}oYO_$Vfw0T>qYAmHVi2}dk@ar!!e&eWc{#lyN-(|QOKlMljOspFYL zsAyz!kk1z5yLF5$Wt?IeXqss*jO=2sHG}@<#h6gz&ua=3c&Tq!ZE~zKIfxgl^+Veu zwQ;OJLIv844!p7gFA&mdcBRt1q3|y_RPOIBp}WJRt!r?6c(giMz-L8&<4Czb!(cUI zGZcFMW{GZ8M0z4;sLZ_1lHIA3fFY*BUI$%4S#@lc7M#e|mr?rr@Fsj2Jx0?^$IJwD z(&}&#at(}(;ic{28d4eaFChI$OyR6Oe5R1^#%H}(V*JZ^ThvGxdt<$;HdXH)*=gTa zk4(osuM^t_94XtRt5N6W>?9q-smJ$w&yhIrkC)}V-hjq<57eZdF>{>ngg~3{>(b-= z(WU;rm*M(qS)TQ6o*0I);sGd_97CFBn3Kivo++%?;D4cElpZlJ%YZ7jJQ}PTM`&GrH1DM8qSJ|;m($Bo~_0I_?)O6!e#tEabkF&e{({p^zAR47%rjygHw|Ma3ukY z-QuT^;kgR)6V>;tLLyI(2hw`B+5A5wL zm)Z)vQ@lMMh?U(^M}fACULFtZ@9V_o7wXO{;$e6-3wGHGYZ2#;cqodyqi_;9|0y2U z$)gj6lM&@V#{+wNI-zD3)+4l%5ZX7O+Vv@beq};9lO@&jCRfBPoz7m=< z2cg0#sKh(t1igJYpp81S62U`B!RTWVM+p^RC8QjVlkoO?u@~(cRTkM(jZ;v&ZHF!i z0yLLhae`tmV%fxT5+sOacbudJ&)UPXHEKTcVoyRiq(D+((-58HD&Dyri4zsem=L1z z(H76E;=$n8;ix@lB!wd##m#7bYk)r*Cn%!FKOLc9AB%^!!Qe>;CKYIdNW+;90p>#k zP+D+b3-25E;L9Ba%$xDccrU`g7-eHR z#MI=_4l~p{XY3~?Yp)uv?wV3MgXjr&2oC;HdO{+j!*-z5h3UPukzsFH?gIR7#d;d% zAw1n*hk{ta0?1oE|JcQSAM=mT@#X>lqi*ps=oF{n*KKqQOqDQW!;PtS*ly{heOk;F zMbnTx8vswn>r&kNnrFk+iOK2^7G;Jj$hr}17CxOra^GY*$rqf%G^B83}BLA{nfK=v_*iml?|8?4NvWaQVBM^l@W~u^Q1~; zWOf2fq$(CY6l;^{%uV)rbU6jWQi6Xow6-c%u5i&sFB`qmf`mk5Le&M~)$8#W+Tx_O39rP z8%ZWmD{WlN!|dN6cW@V?4d-k|u!2qKQK98isxi_Ttk61?W29v1TY0g%g+)4>=H|lm zXbCh?>Bq^~*4+VHFlnrqn5zkOkdzq+H!V@7OnQ@Mx(Z}^0v+R&ys|Xaf=$!WYIOny z8l4z3t6me#BV;`fstI;5%jl-nIu}M*F@MY^{6?SRpd0UleG}0i>_SS@^o&`YS}{Gt zeXp~%d!#B;#+WCn@oQgPur(A5sTKi2kn92-8*}{c5ZMVYF1&7**e;gXHX*LA;-)Sx zJ(-n5ByFIE!+GkwUQ+5p1n4lD@GL#r+llxvohy=5sSJ(2n*CZ*R!EB9E;2~In{)4w z0{UXpUNhpZnAlqyoE#j(THYk`l|ysE2C}<=d$~))oV+}a`!^z9Er@DSsZ#88si zShm8MK}A7DLg^7jHNwuWM-Yw28Fut7RULDOfo1a#wi%`e&CmyI$9N{wYV4 zg5g~=zT~it?``nk=jS6GlsT0>J*qoj9Eg6X!T+cxbUQ&D&Ym9at)68FUha#|nNv6j*)}~niK8sG=4x>CauOA&)PK}_`%zEI_zh^C?r0tl z-HKNgq1vc*wU78{B3m#`-Gn~YG;`GYkGlR`&4J&?e7hXOy|E5dQLJMl;0|dEo4MX8 z2T)B6nCxUli_UnbLK;Xkdm9Mu_>N6XUc5HS%6d3cAecYoWEB;C7<4jo_SrF%e zD(B`e`d!sQY)I|KY|d-UPfQQVI(y6TFqIlMQJ$xnDPtG4INl1A*EpJAhtxQA;Vn~_ zR|5b}Q7^z&87eW;`En%x75MGYb?0d8h4CPv+TUjVS%&(vDwEBu&t@|l=4CUd&d>U- zfs)kQv6XKRf&)vOEtqGZ0$gbKy<{H_`){)KfQhoQjVVahmC=%H{W8h^$;OW!V z=_(LE zl+B!7_`E}h?z|h53V9Yp)U|;Y=?U)BH0)6Zx@5-5ZE>C%z>D5|!J$tk0I~)Ahzp1( zZt*m*9CmGi=?Nt92hzoxIY|Zk#@IZ@bPeLclm-ZXsrj`QCaWr34TG&dVO3iUI6L0o zU+m}?&FXCpY`>g|^j45G05wg_;9u_Pi0X(*8{M$8C6wH9lk{Qk-+|dR^P*`&_LB!{ zYDam+#LV`Q>gX^x_psAN{q3E?3$=arD6VZ#txD~oDbYTzJTS2p=cklYO_pR*jbXjmD`B5gVQ84B3S3p;nHM?Pz>Qc~ zpi$u*PfFPC#_W)XWm=IFivQmd!%fWJOo|!H!V>i(PN1WbcVU5LK$UslE~ksZtfn}= zr^@Rm!$vWugg;J#!L+^DI}1`D9(ouV9~^ao{!0PLUJR=-TA3;LwhkQPfJ{Mps-vFXsskRJ3yM8juBC(Mjhe{x zwRYr?^2afl_IA6l3Gz!aQh9oyHt6{@_EXhd7We~9wX{Br0E&_iaAD7VPV&nYxynM; zF2RC^Z8PzzIE6lh(=@GG1Gi9_-Pb5eg`y7AKrR>S`Z$HbBEU^5c#}PggCw@8vpE2g zT1K*4(#Z^(Lw%c~9%wmDAMi;Ay*-^Q0rU<x5cp z>L6waCD9+lL@nDZcox0bt;UISveJ#1k+@~M)YJ1EU)#lF)Mcjvbad%x!)_mZp~Fz# zT;@`-rX8s1BVH8c5{C?Xh?{$)n-Y1Iu12EEVnjB3EoMM{xkD|ZAy?>SIOMq!T;AlH zHH5uN6Y{hn)?t7Ed_)ih%!fCDv7G~8A2RV%POXqLoRub5Qw zKAr^QNV>mxPbxg4v+B7D)V*LrBC3~}mHbT6OP7sv5V%Hyi4;^B)s~phr;;h8Ykwvl zrs^{fhY7`RlPM(ZkFhZEK4)GqifECXohw-Kj)#j%7b3b)5n-m*(E^*6${3;6r_>qm zrkUcD?qijS4<`1KS=guv;{>_kR;#Kjl29&7N5P;|uH#1hn2Ixz{qiJsQwv>gN_m$yu3Fk{gfvo_T6AxT&MJ zLvD}sZ^pU{v=X`RAXC9_%#*d0zTVE_rp;U@5uJr|%P_69y>AP#UHE5ri}9?f;OxK1 zw!XTK@`zB&_Id?N3fQKva8Zcyi6`deT0ZC{*q-Hz16K}2z}61P06A%ki>EXHOOtYa ziwh9lJU&fw&S#(2fpWH*9NcfT2dP;Kzcv({na0mrljP4Lu5@*Xq+F3RDxBoYYL}${ z-1!tVP`2vC=06tTMA()s+yv@^$v74 zZDS!{s{L@33g%dLs$=v`g+a9YQ_&ObSTn{^(6iEkQp1rrE6Fl2;jEk#Bt7i$Ilj9)F+_HhJpWKF zEm$AA_yR9HIGZI6{~99gr>H&vDk)`9Sq&FZ#!pe*x!ZqF{OG=O!36Ss zygrC*pDax5wcmWV)fq`*+?Ar-n&^{FQ#XXerz{`1S z0%4EnFlq#LsaOwweZAdsY4d`{I;xVsMTy0Vc+ZS+6gQiA$df9AI&he<^{=mUop1t3 zRPtu&>_Lo+CxrxJBT8_gQ`6$S)@$d8KLs+LB;GwEF^@gT`QLl6H=FTp$G`i&Pd>Nh za_4qca5qbBm&4o&&J5!l8^PA}3ck&*J8BCqiy|Bw$Ic;Zy_p_tyTeoq_s$QVNBQ}m z-04a@t8JhU;NE#~R+}e)aK_PTAi1w*{p%W+H9zIg=rZPwW_5cArVx6(gYz@((_>?2 zul5%I6bZp5d*(48r@Co7d19{w;kNm=WuINc;{nbQH;NBrcT+3&&P`wB_8hd^`}CX}&#caJfl2ke^VnxGhf*FY}fRkE26e zbIvKc^ zk$VJT?fL0Zp~cfPa-@l7Uo|`KT?itrH<;AJF8!gXKn=&9ZqmoTndz(g{%;yH43L!wuRHVlc`Ts@TSCZ-8QMJ0PkXrze89r=yj;l-Wy(9@ zzc};hc`9At)zKjLKZ>CBnTO}8++dPbZos6-*AaviEB88+lulEU$S-Ck40oualL3Nh z+tq*R^eH zv24ir_b$vdU)5-0kzvSdGJ>1h6TrU}=`b~Njfwt9LyxRrLXR?TWW_tAQWs3-pf;#- zrp*ee$1=WBnD=Dx7DlG|(uGEt&_aP%$UN96XIWs3!ITQ*>w;l%FY~j;a8aX*3?X2# zi58-&Xpb_{x+?*U{RLV78Cw*gMH+@)n)QFPFyDOfK}I&YSSVe?5}P@;Yxw;_N&_*2 zuHl!EMtXDU#l3$9jZ99}OWJj~BiSiGqGT1CgxI@_B< zam3)OmGSC~LO;*fYYS3C!T5r;V8y$lwyvhV zgOe*L^NL+OMbTWqfmYmbhcE7D7nBeRQ-R`EfduM5mZq2UXbD+SP)LaD%{ngTkCsVp zLMOlih$#tQhsI@kMOy6T?eR)WC#GmkQ=>F0Gdi|{KP|Nbt0X~Kvymhsq~W*W8+1Aq zXDk@(O@xccc12h=sYsHM`z=-^f0J`3NrZQ45kzn&+9n}B@l?s27fg++iiHAsw`Sox{7HZd#w7Iw#y22Wy_}+0@FOIxA}yNo!XnND4d`g@e71ox(;e#qg3u95AzNdqhS zL1jBY)=4*Qf?-3&P=^dNh1ukd!=m-2qax0vF74Zql%;p8`Dfi!7L$y4aT&K+YTbbP||SbREjY523(AcG~_Tr zq$Q`vYjfXruKUoqRa~}Xh>eNA4Hrqupy(zcQXZxhq!wu5LnQktc8HhaIs@vT6NJ@= zo}}QNN+@IbzKShv^Y19<8ydn@Qz^l7if9{>uE4X@45n05nZJKSKN-s8OB(ifmKB<0 zy)|G@RZFOXT(0QmRzS2WydgZZTMlnrSlx>nLL<&1vfJ<3PR$5s8x0oz6}hTuEEPu| zG34m2ZqQ`ux(M2}o^?t5k*XV+bP0*-;>l!-4UZJ7h@xsp91|5njWD4CyVbBedPUlN zOIm~@No4$TLNr1kC$)H`Qp`eSCNR2mAn*wewHw=pf)fyp418w1B+u-qQRYae@v%_$ zsIBg%wEU4+c1r;*BKt>kUfNkn-KPDW#oZMZ3_@gz`ZLIJM&r=93nb{qMIm@7$fa zQ3m6pINkYU1}QV4qQgu=GSMv6 zIAdljrlug^garCX9evuytktW@bBtiCC3$cgGqld^l$tQW{vV2?};;TR9O&Ge|!ZknW43V@e^?tB67)dp9~~lqhnfM}_GLVX(1i zkW?j%Omn{wl`5_hC22wi)6s>D2K3hn=jur+LS)(fR=B8sWa1Cy4twfQu52h6I#-K0)5zGeZwyJoP`_ogISmLRV2rdMMIv!_&;7O2fKgFYF8}Z9{ ztMPBzxnZ1}u8dWu_Ux!ly%3L&)4Y;80i5&}1JCWc42Jwb*}8(<>a5&OoRJ&CZ&;s| zd$Ft_!X6c#JeHHl;@;BNje90I2o8&=9A2cg1}Au-8zIieuLQAM)%HJete!;5TP%xyTH>H}(?Hy49J67gL%c6ROg9%r%o#DGkc1>S!`-T`-@fp!cQ%N^lCu~CM8S>LAGC7HrOCAHx1onu>Mk17=}hafdfo5 z58Z^5Vp0Pb8cv|f@!t!qstVZHh!1@CBJ^I+AL3d}K1I}yyHmUwa*pVNAVrP&nlj{-I?pYk!Cqix{JAM^aiiQ_N96uFZXiazrufB^H2Sm`1K;vNT+HpRp9o3 zG$|PMlq($*umN7(J5rmbnNRrOB2e^-(e*SCU182QLFM zyln0Aa<@UG#fbdnC`C`~lJ0`uw;R7bTK~)A7P~UNNSma`;jzsZ;F_R*pH9DBT!ER% z){g$dvMsAtzF_qWRxb1W7siQtT3*)IFRvJ`Ob9IYA`n&rR>i|wHy80fB_{5gx_Pxg5w8yu zLt;L|X`dCV%qW=i})zmB_F=CKI2 zYWw`brz8jiT=@PvX`-H3`Ar}W?9!-56K1`|?)hI;5RuF95?$EO^ZzYQ8bk&glw_Ly z3cPx*;UU3Ee6N8JNddHA$}H1&Xzi_hzVV>4Cia>G_Vk6N3_Fc{b`WM7m6V0)C; z^#*Fn1+zoam940@4DsEW=7I!oszOa48PXg84KWq4M2iOi6sK}%b~?CIS3q66+l>|P zH{dEAEuYR7`-%xzLDF5Pid%&HI|zl5HxZg6F;4y+B4Vj1wGrRBB%PsMVc7N6FDfuu zTWe=j6LZi&?texyqbJg$Qo_H(72f2tiE;n38?TA55~v!H8f{W>nE3WDh4E5xB~Udh zRScE-w=8ywZqvwK*u`~gSdy%4Bq1Ud5#C%`QGhM(p~>nPtQ6Ubj0Ku*jBgq5rD~Mh zS6!!$8liL@SL=~`*4F@YF1<&yA6UI7>o>}?Ov`d_z(9U!R^G+3HXm{qXZ_COm0#F^ zL+%}T#_%5wyS%|)Qth7}ABW9kZ;^*@taqO6ErM?=pIFEH-1 zh-yI9OquE!@8DBBOuxQU3Q*pYg$)mCW7qort1``B&dz8%)=K-pCH0BD?5C|YcwW}U zUD;7(ILaD?=X(%xNjNYL2Q%@?ms+J`5`?k+!uRW$=5y!IhzX8TOF!QN#1Sv=IK;-FIHqvRcL*=OPt^B#iwhDn?AALkweXoVXo9%XYkEC%6@4-6 z+rw}c*p=lnFZXO?6HHp;Ru*HDnIW&Ce`b{9$CN zRI`x5lH5Nv_~%2Fy|7WG2Seh(W~OCE)le^Ywd9(z2+~V)AV8B#&rGY*r;UV-`D&Yb z0fTp$LAeClE0dyq<0*o9NR&|2A65WHQR7*}QXi_5raW-9T4w>+R0bTCpH`U~vO#Y$ zx1iEYd8VgWd?#jLAwP52_Zv~|#k9UWd88_S9S;-_PO3+cr26;Pn8+zwZ$#~*JgD4g z3aHb<)`Ox}&|dE7tbdK4IT322ss!Wp$=ay2P!z)6Z0|J-rB)x0@|FLn(7y^g{2BO- z8eLvl4WuI91Vz3@7L~<%F04Vf(h^Ec`H)wvT0?{|!-v-fVw9rPv#=MC6G@`%Zi-SuBTXdiiW16O>=Dvcf?14`#?3EB_*M(w%c6X( z#a=!TZXbq^aIF!p)1q83JLf(ZA7NT6OmFj*aicaE60BG8?$hbqEl?c`Eu>@is;rZ# z0Ilk2Y9NLf)X*4kDR)#XDFV@?o(x6K`ZqF^Dgx9!Wr3$$uT8?5EtXS6R%3B7K|qbT zZ(>H^mF%H7=1R_84N3->Erj`gC^_SGYbtXub8?_264Q9<&>65L%jO83Lp*iPl2=p? z@zg@N%*x9}pwF2sHPgOSvw^01amE#>6&>#X6M3Y)L!8GPasHnQ^3kly7dyHqO7qv0 z%t~DpLBE7_KWq(q*?M6#U?m4^ySmjQRf$cI$N-^^E3DKilZu*Nf39nc)*lny|4F$` zJ^Qs5+ZONtNvT6s&1ct%$s_Eq-)l&uOYPrJMBC&I%7HAI8 z9`<#PB%Pd^B-QP73C5_fi1|2>=9(iJ_5(FZI#IgpcKa$Xw59XBl6VG_Bus@?E>oVE zYJ~hx4*Vmg{y2d;bs3c{>RRK_v1<5DXkF`Qs}}GL-ORDjxBhXeIu_L#v?Us~7ZuS3 zl)BOct^i9ZO|r3=$fMMzX7Gr~WU&M+=2!*WSXp#5tbg8XEg>oWp%pKtaFNG)tL>n` z4dv{`;o&h*Ji=yVSFI?_F1+rST}?2mQ{jl8+T;oeps!6q6mC_?#un;S;DTG$-{xcGq7S~oiN(Wbpy_3jL0@jNF(LK<*|T;<%HeZ2t4c}Pft$C%8B`lyNuy|?h%*v%A`D`W-TCF-+IgQ{E^)J+G03=+&)M}Gd`AFM~Xo9Ag?BJG1^MA9|?#~L6MXz9D}(^#xSr=Q>42{$S_SBOIIY;guaJW`H7ey zvPOgT5zIk*260pZFSKwDJdQ<^!BKIBg)sECXgG5VcvWW*22h#%DH!Gp7pH|Xli(Bq zP?IfZQh8e(18?$ZZoyPVh@dNZzuFj#-D*YF>4xznvov8HFlW?2J)R0@8g#&6iZC3lp-TXNsu8P|COg3;SsW5mFM??6f@YPCm0|Y2 z4LMcb?)5>&Wm@2U+ErVN79Y zaTp{gW+_T}uejA=V3y26zn&7cIrO2tnT7EbGX54DIZ!3}n(8E`wDKKYsuNGM2wEE( z!#caH)`>s+dna(xNjo!yW%lGG;tE`s!xR$!TX zwkV(0QMTsuO`+_SrzG5u zjZRxXBeMU!1P*u5f1g?bjmMmkXjPiPzUn-6CU+{n00^DuU@VNyrSn+!1Euqr)1l{M z<fGhW|Y8jjCh>>V$={aU};3%%+r{ARR%bws7N)Qwta9)5>OYAK6$ z&}Y0;W+@BzdJxthCq^r~CacxSdQBIGT7x}LaPUv?9)QajVLMQTpmfVuBh9bD@3leN zi#?QvSF}J@1hC&;p8OWNatx zM4@y{xeQKCp_I^IkPGgE54hovS+4STUT8oAa;6e?iU4oD+|Do42Jsy!QLasME&h*< zv9{Kuu_?DlD@KPD^>YYh0#lz_jtcjQ=Xjq%xs`XD#ZUcN|j1#33aR5Q)c^ki<^sLcs_OpEVWbv?t5}|QevrqN@gwHknlG0z6`>eO& zKM(RBjH94kvu){u)L6^{Ob_Gvxbc!jxBzIAVMLjNuFX0m?B0eiFY+IY6QNQM;siGv z7YfwcxEr~8jr8pt%pPuFaIYK^$6LvK#r8G*R z9-BgD{b@d$l@4^!NX15aMdOCAKifaA!Iq2&AX!FGK$sFXMSEPXX8|D*6vvZzH@x)_ z|4k7@N5(a{49>zZG6pE{MG7A}#J?=U?Z`uJ;Z#KsscgCoet(F6MFe8FIy#8{G~n_! zd~~sYQ$V%ntO^FA>SSdI$7^v`dsN30h$qpagnzKuzctJ^GlG%KvZ<5})n`0!{S}Ae zvX#wT8N67$s&%2EW#WA_$Gnmmb5(Ju6#LK5S^p^$@C?Rjf5oBAe>&8#NF+Fhs|Nx! z59$EB#*yiw0v5JX8sU#5s|xM(u;H z=%|Eh(gYoFCp03f5GK9`7S+#~964k0D88We;XnJ{mn%@f2mAx2)b(BNAHVoM2(oPP zmzmkN^i(}yk(}rG%buP4QpOhEkqn(G;O;9T?jLGgDPODo_P8WDge9?UCh1W`P(UQ-i zdW#l>eEDvxx2VzjVb`|XCMMpZg94w{&E@UhqD6s6e}5lhIM~TBW(((~ zw|V~Bqgbje=yOqD-+`Dbi+tyudt>_zhg_BmUS-JA$ zb)LVNK`pJtLZvcX9U7gQs17w%D&w{Kp2^x-SPeQQ-*frBYMpXCkB&8~mE$Nn)~zip8yzL#(R6lqw3G)lXWn`k_NCUxU=*xR z0CWufIs=?##%*AZH68}#IO7q398WLI2@A_!Md41MvowI~i*z-?H3BI|@ZHRBBGa*) z4x-ZWd^!{&oh#@x>7&Pq*2A#B!1@@B7h0bHXeIr0`iQg2xDCu|<6%(N7>@vCExlCw zh;b5~l0LdlhO373)$qNZ-$bV46gr4X$BXDth;(kC)1;3c8?A?7f3fv37^hmF0O%$3 z)9EA5OO4yWv=|SA(rP>ckT!a$^bw<-PDvkKop4R-TDFPbL}tNu(LvN{IEr*AL^@wa zr%4})PqQ9|z1#X2j2`O~0QJ⩔osW#!VP{l#GW#Io)^!ApP`G=_5;-PDvkKo8g*4 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 z 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%0D-7Y$^7%^n#6c~}%POWx#whPTt*Pwk*s3|N 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 z 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 z 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 GVm|=nIeHfW diff --git a/bundles/mesh/ING9188xx/symdefs.g b/bundles/mesh/ING9188xx/symdefs.g index d34122cbc..87535b6a3 100644 --- a/bundles/mesh/ING9188xx/symdefs.g +++ b/bundles/mesh/ING9188xx/symdefs.g @@ -1,326 +1,267 @@ -PB_ADV_config = 0x00004ff1; -att_dispatch_client_can_send_now = 0x00006ee1; -att_dispatch_client_request_can_send_now_event = 0x00006ee9; -att_dispatch_register_client = 0x00006f01; -att_dispatch_register_server = 0x00006f15; -att_dispatch_server_can_send_now = 0x00006f29; -att_dispatch_server_request_can_send_now_event = 0x00006f31; -att_emit_general_event = 0x00006f49; -att_server_can_send_packet_now = 0x00007745; -att_server_get_mtu = 0x00007749; -att_server_indicate = 0x000077b9; -att_server_init = 0x0000783d; -att_server_notify = 0x00007879; -att_server_register_packet_handler = 0x00007961; -att_server_request_can_send_now_event = 0x0000796d; -att_set_db = 0x00007989; -att_set_read_callback = 0x0000799d; -att_set_write_callback = 0x000079a9; -bd_addr_cmp = 0x00007d89; -bd_addr_copy = 0x00007d8f; -bd_addr_to_str = 0x00007d99; -big_endian_read_16 = 0x00008331; -big_endian_read_32 = 0x00008339; -big_endian_store_16 = 0x0000834d; -big_endian_store_32 = 0x00008359; -ble_gatts_find_chr = 0x00008a99; -ble_gatts_find_svc = 0x00008b31; -bt_dh_key_gen = 0x00008e81; -bt_encrypt_be = 0x00008ea9; -bt_hex = 0x00008ed1; -bt_le_adv_start = 0x00008f31; -bt_le_adv_stop = 0x00009059; -bt_mesh_init = 0x0000b7bd; -bt_mesh_input_number = 0x0000b81d; -bt_mesh_input_string = 0x0000b891; -bt_mesh_is_provisioned = 0x0000b90d; -bt_mesh_model_elem = 0x0000bdcd; -bt_mesh_model_msg_init = 0x0000bfa1; -bt_mesh_model_publish = 0x0000c039; -bt_mesh_model_send = 0x0000c47d; -bt_mesh_prov_disable = 0x0000e625; -bt_mesh_prov_enable = 0x0000e65d; -bt_mesh_provision = 0x0000e819; -bt_mesh_reset = 0x0000efdd; -bt_pub_key_gen = 0x0000fa71; -bt_pub_key_get = 0x0000faa1; -bt_rand = 0x0000fab5; -btstack_push_user_msg = 0x0000fd31; -char_for_nibble = 0x000102db; -eTaskConfirmSleepModeStatus = 0x00011779; -gap_add_dev_to_periodic_list = 0x00013ad5; -gap_add_whitelist = 0x00013aed; -gap_aes_encrypt = 0x00013b01; -gap_clr_adv_set = 0x00013b29; -gap_clr_periodic_adv_list = 0x00013b39; -gap_create_connection_cancel = 0x00013b65; -gap_disconnect = 0x00013b75; -gap_ext_create_connection = 0x00013c09; -gap_get_connection_parameter_range = 0x00013ccd; -gap_periodic_adv_create_sync = 0x00013d65; -gap_periodic_adv_create_sync_cancel = 0x00013d89; -gap_periodic_adv_term_sync = 0x00013d99; -gap_read_periodic_adv_list_size = 0x00013ea5; -gap_read_phy = 0x00013eb5; -gap_remove_whitelist = 0x00013ec9; -gap_rmv_adv_set = 0x00013f55; -gap_rmv_dev_from_periodic_list = 0x00013f69; -gap_set_adv_set_random_addr = 0x00013fa9; -gap_set_connection_parameter_range = 0x00013ff5; -gap_set_def_phy = 0x0001400d; -gap_set_ext_adv_data = 0x00014025; -gap_set_ext_adv_enable = 0x0001403d; -gap_set_ext_adv_para = 0x000140b9; -gap_set_ext_scan_enable = 0x00014185; -gap_set_ext_scan_para = 0x0001419d; -gap_set_ext_scan_response_data = 0x00014245; -gap_set_host_channel_classification = 0x0001425d; -gap_set_periodic_adv_data = 0x00014271; -gap_set_periodic_adv_enable = 0x000142e5; -gap_set_periodic_adv_para = 0x000142f9; -gap_set_phy = 0x00014311; -gap_set_random_device_address = 0x0001432d; -gap_start_ccm = 0x00014391; -gap_update_connection_parameters = 0x000143c5; -gatt_client_cancel_write = 0x0001487d; -gatt_client_deserialize_characteristic = 0x000148a3; -gatt_client_deserialize_characteristic_descriptor = 0x000148db; -gatt_client_deserialize_service = 0x000148e9; -gatt_client_discover_characteristic_descriptors = 0x00014915; -gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x00014957; -gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x000149a7; -gatt_client_discover_characteristics_for_service = 0x000149f7; -gatt_client_discover_characteristics_for_service_by_uuid128 = 0x00014a2f; -gatt_client_discover_characteristics_for_service_by_uuid16 = 0x00014a3d; -gatt_client_discover_primary_services = 0x00014a4b; -gatt_client_discover_primary_services_by_uuid128 = 0x00014a7d; -gatt_client_discover_primary_services_by_uuid16 = 0x00014ac1; -gatt_client_execute_write = 0x00014afd; -gatt_client_find_included_services_for_service = 0x00014b23; -gatt_client_get_mtu = 0x00014b53; -gatt_client_is_ready = 0x00014bfd; -gatt_client_listen_for_characteristic_value_updates = 0x00014c13; -gatt_client_prepare_write = 0x00014c39; -gatt_client_pts_suppress_mtu_exchange = 0x00014c75; -gatt_client_read_characteristic_descriptor = 0x00014c81; -gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x00014c87; -gatt_client_read_long_characteristic_descriptor = 0x00014cb1; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x00014cb9; -gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00014cbf; -gatt_client_read_long_value_of_characteristic = 0x00014ced; -gatt_client_read_long_value_of_characteristic_using_value_handle = 0x00014cf5; -gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00014cfb; -gatt_client_read_multiple_characteristic_values = 0x00014d29; -gatt_client_read_value_of_characteristic = 0x00014d59; -gatt_client_read_value_of_characteristic_using_value_handle = 0x00014d5f; -gatt_client_read_value_of_characteristics_by_uuid128 = 0x00014d8d; -gatt_client_read_value_of_characteristics_by_uuid16 = 0x00014dd9; -gatt_client_register_handler = 0x00014e25; -gatt_client_reliable_write_long_value_of_characteristic = 0x00014e31; -gatt_client_signed_write_without_response = 0x0001525d; -gatt_client_write_characteristic_descriptor = 0x00015321; -gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x0001532f; -gatt_client_write_client_characteristic_configuration = 0x00015369; -gatt_client_write_long_characteristic_descriptor = 0x000153bb; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x000153cd; -gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x000153dd; -gatt_client_write_long_value_of_characteristic = 0x00015419; -gatt_client_write_long_value_of_characteristic_with_offset = 0x00015429; -gatt_client_write_value_of_characteristic = 0x00015465; -gatt_client_write_value_of_characteristic_without_response = 0x0001549b; -hci_add_event_handler = 0x00018f9d; -hci_power_control = 0x000197d9; -hci_register_acl_packet_handler = 0x000199d9; -k_delayed_work_add_arg = 0x0001ae4d; -k_delayed_work_cancel = 0x0001ae51; -k_delayed_work_init = 0x0001ae67; -k_delayed_work_remaining_get = 0x0001ae81; -k_delayed_work_submit = 0x0001aea7; -k_fifo_is_empty = 0x0001aec3; -k_sleep = 0x0001aeeb; -k_uptime_get = 0x0001aef9; -k_uptime_get_32 = 0x0001af0d; -k_work_add_arg = 0x0001af1f; -k_work_init = 0x0001af23; -k_work_submit = 0x0001af3d; -kv_commit = 0x0001b1dd; -kv_get = 0x0001b239; -kv_init = 0x0001b251; -kv_put = 0x0001b2a1; -kv_remove = 0x0001b319; -kv_remove_all = 0x0001b355; -kv_value_append = 0x0001b419; -kv_value_modified = 0x0001b47d; -kv_value_trunc = 0x0001b481; -kv_visit = 0x0001b4d1; -l2cap_can_send_fixed_channel_packet_now = 0x0001b545; -l2cap_init = 0x0001b89d; -l2cap_max_le_mtu = 0x0001b8e1; -l2cap_register_fixed_channel = 0x0001b965; -l2cap_request_can_send_fix_channel_now_event = 0x0001b981; -l2cap_send_connectionless = 0x0001bb29; -l2cap_send_connectionless3 = 0x0001bbb9; -l2cap_send_signaling_le = 0x0001bca5; -le_adv_status_reset = 0x0001bce1; -mesh_platform_config = 0x0002a639; -mesh_set_dev_name = 0x0002a8c9; -mesh_setup = 0x0002a8d5; -net_buf_add_zeros = 0x0002d945; -net_buf_get = 0x0002d973; -net_buf_put = 0x0002d983; -net_buf_ref = 0x0002d9a1; -net_buf_reserve = 0x0002d9b1; -net_buf_simple_add = 0x0002d9c3; -net_buf_simple_add_be16 = 0x0002d9c7; -net_buf_simple_add_be32 = 0x0002d9dd; -net_buf_simple_add_le16 = 0x0002d9ef; -net_buf_simple_add_le32 = 0x0002d9fb; -net_buf_simple_add_u8 = 0x0002da07; -net_buf_simple_pull = 0x0002da63; -net_buf_simple_pull_be16 = 0x0002da6f; -net_buf_simple_pull_be32 = 0x0002da97; -net_buf_simple_pull_le16 = 0x0002dabf; -net_buf_simple_pull_le32 = 0x0002dae7; -net_buf_simple_pull_u8 = 0x0002db0f; -net_buf_simple_push = 0x0002db2f; -net_buf_simple_push_be16 = 0x0002db53; -net_buf_simple_push_le16 = 0x0002db87; -net_buf_simple_push_u8 = 0x0002dbbb; -net_buf_slist_get = 0x0002dc25; -net_buf_slist_init = 0x0002dc4d; -net_buf_slist_is_empty = 0x0002dc55; -net_buf_slist_merge_slist = 0x0002dc61; -net_buf_slist_peek_head = 0x0002dc7d; -net_buf_slist_peek_next = 0x0002dc87; -net_buf_slist_put = 0x0002dc91; -net_buf_slist_remove = 0x0002dca1; -net_buf_unref = 0x0002dcdb; -nibble_for_char = 0x0002ed75; -npl_freertos_callout_init = 0x0002f405; -npl_freertos_callout_remaining_ticks = 0x0002f441; -npl_freertos_callout_reset = 0x0002f459; -npl_freertos_eventq_get = 0x0002f4f5; -npl_freertos_eventq_put = 0x0002f549; -npl_freertos_sem_init = 0x0002f5a1; -npl_freertos_sem_pend = 0x0002f5bd; -npl_freertos_sem_release = 0x0002f611; -npl_freertos_time_ms_to_ticks = 0x0002f661; -os_mbuf_adj = 0x0002f78f; -os_mbuf_append = 0x0002f827; -os_mbuf_appendfrom = 0x0002f8bf; -os_mbuf_cmpf = 0x0002f915; -os_mbuf_cmpm = 0x0002f975; -os_mbuf_concat = 0x0002fa33; -os_mbuf_copydata = 0x0002fa6f; -os_mbuf_copyinto = 0x0002fac7; -os_mbuf_dup = 0x0002fb45; -os_mbuf_extend = 0x0002fbb5; -os_mbuf_free = 0x0002fc05; -os_mbuf_free_chain = 0x0002fc1d; -os_mbuf_get = 0x0002fc33; -os_mbuf_get_pkthdr = 0x0002fc5f; -os_mbuf_off = 0x0002fc8f; -os_mbuf_pool_init = 0x0002fcad; -os_mbuf_prepend = 0x0002fcb7; -os_mbuf_prepend_pullup = 0x0002fd39; -os_mbuf_pullup = 0x0002fd51; -os_mbuf_trim_front = 0x0002fe1d; -os_mqueue_get = 0x0002ff3d; -os_mqueue_init = 0x0002ff63; -os_mqueue_put = 0x0002ff75; -os_msys_count = 0x0002ffad; -os_msys_get = 0x0002ffc9; -os_msys_get_pkthdr = 0x0002ffe1; -os_msys_num_free = 0x00030041; -os_msys_register = 0x0003005d; -os_msys_reset = 0x00030099; -platform_config = 0x0003038d; -platform_get_version = 0x000303b9; -platform_printf = 0x000303c1; -platform_raise_assertion = 0x000303d5; -platform_set_evt_callback = 0x00030465; -platform_set_irq_callback = 0x00030479; -platform_set_rf_clk_source = 0x000304bd; -platform_set_rf_init_data = 0x000304c9; -platform_set_rf_power_mapping = 0x000304d5; -platform_shutdown = 0x000304e1; -printf_hexdump = 0x0003149d; -pvPortMalloc = 0x00034611; -pvTaskIncrementMutexHeldCount = 0x000346f5; -pvTimerGetTimerID = 0x0003470d; -pxPortInitialiseStack = 0x00034739; -reverse_128 = 0x00034ead; -reverse_24 = 0x00034eb3; -reverse_48 = 0x00034eb9; -reverse_56 = 0x00034ebf; -reverse_64 = 0x00034ec5; -reverse_bd_addr = 0x00034ecb; -reverse_bytes = 0x00034ed1; -settings_bytes_from_str = 0x000374bd; -settings_str_from_bytes = 0x000374cf; -sm_add_event_handler = 0x00037665; -sm_address_resolution_lookup = 0x000377b1; -sm_authenticated = 0x0003788b; -sm_authorization_decline = 0x000378a1; -sm_authorization_grant = 0x000378c1; -sm_authorization_state = 0x000378e1; -sm_bonding_decline = 0x000378fd; -sm_config = 0x00037df5; -sm_encryption_key_size = 0x00037ef5; -sm_just_works_confirm = 0x00038861; -sm_le_device_key = 0x00038b91; -sm_passkey_input = 0x00038c81; -sm_private_random_address_generation_get = 0x00039051; -sm_private_random_address_generation_get_mode = 0x00039059; -sm_private_random_address_generation_set_mode = 0x00039065; -sm_private_random_address_generation_set_update_period = 0x0003908d; -sm_register_oob_data_callback = 0x000390c5; -sm_request_pairing = 0x000390d1; -sm_send_security_request = 0x00039c5d; -sm_set_accepted_stk_generation_methods = 0x00039c85; -sm_set_authentication_requirements = 0x00039c91; -sm_set_encryption_key_size_range = 0x00039c9d; -sscanf_bd_addr = 0x0003a04d; -sysSetPublicDeviceAddr = 0x0003b429; -uuid128_to_str = 0x0003d609; -uuid_add_bluetooth_prefix = 0x0003d661; -uuid_has_bluetooth_prefix = 0x0003d681; -vPortFree = 0x0003d7c9; -vQueueWaitForMessageRestricted = 0x0003d999; -vTaskDelay = 0x0003d9e1; -vTaskInternalSetTimeOutState = 0x0003da2d; -vTaskMissedYield = 0x0003da3d; -vTaskPlaceOnEventList = 0x0003da49; -vTaskPlaceOnEventListRestricted = 0x0003da81; -vTaskPriorityDisinheritAfterTimeout = 0x0003dac1; -vTaskStartScheduler = 0x0003db6d; -vTaskStepTick = 0x0003dbf9; -vTaskSuspendAll = 0x0003dc29; -vTaskSwitchContext = 0x0003dc39; -xPortStartScheduler = 0x0003e0bd; -xQueueCreateCountingSemaphore = 0x0003e179; -xQueueGenericCreate = 0x0003e1b5; -xQueueGenericCreateStatic = 0x0003e201; -xQueueGenericReset = 0x0003e269; -xQueueGenericSend = 0x0003e2f5; -xQueueGenericSendFromISR = 0x0003e45d; -xQueueGiveFromISR = 0x0003e51d; -xQueueIsQueueEmptyFromISR = 0x0003e5c1; -xQueueReceive = 0x0003e5e5; -xQueueReceiveFromISR = 0x0003e711; -xQueueSemaphoreTake = 0x0003e7a5; -xTaskCheckForTimeOut = 0x0003e90d; -xTaskCreate = 0x0003e97d; -xTaskCreateStatic = 0x0003e9d9; -xTaskGetSchedulerState = 0x0003ea49; -xTaskGetTickCount = 0x0003ea65; -xTaskGetTickCountFromISR = 0x0003ea71; -xTaskIncrementTick = 0x0003ea81; -xTaskPriorityDisinherit = 0x0003eb4d; -xTaskPriorityInherit = 0x0003ebe1; -xTaskRemoveFromEventList = 0x0003ec75; -xTaskResumeAll = 0x0003ecf5; -xTimerCreate = 0x0003edbd; -xTimerCreateTimerTask = 0x0003edf1; -xTimerGenericCommand = 0x0003ee5d; -xTimerGetExpiryTime = 0x0003eecd; +att_dispatch_client_can_send_now = 0x00006329; +att_dispatch_client_request_can_send_now_event = 0x0000632f; +att_dispatch_register_client = 0x00006335; +att_dispatch_register_server = 0x00006349; +att_dispatch_server_can_send_now = 0x0000635d; +att_dispatch_server_request_can_send_now_event = 0x00006363; +att_emit_general_event = 0x00006421; +att_server_can_send_packet_now = 0x00006b59; +att_server_get_mtu = 0x00006b5d; +att_server_indicate = 0x00006bd1; +att_server_init = 0x00006c55; +att_server_notify = 0x00006c91; +att_server_register_packet_handler = 0x00006d79; +att_server_request_can_send_now_event = 0x00006d85; +att_set_db = 0x00006da1; +att_set_read_callback = 0x00006db5; +att_set_write_callback = 0x00006dc1; +bd_addr_cmp = 0x00006f05; +bd_addr_copy = 0x00006f0b; +bd_addr_to_str = 0x00006f15; +big_endian_read_16 = 0x00006f4d; +big_endian_read_32 = 0x00006f55; +big_endian_store_16 = 0x00006f69; +big_endian_store_32 = 0x00006f75; +btstack_push_user_msg = 0x000072f9; +char_for_nibble = 0x00007565; +eTaskConfirmSleepModeStatus = 0x000077f5; +gap_add_dev_to_periodic_list = 0x00008101; +gap_add_whitelist = 0x00008119; +gap_aes_encrypt = 0x0000812d; +gap_clear_white_lists = 0x00008155; +gap_clr_adv_set = 0x00008165; +gap_clr_periodic_adv_list = 0x00008175; +gap_create_connection_cancel = 0x000081a1; +gap_default_periodic_adv_sync_transfer_param = 0x000081b1; +gap_disconnect = 0x000081c9; +gap_disconnect_all = 0x000081f5; +gap_ext_create_connection = 0x0000829d; +gap_get_connection_parameter_range = 0x00008361; +gap_le_read_channel_map = 0x0000839d; +gap_periodic_adv_create_sync = 0x00008411; +gap_periodic_adv_create_sync_cancel = 0x00008435; +gap_periodic_adv_set_info_transfer = 0x00008445; +gap_periodic_adv_sync_transfer = 0x0000845d; +gap_periodic_adv_sync_transfer_param = 0x00008475; +gap_periodic_adv_term_sync = 0x00008491; +gap_read_antenna_info = 0x00008525; +gap_read_periodic_adv_list_size = 0x00008535; +gap_read_phy = 0x00008545; +gap_read_remote_info = 0x00008559; +gap_read_remote_used_features = 0x0000856d; +gap_read_rssi = 0x00008581; +gap_remove_whitelist = 0x00008595; +gap_rmv_adv_set = 0x00008621; +gap_rmv_dev_from_periodic_list = 0x00008635; +gap_set_adv_set_random_addr = 0x00008675; +gap_set_connection_cte_request_enable = 0x000086c1; +gap_set_connection_cte_response_enable = 0x000086dd; +gap_set_connection_cte_rx_param = 0x000086f1; +gap_set_connection_cte_tx_param = 0x0000874d; +gap_set_connection_parameter_range = 0x000087a1; +gap_set_connectionless_cte_tx_enable = 0x000087b9; +gap_set_connectionless_cte_tx_param = 0x000087cd; +gap_set_connectionless_iq_sampling_enable = 0x00008831; +gap_set_def_phy = 0x00008895; +gap_set_ext_adv_data = 0x000088ad; +gap_set_ext_adv_enable = 0x000088c5; +gap_set_ext_adv_para = 0x00008941; +gap_set_ext_scan_enable = 0x00008a21; +gap_set_ext_scan_para = 0x00008a39; +gap_set_ext_scan_response_data = 0x00008ae1; +gap_set_host_channel_classification = 0x00008af9; +gap_set_periodic_adv_data = 0x00008b0d; +gap_set_periodic_adv_enable = 0x00008b81; +gap_set_periodic_adv_para = 0x00008b95; +gap_set_periodic_adv_rx_enable = 0x00008bad; +gap_set_phy = 0x00008bc1; +gap_set_random_device_address = 0x00008bdd; +gap_start_ccm = 0x00008c41; +gap_update_connection_parameters = 0x00008c75; +gatt_client_cancel_write = 0x0000915d; +gatt_client_discover_characteristic_descriptors = 0x00009183; +gatt_client_discover_characteristics_for_handle_range_by_uuid128 = 0x000091c5; +gatt_client_discover_characteristics_for_handle_range_by_uuid16 = 0x00009215; +gatt_client_discover_characteristics_for_service = 0x00009265; +gatt_client_discover_primary_services = 0x0000929b; +gatt_client_discover_primary_services_by_uuid128 = 0x000092cd; +gatt_client_discover_primary_services_by_uuid16 = 0x00009311; +gatt_client_execute_write = 0x0000934d; +gatt_client_find_included_services_for_service = 0x00009373; +gatt_client_get_mtu = 0x000093a1; +gatt_client_is_ready = 0x00009449; +gatt_client_listen_for_characteristic_value_updates = 0x0000945f; +gatt_client_prepare_write = 0x00009483; +gatt_client_pts_suppress_mtu_exchange = 0x000094c1; +gatt_client_read_characteristic_descriptor_using_descriptor_handle = 0x000094cd; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle = 0x000094f7; +gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x000094fd; +gatt_client_read_long_value_of_characteristic_using_value_handle = 0x0000952b; +gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset = 0x00009531; +gatt_client_read_multiple_characteristic_values = 0x0000955f; +gatt_client_read_value_of_characteristic_using_value_handle = 0x0000958f; +gatt_client_read_value_of_characteristics_by_uuid128 = 0x000095bd; +gatt_client_read_value_of_characteristics_by_uuid16 = 0x00009609; +gatt_client_register_handler = 0x00009655; +gatt_client_reliable_write_long_value_of_characteristic = 0x00009661; +gatt_client_signed_write_without_response = 0x00009a8d; +gatt_client_write_characteristic_descriptor_using_descriptor_handle = 0x00009b51; +gatt_client_write_client_characteristic_configuration = 0x00009b8b; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle = 0x00009bdd; +gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset = 0x00009bed; +gatt_client_write_long_value_of_characteristic = 0x00009c29; +gatt_client_write_long_value_of_characteristic_with_offset = 0x00009c39; +gatt_client_write_value_of_characteristic = 0x00009c75; +gatt_client_write_value_of_characteristic_without_response = 0x00009cab; +hci_add_event_handler = 0x0000b235; +hci_power_control = 0x0000b97d; +hci_register_acl_packet_handler = 0x0000bb31; +kv_commit = 0x0000c199; +kv_get = 0x0000c1d1; +kv_init = 0x0000c1e9; +kv_put = 0x0000c239; +kv_remove = 0x0000c2b1; +kv_remove_all = 0x0000c2ed; +kv_value_modified = 0x0000c331; +kv_visit = 0x0000c335; +l2cap_can_send_fixed_channel_packet_now = 0x0000c3f5; +l2cap_can_send_packet_now = 0x0000c3f9; +l2cap_create_channel = 0x0000c5b1; +l2cap_disconnect = 0x0000c6e9; +l2cap_get_remote_mtu_for_local_cid = 0x0000c98d; +l2cap_init = 0x0000ce0d; +l2cap_le_send_flow_control_credit = 0x0000ce55; +l2cap_max_le_mtu = 0x0000d0b9; +l2cap_max_mtu = 0x0000d0bd; +l2cap_next_local_cid = 0x0000d0c1; +l2cap_next_sig_id = 0x0000d0d1; +l2cap_register_fixed_channel = 0x0000d169; +l2cap_register_packet_handler = 0x0000d185; +l2cap_register_service = 0x0000d191; +l2cap_request_can_send_fix_channel_now_event = 0x0000d279; +l2cap_request_can_send_now_event = 0x0000d29d; +l2cap_request_connection_parameter_update = 0x0000d2b7; +l2cap_require_security_level_2_for_outgoing_sdp = 0x0000d2e9; +l2cap_send = 0x0000d6ad; +l2cap_send_connectionless = 0x0000d725; +l2cap_send_connectionless3 = 0x0000d7b5; +l2cap_send_echo_request = 0x0000d84d; +l2cap_send_signaling_le = 0x0000d8b1; +l2cap_unregister_service = 0x0000d909; +ll_hint_on_ce_len = 0x0000daed; +ll_set_adv_coded_scheme = 0x0000ddd1; +ll_set_def_antenna = 0x0000de01; +ll_set_initiating_coded_scheme = 0x0000de1d; +nibble_for_char = 0x0001dbfd; +platform_config = 0x0001dca1; +platform_get_heap_status = 0x0001dd01; +platform_get_version = 0x0001dd19; +platform_hrng = 0x0001dd21; +platform_patch_rf_init_data = 0x0001dd29; +platform_printf = 0x0001dd45; +platform_raise_assertion = 0x0001dd59; +platform_read_persistent_reg = 0x0001dd6d; +platform_reset = 0x0001dd7d; +platform_set_evt_callback = 0x0001ddb1; +platform_set_irq_callback = 0x0001ddc5; +platform_set_rf_clk_source = 0x0001ddfd; +platform_set_rf_init_data = 0x0001de09; +platform_set_rf_power_mapping = 0x0001de15; +platform_shutdown = 0x0001de21; +platform_switch_app = 0x0001de25; +platform_write_persistent_reg = 0x0001de49; +printf_hexdump = 0x0001de59; +pvPortMalloc = 0x0001e955; +pvTaskIncrementMutexHeldCount = 0x0001ea3d; +pvTimerGetTimerID = 0x0001ea55; +pxPortInitialiseStack = 0x0001ea81; +reverse_128 = 0x0001ec41; +reverse_24 = 0x0001ec47; +reverse_48 = 0x0001ec4d; +reverse_56 = 0x0001ec53; +reverse_64 = 0x0001ec59; +reverse_bd_addr = 0x0001ec5f; +reverse_bytes = 0x0001ec65; +sm_add_event_handler = 0x0001ee09; +sm_address_resolution_lookup = 0x0001ef35; +sm_authenticated = 0x0001f00f; +sm_authorization_decline = 0x0001f01d; +sm_authorization_grant = 0x0001f03d; +sm_authorization_state = 0x0001f05d; +sm_bonding_decline = 0x0001f079; +sm_config = 0x0001f451; +sm_encryption_key_size = 0x0001f55d; +sm_just_works_confirm = 0x0001fd2d; +sm_le_device_key = 0x0001ff7d; +sm_passkey_input = 0x00020015; +sm_private_random_address_generation_get = 0x000203a1; +sm_private_random_address_generation_get_mode = 0x000203a9; +sm_private_random_address_generation_set_mode = 0x000203b5; +sm_private_random_address_generation_set_update_period = 0x000203dd; +sm_register_oob_data_callback = 0x00020415; +sm_request_pairing = 0x00020421; +sm_send_security_request = 0x00020e5b; +sm_set_accepted_stk_generation_methods = 0x00020e81; +sm_set_authentication_requirements = 0x00020e8d; +sm_set_encryption_key_size_range = 0x00020e99; +sscanf_bd_addr = 0x0002116d; +sysSetPublicDeviceAddr = 0x000214c1; +uuid128_to_str = 0x00021a91; +uuid_add_bluetooth_prefix = 0x00021ae9; +uuid_has_bluetooth_prefix = 0x00021b09; +uxQueueMessagesWaiting = 0x00021b4d; +uxQueueMessagesWaitingFromISR = 0x00021b75; +uxQueueSpacesAvailable = 0x00021b91; +vPortFree = 0x00021cc1; +vQueueDelete = 0x00021e81; +vQueueWaitForMessageRestricted = 0x00021ead; +vTaskDelay = 0x00021ef5; +vTaskInternalSetTimeOutState = 0x00021f41; +vTaskMissedYield = 0x00021f51; +vTaskPlaceOnEventList = 0x00021f5d; +vTaskPlaceOnEventListRestricted = 0x00021f95; +vTaskPriorityDisinheritAfterTimeout = 0x00021fd5; +vTaskStartScheduler = 0x00022081; +vTaskStepTick = 0x00022111; +vTaskSuspendAll = 0x00022141; +vTaskSwitchContext = 0x00022151; +xPortStartScheduler = 0x000221f9; +xQueueAddToSet = 0x000222b5; +xQueueCreateCountingSemaphore = 0x000222d9; +xQueueCreateCountingSemaphoreStatic = 0x00022315; +xQueueCreateMutex = 0x00022359; +xQueueCreateMutexStatic = 0x0002236f; +xQueueCreateSet = 0x00022389; +xQueueGenericCreate = 0x00022391; +xQueueGenericCreateStatic = 0x000223dd; +xQueueGenericReset = 0x00022445; +xQueueGenericSend = 0x000224d1; +xQueueGenericSendFromISR = 0x0002263d; +xQueueGiveFromISR = 0x000226fd; +xQueueGiveMutexRecursive = 0x000227a1; +xQueueIsQueueEmptyFromISR = 0x000227e1; +xQueueIsQueueFullFromISR = 0x00022805; +xQueuePeek = 0x0002282d; +xQueuePeekFromISR = 0x00022955; +xQueueReceive = 0x000229c1; +xQueueReceiveFromISR = 0x00022aed; +xQueueRemoveFromSet = 0x00022b81; +xQueueSelectFromSet = 0x00022ba3; +xQueueSelectFromSetFromISR = 0x00022bb5; +xQueueSemaphoreTake = 0x00022bc9; +xQueueTakeMutexRecursive = 0x00022d35; +xTaskCheckForTimeOut = 0x00022d79; +xTaskCreate = 0x00022de9; +xTaskCreateStatic = 0x00022e45; +xTaskGetCurrentTaskHandle = 0x00022eb5; +xTaskGetSchedulerState = 0x00022ec1; +xTaskGetTickCount = 0x00022edd; +xTaskIncrementTick = 0x00022ee9; +xTaskPriorityDisinherit = 0x00022fb5; +xTaskPriorityInherit = 0x00023049; +xTaskRemoveFromEventList = 0x000230dd; +xTaskResumeAll = 0x0002315d; +xTimerCreate = 0x00023225; +xTimerCreateStatic = 0x00023259; +xTimerCreateTimerTask = 0x00023291; +xTimerGenericCommand = 0x000232fd; diff --git a/bundles/mesh/ING9188xx/symdefs.i b/bundles/mesh/ING9188xx/symdefs.i index 86699cba0..183e0f86e 100644 --- a/bundles/mesh/ING9188xx/symdefs.i +++ b/bundles/mesh/ING9188xx/symdefs.i @@ -1,326 +1,267 @@ ---define_symbol PB_ADV_config=0x00004ff1 ---define_symbol att_dispatch_client_can_send_now=0x00006ee1 ---define_symbol att_dispatch_client_request_can_send_now_event=0x00006ee9 ---define_symbol att_dispatch_register_client=0x00006f01 ---define_symbol att_dispatch_register_server=0x00006f15 ---define_symbol att_dispatch_server_can_send_now=0x00006f29 ---define_symbol att_dispatch_server_request_can_send_now_event=0x00006f31 ---define_symbol att_emit_general_event=0x00006f49 ---define_symbol att_server_can_send_packet_now=0x00007745 ---define_symbol att_server_get_mtu=0x00007749 ---define_symbol att_server_indicate=0x000077b9 ---define_symbol att_server_init=0x0000783d ---define_symbol att_server_notify=0x00007879 ---define_symbol att_server_register_packet_handler=0x00007961 ---define_symbol att_server_request_can_send_now_event=0x0000796d ---define_symbol att_set_db=0x00007989 ---define_symbol att_set_read_callback=0x0000799d ---define_symbol att_set_write_callback=0x000079a9 ---define_symbol bd_addr_cmp=0x00007d89 ---define_symbol bd_addr_copy=0x00007d8f ---define_symbol bd_addr_to_str=0x00007d99 ---define_symbol big_endian_read_16=0x00008331 ---define_symbol big_endian_read_32=0x00008339 ---define_symbol big_endian_store_16=0x0000834d ---define_symbol big_endian_store_32=0x00008359 ---define_symbol ble_gatts_find_chr=0x00008a99 ---define_symbol ble_gatts_find_svc=0x00008b31 ---define_symbol bt_dh_key_gen=0x00008e81 ---define_symbol bt_encrypt_be=0x00008ea9 ---define_symbol bt_hex=0x00008ed1 ---define_symbol bt_le_adv_start=0x00008f31 ---define_symbol bt_le_adv_stop=0x00009059 ---define_symbol bt_mesh_init=0x0000b7bd ---define_symbol bt_mesh_input_number=0x0000b81d ---define_symbol bt_mesh_input_string=0x0000b891 ---define_symbol bt_mesh_is_provisioned=0x0000b90d ---define_symbol bt_mesh_model_elem=0x0000bdcd ---define_symbol bt_mesh_model_msg_init=0x0000bfa1 ---define_symbol bt_mesh_model_publish=0x0000c039 ---define_symbol bt_mesh_model_send=0x0000c47d ---define_symbol bt_mesh_prov_disable=0x0000e625 ---define_symbol bt_mesh_prov_enable=0x0000e65d ---define_symbol bt_mesh_provision=0x0000e819 ---define_symbol bt_mesh_reset=0x0000efdd ---define_symbol bt_pub_key_gen=0x0000fa71 ---define_symbol bt_pub_key_get=0x0000faa1 ---define_symbol bt_rand=0x0000fab5 ---define_symbol btstack_push_user_msg=0x0000fd31 ---define_symbol char_for_nibble=0x000102db ---define_symbol eTaskConfirmSleepModeStatus=0x00011779 ---define_symbol gap_add_dev_to_periodic_list=0x00013ad5 ---define_symbol gap_add_whitelist=0x00013aed ---define_symbol gap_aes_encrypt=0x00013b01 ---define_symbol gap_clr_adv_set=0x00013b29 ---define_symbol gap_clr_periodic_adv_list=0x00013b39 ---define_symbol gap_create_connection_cancel=0x00013b65 ---define_symbol gap_disconnect=0x00013b75 ---define_symbol gap_ext_create_connection=0x00013c09 ---define_symbol gap_get_connection_parameter_range=0x00013ccd ---define_symbol gap_periodic_adv_create_sync=0x00013d65 ---define_symbol gap_periodic_adv_create_sync_cancel=0x00013d89 ---define_symbol gap_periodic_adv_term_sync=0x00013d99 ---define_symbol gap_read_periodic_adv_list_size=0x00013ea5 ---define_symbol gap_read_phy=0x00013eb5 ---define_symbol gap_remove_whitelist=0x00013ec9 ---define_symbol gap_rmv_adv_set=0x00013f55 ---define_symbol gap_rmv_dev_from_periodic_list=0x00013f69 ---define_symbol gap_set_adv_set_random_addr=0x00013fa9 ---define_symbol gap_set_connection_parameter_range=0x00013ff5 ---define_symbol gap_set_def_phy=0x0001400d ---define_symbol gap_set_ext_adv_data=0x00014025 ---define_symbol gap_set_ext_adv_enable=0x0001403d ---define_symbol gap_set_ext_adv_para=0x000140b9 ---define_symbol gap_set_ext_scan_enable=0x00014185 ---define_symbol gap_set_ext_scan_para=0x0001419d ---define_symbol gap_set_ext_scan_response_data=0x00014245 ---define_symbol gap_set_host_channel_classification=0x0001425d ---define_symbol gap_set_periodic_adv_data=0x00014271 ---define_symbol gap_set_periodic_adv_enable=0x000142e5 ---define_symbol gap_set_periodic_adv_para=0x000142f9 ---define_symbol gap_set_phy=0x00014311 ---define_symbol gap_set_random_device_address=0x0001432d ---define_symbol gap_start_ccm=0x00014391 ---define_symbol gap_update_connection_parameters=0x000143c5 ---define_symbol gatt_client_cancel_write=0x0001487d ---define_symbol gatt_client_deserialize_characteristic=0x000148a3 ---define_symbol gatt_client_deserialize_characteristic_descriptor=0x000148db ---define_symbol gatt_client_deserialize_service=0x000148e9 ---define_symbol gatt_client_discover_characteristic_descriptors=0x00014915 ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00014957 ---define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x000149a7 ---define_symbol gatt_client_discover_characteristics_for_service=0x000149f7 ---define_symbol gatt_client_discover_characteristics_for_service_by_uuid128=0x00014a2f ---define_symbol gatt_client_discover_characteristics_for_service_by_uuid16=0x00014a3d ---define_symbol gatt_client_discover_primary_services=0x00014a4b ---define_symbol gatt_client_discover_primary_services_by_uuid128=0x00014a7d ---define_symbol gatt_client_discover_primary_services_by_uuid16=0x00014ac1 ---define_symbol gatt_client_execute_write=0x00014afd ---define_symbol gatt_client_find_included_services_for_service=0x00014b23 ---define_symbol gatt_client_get_mtu=0x00014b53 ---define_symbol gatt_client_is_ready=0x00014bfd ---define_symbol gatt_client_listen_for_characteristic_value_updates=0x00014c13 ---define_symbol gatt_client_prepare_write=0x00014c39 ---define_symbol gatt_client_pts_suppress_mtu_exchange=0x00014c75 ---define_symbol gatt_client_read_characteristic_descriptor=0x00014c81 ---define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00014c87 ---define_symbol gatt_client_read_long_characteristic_descriptor=0x00014cb1 ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00014cb9 ---define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00014cbf ---define_symbol gatt_client_read_long_value_of_characteristic=0x00014ced ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x00014cf5 ---define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00014cfb ---define_symbol gatt_client_read_multiple_characteristic_values=0x00014d29 ---define_symbol gatt_client_read_value_of_characteristic=0x00014d59 ---define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x00014d5f ---define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x00014d8d ---define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00014dd9 ---define_symbol gatt_client_register_handler=0x00014e25 ---define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x00014e31 ---define_symbol gatt_client_signed_write_without_response=0x0001525d ---define_symbol gatt_client_write_characteristic_descriptor=0x00015321 ---define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0001532f ---define_symbol gatt_client_write_client_characteristic_configuration=0x00015369 ---define_symbol gatt_client_write_long_characteristic_descriptor=0x000153bb ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000153cd ---define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000153dd ---define_symbol gatt_client_write_long_value_of_characteristic=0x00015419 ---define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00015429 ---define_symbol gatt_client_write_value_of_characteristic=0x00015465 ---define_symbol gatt_client_write_value_of_characteristic_without_response=0x0001549b ---define_symbol hci_add_event_handler=0x00018f9d ---define_symbol hci_power_control=0x000197d9 ---define_symbol hci_register_acl_packet_handler=0x000199d9 ---define_symbol k_delayed_work_add_arg=0x0001ae4d ---define_symbol k_delayed_work_cancel=0x0001ae51 ---define_symbol k_delayed_work_init=0x0001ae67 ---define_symbol k_delayed_work_remaining_get=0x0001ae81 ---define_symbol k_delayed_work_submit=0x0001aea7 ---define_symbol k_fifo_is_empty=0x0001aec3 ---define_symbol k_sleep=0x0001aeeb ---define_symbol k_uptime_get=0x0001aef9 ---define_symbol k_uptime_get_32=0x0001af0d ---define_symbol k_work_add_arg=0x0001af1f ---define_symbol k_work_init=0x0001af23 ---define_symbol k_work_submit=0x0001af3d ---define_symbol kv_commit=0x0001b1dd ---define_symbol kv_get=0x0001b239 ---define_symbol kv_init=0x0001b251 ---define_symbol kv_put=0x0001b2a1 ---define_symbol kv_remove=0x0001b319 ---define_symbol kv_remove_all=0x0001b355 ---define_symbol kv_value_append=0x0001b419 ---define_symbol kv_value_modified=0x0001b47d ---define_symbol kv_value_trunc=0x0001b481 ---define_symbol kv_visit=0x0001b4d1 ---define_symbol l2cap_can_send_fixed_channel_packet_now=0x0001b545 ---define_symbol l2cap_init=0x0001b89d ---define_symbol l2cap_max_le_mtu=0x0001b8e1 ---define_symbol l2cap_register_fixed_channel=0x0001b965 ---define_symbol l2cap_request_can_send_fix_channel_now_event=0x0001b981 ---define_symbol l2cap_send_connectionless=0x0001bb29 ---define_symbol l2cap_send_connectionless3=0x0001bbb9 ---define_symbol l2cap_send_signaling_le=0x0001bca5 ---define_symbol le_adv_status_reset=0x0001bce1 ---define_symbol mesh_platform_config=0x0002a639 ---define_symbol mesh_set_dev_name=0x0002a8c9 ---define_symbol mesh_setup=0x0002a8d5 ---define_symbol net_buf_add_zeros=0x0002d945 ---define_symbol net_buf_get=0x0002d973 ---define_symbol net_buf_put=0x0002d983 ---define_symbol net_buf_ref=0x0002d9a1 ---define_symbol net_buf_reserve=0x0002d9b1 ---define_symbol net_buf_simple_add=0x0002d9c3 ---define_symbol net_buf_simple_add_be16=0x0002d9c7 ---define_symbol net_buf_simple_add_be32=0x0002d9dd ---define_symbol net_buf_simple_add_le16=0x0002d9ef ---define_symbol net_buf_simple_add_le32=0x0002d9fb ---define_symbol net_buf_simple_add_u8=0x0002da07 ---define_symbol net_buf_simple_pull=0x0002da63 ---define_symbol net_buf_simple_pull_be16=0x0002da6f ---define_symbol net_buf_simple_pull_be32=0x0002da97 ---define_symbol net_buf_simple_pull_le16=0x0002dabf ---define_symbol net_buf_simple_pull_le32=0x0002dae7 ---define_symbol net_buf_simple_pull_u8=0x0002db0f ---define_symbol net_buf_simple_push=0x0002db2f ---define_symbol net_buf_simple_push_be16=0x0002db53 ---define_symbol net_buf_simple_push_le16=0x0002db87 ---define_symbol net_buf_simple_push_u8=0x0002dbbb ---define_symbol net_buf_slist_get=0x0002dc25 ---define_symbol net_buf_slist_init=0x0002dc4d ---define_symbol net_buf_slist_is_empty=0x0002dc55 ---define_symbol net_buf_slist_merge_slist=0x0002dc61 ---define_symbol net_buf_slist_peek_head=0x0002dc7d ---define_symbol net_buf_slist_peek_next=0x0002dc87 ---define_symbol net_buf_slist_put=0x0002dc91 ---define_symbol net_buf_slist_remove=0x0002dca1 ---define_symbol net_buf_unref=0x0002dcdb ---define_symbol nibble_for_char=0x0002ed75 ---define_symbol npl_freertos_callout_init=0x0002f405 ---define_symbol npl_freertos_callout_remaining_ticks=0x0002f441 ---define_symbol npl_freertos_callout_reset=0x0002f459 ---define_symbol npl_freertos_eventq_get=0x0002f4f5 ---define_symbol npl_freertos_eventq_put=0x0002f549 ---define_symbol npl_freertos_sem_init=0x0002f5a1 ---define_symbol npl_freertos_sem_pend=0x0002f5bd ---define_symbol npl_freertos_sem_release=0x0002f611 ---define_symbol npl_freertos_time_ms_to_ticks=0x0002f661 ---define_symbol os_mbuf_adj=0x0002f78f ---define_symbol os_mbuf_append=0x0002f827 ---define_symbol os_mbuf_appendfrom=0x0002f8bf ---define_symbol os_mbuf_cmpf=0x0002f915 ---define_symbol os_mbuf_cmpm=0x0002f975 ---define_symbol os_mbuf_concat=0x0002fa33 ---define_symbol os_mbuf_copydata=0x0002fa6f ---define_symbol os_mbuf_copyinto=0x0002fac7 ---define_symbol os_mbuf_dup=0x0002fb45 ---define_symbol os_mbuf_extend=0x0002fbb5 ---define_symbol os_mbuf_free=0x0002fc05 ---define_symbol os_mbuf_free_chain=0x0002fc1d ---define_symbol os_mbuf_get=0x0002fc33 ---define_symbol os_mbuf_get_pkthdr=0x0002fc5f ---define_symbol os_mbuf_off=0x0002fc8f ---define_symbol os_mbuf_pool_init=0x0002fcad ---define_symbol os_mbuf_prepend=0x0002fcb7 ---define_symbol os_mbuf_prepend_pullup=0x0002fd39 ---define_symbol os_mbuf_pullup=0x0002fd51 ---define_symbol os_mbuf_trim_front=0x0002fe1d ---define_symbol os_mqueue_get=0x0002ff3d ---define_symbol os_mqueue_init=0x0002ff63 ---define_symbol os_mqueue_put=0x0002ff75 ---define_symbol os_msys_count=0x0002ffad ---define_symbol os_msys_get=0x0002ffc9 ---define_symbol os_msys_get_pkthdr=0x0002ffe1 ---define_symbol os_msys_num_free=0x00030041 ---define_symbol os_msys_register=0x0003005d ---define_symbol os_msys_reset=0x00030099 ---define_symbol platform_config=0x0003038d ---define_symbol platform_get_version=0x000303b9 ---define_symbol platform_printf=0x000303c1 ---define_symbol platform_raise_assertion=0x000303d5 ---define_symbol platform_set_evt_callback=0x00030465 ---define_symbol platform_set_irq_callback=0x00030479 ---define_symbol platform_set_rf_clk_source=0x000304bd ---define_symbol platform_set_rf_init_data=0x000304c9 ---define_symbol platform_set_rf_power_mapping=0x000304d5 ---define_symbol platform_shutdown=0x000304e1 ---define_symbol printf_hexdump=0x0003149d ---define_symbol pvPortMalloc=0x00034611 ---define_symbol pvTaskIncrementMutexHeldCount=0x000346f5 ---define_symbol pvTimerGetTimerID=0x0003470d ---define_symbol pxPortInitialiseStack=0x00034739 ---define_symbol reverse_128=0x00034ead ---define_symbol reverse_24=0x00034eb3 ---define_symbol reverse_48=0x00034eb9 ---define_symbol reverse_56=0x00034ebf ---define_symbol reverse_64=0x00034ec5 ---define_symbol reverse_bd_addr=0x00034ecb ---define_symbol reverse_bytes=0x00034ed1 ---define_symbol settings_bytes_from_str=0x000374bd ---define_symbol settings_str_from_bytes=0x000374cf ---define_symbol sm_add_event_handler=0x00037665 ---define_symbol sm_address_resolution_lookup=0x000377b1 ---define_symbol sm_authenticated=0x0003788b ---define_symbol sm_authorization_decline=0x000378a1 ---define_symbol sm_authorization_grant=0x000378c1 ---define_symbol sm_authorization_state=0x000378e1 ---define_symbol sm_bonding_decline=0x000378fd ---define_symbol sm_config=0x00037df5 ---define_symbol sm_encryption_key_size=0x00037ef5 ---define_symbol sm_just_works_confirm=0x00038861 ---define_symbol sm_le_device_key=0x00038b91 ---define_symbol sm_passkey_input=0x00038c81 ---define_symbol sm_private_random_address_generation_get=0x00039051 ---define_symbol sm_private_random_address_generation_get_mode=0x00039059 ---define_symbol sm_private_random_address_generation_set_mode=0x00039065 ---define_symbol sm_private_random_address_generation_set_update_period=0x0003908d ---define_symbol sm_register_oob_data_callback=0x000390c5 ---define_symbol sm_request_pairing=0x000390d1 ---define_symbol sm_send_security_request=0x00039c5d ---define_symbol sm_set_accepted_stk_generation_methods=0x00039c85 ---define_symbol sm_set_authentication_requirements=0x00039c91 ---define_symbol sm_set_encryption_key_size_range=0x00039c9d ---define_symbol sscanf_bd_addr=0x0003a04d ---define_symbol sysSetPublicDeviceAddr=0x0003b429 ---define_symbol uuid128_to_str=0x0003d609 ---define_symbol uuid_add_bluetooth_prefix=0x0003d661 ---define_symbol uuid_has_bluetooth_prefix=0x0003d681 ---define_symbol vPortFree=0x0003d7c9 ---define_symbol vQueueWaitForMessageRestricted=0x0003d999 ---define_symbol vTaskDelay=0x0003d9e1 ---define_symbol vTaskInternalSetTimeOutState=0x0003da2d ---define_symbol vTaskMissedYield=0x0003da3d ---define_symbol vTaskPlaceOnEventList=0x0003da49 ---define_symbol vTaskPlaceOnEventListRestricted=0x0003da81 ---define_symbol vTaskPriorityDisinheritAfterTimeout=0x0003dac1 ---define_symbol vTaskStartScheduler=0x0003db6d ---define_symbol vTaskStepTick=0x0003dbf9 ---define_symbol vTaskSuspendAll=0x0003dc29 ---define_symbol vTaskSwitchContext=0x0003dc39 ---define_symbol xPortStartScheduler=0x0003e0bd ---define_symbol xQueueCreateCountingSemaphore=0x0003e179 ---define_symbol xQueueGenericCreate=0x0003e1b5 ---define_symbol xQueueGenericCreateStatic=0x0003e201 ---define_symbol xQueueGenericReset=0x0003e269 ---define_symbol xQueueGenericSend=0x0003e2f5 ---define_symbol xQueueGenericSendFromISR=0x0003e45d ---define_symbol xQueueGiveFromISR=0x0003e51d ---define_symbol xQueueIsQueueEmptyFromISR=0x0003e5c1 ---define_symbol xQueueReceive=0x0003e5e5 ---define_symbol xQueueReceiveFromISR=0x0003e711 ---define_symbol xQueueSemaphoreTake=0x0003e7a5 ---define_symbol xTaskCheckForTimeOut=0x0003e90d ---define_symbol xTaskCreate=0x0003e97d ---define_symbol xTaskCreateStatic=0x0003e9d9 ---define_symbol xTaskGetSchedulerState=0x0003ea49 ---define_symbol xTaskGetTickCount=0x0003ea65 ---define_symbol xTaskGetTickCountFromISR=0x0003ea71 ---define_symbol xTaskIncrementTick=0x0003ea81 ---define_symbol xTaskPriorityDisinherit=0x0003eb4d ---define_symbol xTaskPriorityInherit=0x0003ebe1 ---define_symbol xTaskRemoveFromEventList=0x0003ec75 ---define_symbol xTaskResumeAll=0x0003ecf5 ---define_symbol xTimerCreate=0x0003edbd ---define_symbol xTimerCreateTimerTask=0x0003edf1 ---define_symbol xTimerGenericCommand=0x0003ee5d ---define_symbol xTimerGetExpiryTime=0x0003eecd +--define_symbol att_dispatch_client_can_send_now=0x00006329 +--define_symbol att_dispatch_client_request_can_send_now_event=0x0000632f +--define_symbol att_dispatch_register_client=0x00006335 +--define_symbol att_dispatch_register_server=0x00006349 +--define_symbol att_dispatch_server_can_send_now=0x0000635d +--define_symbol att_dispatch_server_request_can_send_now_event=0x00006363 +--define_symbol att_emit_general_event=0x00006421 +--define_symbol att_server_can_send_packet_now=0x00006b59 +--define_symbol att_server_get_mtu=0x00006b5d +--define_symbol att_server_indicate=0x00006bd1 +--define_symbol att_server_init=0x00006c55 +--define_symbol att_server_notify=0x00006c91 +--define_symbol att_server_register_packet_handler=0x00006d79 +--define_symbol att_server_request_can_send_now_event=0x00006d85 +--define_symbol att_set_db=0x00006da1 +--define_symbol att_set_read_callback=0x00006db5 +--define_symbol att_set_write_callback=0x00006dc1 +--define_symbol bd_addr_cmp=0x00006f05 +--define_symbol bd_addr_copy=0x00006f0b +--define_symbol bd_addr_to_str=0x00006f15 +--define_symbol big_endian_read_16=0x00006f4d +--define_symbol big_endian_read_32=0x00006f55 +--define_symbol big_endian_store_16=0x00006f69 +--define_symbol big_endian_store_32=0x00006f75 +--define_symbol btstack_push_user_msg=0x000072f9 +--define_symbol char_for_nibble=0x00007565 +--define_symbol eTaskConfirmSleepModeStatus=0x000077f5 +--define_symbol gap_add_dev_to_periodic_list=0x00008101 +--define_symbol gap_add_whitelist=0x00008119 +--define_symbol gap_aes_encrypt=0x0000812d +--define_symbol gap_clear_white_lists=0x00008155 +--define_symbol gap_clr_adv_set=0x00008165 +--define_symbol gap_clr_periodic_adv_list=0x00008175 +--define_symbol gap_create_connection_cancel=0x000081a1 +--define_symbol gap_default_periodic_adv_sync_transfer_param=0x000081b1 +--define_symbol gap_disconnect=0x000081c9 +--define_symbol gap_disconnect_all=0x000081f5 +--define_symbol gap_ext_create_connection=0x0000829d +--define_symbol gap_get_connection_parameter_range=0x00008361 +--define_symbol gap_le_read_channel_map=0x0000839d +--define_symbol gap_periodic_adv_create_sync=0x00008411 +--define_symbol gap_periodic_adv_create_sync_cancel=0x00008435 +--define_symbol gap_periodic_adv_set_info_transfer=0x00008445 +--define_symbol gap_periodic_adv_sync_transfer=0x0000845d +--define_symbol gap_periodic_adv_sync_transfer_param=0x00008475 +--define_symbol gap_periodic_adv_term_sync=0x00008491 +--define_symbol gap_read_antenna_info=0x00008525 +--define_symbol gap_read_periodic_adv_list_size=0x00008535 +--define_symbol gap_read_phy=0x00008545 +--define_symbol gap_read_remote_info=0x00008559 +--define_symbol gap_read_remote_used_features=0x0000856d +--define_symbol gap_read_rssi=0x00008581 +--define_symbol gap_remove_whitelist=0x00008595 +--define_symbol gap_rmv_adv_set=0x00008621 +--define_symbol gap_rmv_dev_from_periodic_list=0x00008635 +--define_symbol gap_set_adv_set_random_addr=0x00008675 +--define_symbol gap_set_connection_cte_request_enable=0x000086c1 +--define_symbol gap_set_connection_cte_response_enable=0x000086dd +--define_symbol gap_set_connection_cte_rx_param=0x000086f1 +--define_symbol gap_set_connection_cte_tx_param=0x0000874d +--define_symbol gap_set_connection_parameter_range=0x000087a1 +--define_symbol gap_set_connectionless_cte_tx_enable=0x000087b9 +--define_symbol gap_set_connectionless_cte_tx_param=0x000087cd +--define_symbol gap_set_connectionless_iq_sampling_enable=0x00008831 +--define_symbol gap_set_def_phy=0x00008895 +--define_symbol gap_set_ext_adv_data=0x000088ad +--define_symbol gap_set_ext_adv_enable=0x000088c5 +--define_symbol gap_set_ext_adv_para=0x00008941 +--define_symbol gap_set_ext_scan_enable=0x00008a21 +--define_symbol gap_set_ext_scan_para=0x00008a39 +--define_symbol gap_set_ext_scan_response_data=0x00008ae1 +--define_symbol gap_set_host_channel_classification=0x00008af9 +--define_symbol gap_set_periodic_adv_data=0x00008b0d +--define_symbol gap_set_periodic_adv_enable=0x00008b81 +--define_symbol gap_set_periodic_adv_para=0x00008b95 +--define_symbol gap_set_periodic_adv_rx_enable=0x00008bad +--define_symbol gap_set_phy=0x00008bc1 +--define_symbol gap_set_random_device_address=0x00008bdd +--define_symbol gap_start_ccm=0x00008c41 +--define_symbol gap_update_connection_parameters=0x00008c75 +--define_symbol gatt_client_cancel_write=0x0000915d +--define_symbol gatt_client_discover_characteristic_descriptors=0x00009183 +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000091c5 +--define_symbol gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00009215 +--define_symbol gatt_client_discover_characteristics_for_service=0x00009265 +--define_symbol gatt_client_discover_primary_services=0x0000929b +--define_symbol gatt_client_discover_primary_services_by_uuid128=0x000092cd +--define_symbol gatt_client_discover_primary_services_by_uuid16=0x00009311 +--define_symbol gatt_client_execute_write=0x0000934d +--define_symbol gatt_client_find_included_services_for_service=0x00009373 +--define_symbol gatt_client_get_mtu=0x000093a1 +--define_symbol gatt_client_is_ready=0x00009449 +--define_symbol gatt_client_listen_for_characteristic_value_updates=0x0000945f +--define_symbol gatt_client_prepare_write=0x00009483 +--define_symbol gatt_client_pts_suppress_mtu_exchange=0x000094c1 +--define_symbol gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x000094cd +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x000094f7 +--define_symbol gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000094fd +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle=0x0000952b +--define_symbol gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00009531 +--define_symbol gatt_client_read_multiple_characteristic_values=0x0000955f +--define_symbol gatt_client_read_value_of_characteristic_using_value_handle=0x0000958f +--define_symbol gatt_client_read_value_of_characteristics_by_uuid128=0x000095bd +--define_symbol gatt_client_read_value_of_characteristics_by_uuid16=0x00009609 +--define_symbol gatt_client_register_handler=0x00009655 +--define_symbol gatt_client_reliable_write_long_value_of_characteristic=0x00009661 +--define_symbol gatt_client_signed_write_without_response=0x00009a8d +--define_symbol gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009b51 +--define_symbol gatt_client_write_client_characteristic_configuration=0x00009b8b +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009bdd +--define_symbol gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009bed +--define_symbol gatt_client_write_long_value_of_characteristic=0x00009c29 +--define_symbol gatt_client_write_long_value_of_characteristic_with_offset=0x00009c39 +--define_symbol gatt_client_write_value_of_characteristic=0x00009c75 +--define_symbol gatt_client_write_value_of_characteristic_without_response=0x00009cab +--define_symbol hci_add_event_handler=0x0000b235 +--define_symbol hci_power_control=0x0000b97d +--define_symbol hci_register_acl_packet_handler=0x0000bb31 +--define_symbol kv_commit=0x0000c199 +--define_symbol kv_get=0x0000c1d1 +--define_symbol kv_init=0x0000c1e9 +--define_symbol kv_put=0x0000c239 +--define_symbol kv_remove=0x0000c2b1 +--define_symbol kv_remove_all=0x0000c2ed +--define_symbol kv_value_modified=0x0000c331 +--define_symbol kv_visit=0x0000c335 +--define_symbol l2cap_can_send_fixed_channel_packet_now=0x0000c3f5 +--define_symbol l2cap_can_send_packet_now=0x0000c3f9 +--define_symbol l2cap_create_channel=0x0000c5b1 +--define_symbol l2cap_disconnect=0x0000c6e9 +--define_symbol l2cap_get_remote_mtu_for_local_cid=0x0000c98d +--define_symbol l2cap_init=0x0000ce0d +--define_symbol l2cap_le_send_flow_control_credit=0x0000ce55 +--define_symbol l2cap_max_le_mtu=0x0000d0b9 +--define_symbol l2cap_max_mtu=0x0000d0bd +--define_symbol l2cap_next_local_cid=0x0000d0c1 +--define_symbol l2cap_next_sig_id=0x0000d0d1 +--define_symbol l2cap_register_fixed_channel=0x0000d169 +--define_symbol l2cap_register_packet_handler=0x0000d185 +--define_symbol l2cap_register_service=0x0000d191 +--define_symbol l2cap_request_can_send_fix_channel_now_event=0x0000d279 +--define_symbol l2cap_request_can_send_now_event=0x0000d29d +--define_symbol l2cap_request_connection_parameter_update=0x0000d2b7 +--define_symbol l2cap_require_security_level_2_for_outgoing_sdp=0x0000d2e9 +--define_symbol l2cap_send=0x0000d6ad +--define_symbol l2cap_send_connectionless=0x0000d725 +--define_symbol l2cap_send_connectionless3=0x0000d7b5 +--define_symbol l2cap_send_echo_request=0x0000d84d +--define_symbol l2cap_send_signaling_le=0x0000d8b1 +--define_symbol l2cap_unregister_service=0x0000d909 +--define_symbol ll_hint_on_ce_len=0x0000daed +--define_symbol ll_set_adv_coded_scheme=0x0000ddd1 +--define_symbol ll_set_def_antenna=0x0000de01 +--define_symbol ll_set_initiating_coded_scheme=0x0000de1d +--define_symbol nibble_for_char=0x0001dbfd +--define_symbol platform_config=0x0001dca1 +--define_symbol platform_get_heap_status=0x0001dd01 +--define_symbol platform_get_version=0x0001dd19 +--define_symbol platform_hrng=0x0001dd21 +--define_symbol platform_patch_rf_init_data=0x0001dd29 +--define_symbol platform_printf=0x0001dd45 +--define_symbol platform_raise_assertion=0x0001dd59 +--define_symbol platform_read_persistent_reg=0x0001dd6d +--define_symbol platform_reset=0x0001dd7d +--define_symbol platform_set_evt_callback=0x0001ddb1 +--define_symbol platform_set_irq_callback=0x0001ddc5 +--define_symbol platform_set_rf_clk_source=0x0001ddfd +--define_symbol platform_set_rf_init_data=0x0001de09 +--define_symbol platform_set_rf_power_mapping=0x0001de15 +--define_symbol platform_shutdown=0x0001de21 +--define_symbol platform_switch_app=0x0001de25 +--define_symbol platform_write_persistent_reg=0x0001de49 +--define_symbol printf_hexdump=0x0001de59 +--define_symbol pvPortMalloc=0x0001e955 +--define_symbol pvTaskIncrementMutexHeldCount=0x0001ea3d +--define_symbol pvTimerGetTimerID=0x0001ea55 +--define_symbol pxPortInitialiseStack=0x0001ea81 +--define_symbol reverse_128=0x0001ec41 +--define_symbol reverse_24=0x0001ec47 +--define_symbol reverse_48=0x0001ec4d +--define_symbol reverse_56=0x0001ec53 +--define_symbol reverse_64=0x0001ec59 +--define_symbol reverse_bd_addr=0x0001ec5f +--define_symbol reverse_bytes=0x0001ec65 +--define_symbol sm_add_event_handler=0x0001ee09 +--define_symbol sm_address_resolution_lookup=0x0001ef35 +--define_symbol sm_authenticated=0x0001f00f +--define_symbol sm_authorization_decline=0x0001f01d +--define_symbol sm_authorization_grant=0x0001f03d +--define_symbol sm_authorization_state=0x0001f05d +--define_symbol sm_bonding_decline=0x0001f079 +--define_symbol sm_config=0x0001f451 +--define_symbol sm_encryption_key_size=0x0001f55d +--define_symbol sm_just_works_confirm=0x0001fd2d +--define_symbol sm_le_device_key=0x0001ff7d +--define_symbol sm_passkey_input=0x00020015 +--define_symbol sm_private_random_address_generation_get=0x000203a1 +--define_symbol sm_private_random_address_generation_get_mode=0x000203a9 +--define_symbol sm_private_random_address_generation_set_mode=0x000203b5 +--define_symbol sm_private_random_address_generation_set_update_period=0x000203dd +--define_symbol sm_register_oob_data_callback=0x00020415 +--define_symbol sm_request_pairing=0x00020421 +--define_symbol sm_send_security_request=0x00020e5b +--define_symbol sm_set_accepted_stk_generation_methods=0x00020e81 +--define_symbol sm_set_authentication_requirements=0x00020e8d +--define_symbol sm_set_encryption_key_size_range=0x00020e99 +--define_symbol sscanf_bd_addr=0x0002116d +--define_symbol sysSetPublicDeviceAddr=0x000214c1 +--define_symbol uuid128_to_str=0x00021a91 +--define_symbol uuid_add_bluetooth_prefix=0x00021ae9 +--define_symbol uuid_has_bluetooth_prefix=0x00021b09 +--define_symbol uxQueueMessagesWaiting=0x00021b4d +--define_symbol uxQueueMessagesWaitingFromISR=0x00021b75 +--define_symbol uxQueueSpacesAvailable=0x00021b91 +--define_symbol vPortFree=0x00021cc1 +--define_symbol vQueueDelete=0x00021e81 +--define_symbol vQueueWaitForMessageRestricted=0x00021ead +--define_symbol vTaskDelay=0x00021ef5 +--define_symbol vTaskInternalSetTimeOutState=0x00021f41 +--define_symbol vTaskMissedYield=0x00021f51 +--define_symbol vTaskPlaceOnEventList=0x00021f5d +--define_symbol vTaskPlaceOnEventListRestricted=0x00021f95 +--define_symbol vTaskPriorityDisinheritAfterTimeout=0x00021fd5 +--define_symbol vTaskStartScheduler=0x00022081 +--define_symbol vTaskStepTick=0x00022111 +--define_symbol vTaskSuspendAll=0x00022141 +--define_symbol vTaskSwitchContext=0x00022151 +--define_symbol xPortStartScheduler=0x000221f9 +--define_symbol xQueueAddToSet=0x000222b5 +--define_symbol xQueueCreateCountingSemaphore=0x000222d9 +--define_symbol xQueueCreateCountingSemaphoreStatic=0x00022315 +--define_symbol xQueueCreateMutex=0x00022359 +--define_symbol xQueueCreateMutexStatic=0x0002236f +--define_symbol xQueueCreateSet=0x00022389 +--define_symbol xQueueGenericCreate=0x00022391 +--define_symbol xQueueGenericCreateStatic=0x000223dd +--define_symbol xQueueGenericReset=0x00022445 +--define_symbol xQueueGenericSend=0x000224d1 +--define_symbol xQueueGenericSendFromISR=0x0002263d +--define_symbol xQueueGiveFromISR=0x000226fd +--define_symbol xQueueGiveMutexRecursive=0x000227a1 +--define_symbol xQueueIsQueueEmptyFromISR=0x000227e1 +--define_symbol xQueueIsQueueFullFromISR=0x00022805 +--define_symbol xQueuePeek=0x0002282d +--define_symbol xQueuePeekFromISR=0x00022955 +--define_symbol xQueueReceive=0x000229c1 +--define_symbol xQueueReceiveFromISR=0x00022aed +--define_symbol xQueueRemoveFromSet=0x00022b81 +--define_symbol xQueueSelectFromSet=0x00022ba3 +--define_symbol xQueueSelectFromSetFromISR=0x00022bb5 +--define_symbol xQueueSemaphoreTake=0x00022bc9 +--define_symbol xQueueTakeMutexRecursive=0x00022d35 +--define_symbol xTaskCheckForTimeOut=0x00022d79 +--define_symbol xTaskCreate=0x00022de9 +--define_symbol xTaskCreateStatic=0x00022e45 +--define_symbol xTaskGetCurrentTaskHandle=0x00022eb5 +--define_symbol xTaskGetSchedulerState=0x00022ec1 +--define_symbol xTaskGetTickCount=0x00022edd +--define_symbol xTaskIncrementTick=0x00022ee9 +--define_symbol xTaskPriorityDisinherit=0x00022fb5 +--define_symbol xTaskPriorityInherit=0x00023049 +--define_symbol xTaskRemoveFromEventList=0x000230dd +--define_symbol xTaskResumeAll=0x0002315d +--define_symbol xTimerCreate=0x00023225 +--define_symbol xTimerCreateStatic=0x00023259 +--define_symbol xTimerCreateTimerTask=0x00023291 +--define_symbol xTimerGenericCommand=0x000232fd diff --git a/bundles/mesh/ING9188xx/symdefs.m b/bundles/mesh/ING9188xx/symdefs.m index a4043192c..9edefd1d5 100644 --- a/bundles/mesh/ING9188xx/symdefs.m +++ b/bundles/mesh/ING9188xx/symdefs.m @@ -1,327 +1,268 @@ ## ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 -0x00004ff1 T PB_ADV_config -0x00006ee1 T att_dispatch_client_can_send_now -0x00006ee9 T att_dispatch_client_request_can_send_now_event -0x00006f01 T att_dispatch_register_client -0x00006f15 T att_dispatch_register_server -0x00006f29 T att_dispatch_server_can_send_now -0x00006f31 T att_dispatch_server_request_can_send_now_event -0x00006f49 T att_emit_general_event -0x00007745 T att_server_can_send_packet_now -0x00007749 T att_server_get_mtu -0x000077b9 T att_server_indicate -0x0000783d T att_server_init -0x00007879 T att_server_notify -0x00007961 T att_server_register_packet_handler -0x0000796d T att_server_request_can_send_now_event -0x00007989 T att_set_db -0x0000799d T att_set_read_callback -0x000079a9 T att_set_write_callback -0x00007d89 T bd_addr_cmp -0x00007d8f T bd_addr_copy -0x00007d99 T bd_addr_to_str -0x00008331 T big_endian_read_16 -0x00008339 T big_endian_read_32 -0x0000834d T big_endian_store_16 -0x00008359 T big_endian_store_32 -0x00008a99 T ble_gatts_find_chr -0x00008b31 T ble_gatts_find_svc -0x00008e81 T bt_dh_key_gen -0x00008ea9 T bt_encrypt_be -0x00008ed1 T bt_hex -0x00008f31 T bt_le_adv_start -0x00009059 T bt_le_adv_stop -0x0000b7bd T bt_mesh_init -0x0000b81d T bt_mesh_input_number -0x0000b891 T bt_mesh_input_string -0x0000b90d T bt_mesh_is_provisioned -0x0000bdcd T bt_mesh_model_elem -0x0000bfa1 T bt_mesh_model_msg_init -0x0000c039 T bt_mesh_model_publish -0x0000c47d T bt_mesh_model_send -0x0000e625 T bt_mesh_prov_disable -0x0000e65d T bt_mesh_prov_enable -0x0000e819 T bt_mesh_provision -0x0000efdd T bt_mesh_reset -0x0000fa71 T bt_pub_key_gen -0x0000faa1 T bt_pub_key_get -0x0000fab5 T bt_rand -0x0000fd31 T btstack_push_user_msg -0x000102db T char_for_nibble -0x00011779 T eTaskConfirmSleepModeStatus -0x00013ad5 T gap_add_dev_to_periodic_list -0x00013aed T gap_add_whitelist -0x00013b01 T gap_aes_encrypt -0x00013b29 T gap_clr_adv_set -0x00013b39 T gap_clr_periodic_adv_list -0x00013b65 T gap_create_connection_cancel -0x00013b75 T gap_disconnect -0x00013c09 T gap_ext_create_connection -0x00013ccd T gap_get_connection_parameter_range -0x00013d65 T gap_periodic_adv_create_sync -0x00013d89 T gap_periodic_adv_create_sync_cancel -0x00013d99 T gap_periodic_adv_term_sync -0x00013ea5 T gap_read_periodic_adv_list_size -0x00013eb5 T gap_read_phy -0x00013ec9 T gap_remove_whitelist -0x00013f55 T gap_rmv_adv_set -0x00013f69 T gap_rmv_dev_from_periodic_list -0x00013fa9 T gap_set_adv_set_random_addr -0x00013ff5 T gap_set_connection_parameter_range -0x0001400d T gap_set_def_phy -0x00014025 T gap_set_ext_adv_data -0x0001403d T gap_set_ext_adv_enable -0x000140b9 T gap_set_ext_adv_para -0x00014185 T gap_set_ext_scan_enable -0x0001419d T gap_set_ext_scan_para -0x00014245 T gap_set_ext_scan_response_data -0x0001425d T gap_set_host_channel_classification -0x00014271 T gap_set_periodic_adv_data -0x000142e5 T gap_set_periodic_adv_enable -0x000142f9 T gap_set_periodic_adv_para -0x00014311 T gap_set_phy -0x0001432d T gap_set_random_device_address -0x00014391 T gap_start_ccm -0x000143c5 T gap_update_connection_parameters -0x0001487d T gatt_client_cancel_write -0x000148a3 T gatt_client_deserialize_characteristic -0x000148db T gatt_client_deserialize_characteristic_descriptor -0x000148e9 T gatt_client_deserialize_service -0x00014915 T gatt_client_discover_characteristic_descriptors -0x00014957 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x000149a7 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x000149f7 T gatt_client_discover_characteristics_for_service -0x00014a2f T gatt_client_discover_characteristics_for_service_by_uuid128 -0x00014a3d T gatt_client_discover_characteristics_for_service_by_uuid16 -0x00014a4b T gatt_client_discover_primary_services -0x00014a7d T gatt_client_discover_primary_services_by_uuid128 -0x00014ac1 T gatt_client_discover_primary_services_by_uuid16 -0x00014afd T gatt_client_execute_write -0x00014b23 T gatt_client_find_included_services_for_service -0x00014b53 T gatt_client_get_mtu -0x00014bfd T gatt_client_is_ready -0x00014c13 T gatt_client_listen_for_characteristic_value_updates -0x00014c39 T gatt_client_prepare_write -0x00014c75 T gatt_client_pts_suppress_mtu_exchange -0x00014c81 T gatt_client_read_characteristic_descriptor -0x00014c87 T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x00014cb1 T gatt_client_read_long_characteristic_descriptor -0x00014cb9 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x00014cbf T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00014ced T gatt_client_read_long_value_of_characteristic -0x00014cf5 T gatt_client_read_long_value_of_characteristic_using_value_handle -0x00014cfb T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x00014d29 T gatt_client_read_multiple_characteristic_values -0x00014d59 T gatt_client_read_value_of_characteristic -0x00014d5f T gatt_client_read_value_of_characteristic_using_value_handle -0x00014d8d T gatt_client_read_value_of_characteristics_by_uuid128 -0x00014dd9 T gatt_client_read_value_of_characteristics_by_uuid16 -0x00014e25 T gatt_client_register_handler -0x00014e31 T gatt_client_reliable_write_long_value_of_characteristic -0x0001525d T gatt_client_signed_write_without_response -0x00015321 T gatt_client_write_characteristic_descriptor -0x0001532f T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x00015369 T gatt_client_write_client_characteristic_configuration -0x000153bb T gatt_client_write_long_characteristic_descriptor -0x000153cd T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x000153dd T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00015419 T gatt_client_write_long_value_of_characteristic -0x00015429 T gatt_client_write_long_value_of_characteristic_with_offset -0x00015465 T gatt_client_write_value_of_characteristic -0x0001549b T gatt_client_write_value_of_characteristic_without_response -0x00018f9d T hci_add_event_handler -0x000197d9 T hci_power_control -0x000199d9 T hci_register_acl_packet_handler -0x0001ae4d T k_delayed_work_add_arg -0x0001ae51 T k_delayed_work_cancel -0x0001ae67 T k_delayed_work_init -0x0001ae81 T k_delayed_work_remaining_get -0x0001aea7 T k_delayed_work_submit -0x0001aec3 T k_fifo_is_empty -0x0001aeeb T k_sleep -0x0001aef9 T k_uptime_get -0x0001af0d T k_uptime_get_32 -0x0001af1f T k_work_add_arg -0x0001af23 T k_work_init -0x0001af3d T k_work_submit -0x0001b1dd T kv_commit -0x0001b239 T kv_get -0x0001b251 T kv_init -0x0001b2a1 T kv_put -0x0001b319 T kv_remove -0x0001b355 T kv_remove_all -0x0001b419 T kv_value_append -0x0001b47d T kv_value_modified -0x0001b481 T kv_value_trunc -0x0001b4d1 T kv_visit -0x0001b545 T l2cap_can_send_fixed_channel_packet_now -0x0001b89d T l2cap_init -0x0001b8e1 T l2cap_max_le_mtu -0x0001b965 T l2cap_register_fixed_channel -0x0001b981 T l2cap_request_can_send_fix_channel_now_event -0x0001bb29 T l2cap_send_connectionless -0x0001bbb9 T l2cap_send_connectionless3 -0x0001bca5 T l2cap_send_signaling_le -0x0001bce1 T le_adv_status_reset -0x0002a639 T mesh_platform_config -0x0002a8c9 T mesh_set_dev_name -0x0002a8d5 T mesh_setup -0x0002d945 T net_buf_add_zeros -0x0002d973 T net_buf_get -0x0002d983 T net_buf_put -0x0002d9a1 T net_buf_ref -0x0002d9b1 T net_buf_reserve -0x0002d9c3 T net_buf_simple_add -0x0002d9c7 T net_buf_simple_add_be16 -0x0002d9dd T net_buf_simple_add_be32 -0x0002d9ef T net_buf_simple_add_le16 -0x0002d9fb T net_buf_simple_add_le32 -0x0002da07 T net_buf_simple_add_u8 -0x0002da63 T net_buf_simple_pull -0x0002da6f T net_buf_simple_pull_be16 -0x0002da97 T net_buf_simple_pull_be32 -0x0002dabf T net_buf_simple_pull_le16 -0x0002dae7 T net_buf_simple_pull_le32 -0x0002db0f T net_buf_simple_pull_u8 -0x0002db2f T net_buf_simple_push -0x0002db53 T net_buf_simple_push_be16 -0x0002db87 T net_buf_simple_push_le16 -0x0002dbbb T net_buf_simple_push_u8 -0x0002dc25 T net_buf_slist_get -0x0002dc4d T net_buf_slist_init -0x0002dc55 T net_buf_slist_is_empty -0x0002dc61 T net_buf_slist_merge_slist -0x0002dc7d T net_buf_slist_peek_head -0x0002dc87 T net_buf_slist_peek_next -0x0002dc91 T net_buf_slist_put -0x0002dca1 T net_buf_slist_remove -0x0002dcdb T net_buf_unref -0x0002ed75 T nibble_for_char -0x0002f405 T npl_freertos_callout_init -0x0002f441 T npl_freertos_callout_remaining_ticks -0x0002f459 T npl_freertos_callout_reset -0x0002f4f5 T npl_freertos_eventq_get -0x0002f549 T npl_freertos_eventq_put -0x0002f5a1 T npl_freertos_sem_init -0x0002f5bd T npl_freertos_sem_pend -0x0002f611 T npl_freertos_sem_release -0x0002f661 T npl_freertos_time_ms_to_ticks -0x0002f78f T os_mbuf_adj -0x0002f827 T os_mbuf_append -0x0002f8bf T os_mbuf_appendfrom -0x0002f915 T os_mbuf_cmpf -0x0002f975 T os_mbuf_cmpm -0x0002fa33 T os_mbuf_concat -0x0002fa6f T os_mbuf_copydata -0x0002fac7 T os_mbuf_copyinto -0x0002fb45 T os_mbuf_dup -0x0002fbb5 T os_mbuf_extend -0x0002fc05 T os_mbuf_free -0x0002fc1d T os_mbuf_free_chain -0x0002fc33 T os_mbuf_get -0x0002fc5f T os_mbuf_get_pkthdr -0x0002fc8f T os_mbuf_off -0x0002fcad T os_mbuf_pool_init -0x0002fcb7 T os_mbuf_prepend -0x0002fd39 T os_mbuf_prepend_pullup -0x0002fd51 T os_mbuf_pullup -0x0002fe1d T os_mbuf_trim_front -0x0002ff3d T os_mqueue_get -0x0002ff63 T os_mqueue_init -0x0002ff75 T os_mqueue_put -0x0002ffad T os_msys_count -0x0002ffc9 T os_msys_get -0x0002ffe1 T os_msys_get_pkthdr -0x00030041 T os_msys_num_free -0x0003005d T os_msys_register -0x00030099 T os_msys_reset -0x0003038d T platform_config -0x000303b9 T platform_get_version -0x000303c1 T platform_printf -0x000303d5 T platform_raise_assertion -0x00030465 T platform_set_evt_callback -0x00030479 T platform_set_irq_callback -0x000304bd T platform_set_rf_clk_source -0x000304c9 T platform_set_rf_init_data -0x000304d5 T platform_set_rf_power_mapping -0x000304e1 T platform_shutdown -0x0003149d T printf_hexdump -0x00034611 T pvPortMalloc -0x000346f5 T pvTaskIncrementMutexHeldCount -0x0003470d T pvTimerGetTimerID -0x00034739 T pxPortInitialiseStack -0x00034ead T reverse_128 -0x00034eb3 T reverse_24 -0x00034eb9 T reverse_48 -0x00034ebf T reverse_56 -0x00034ec5 T reverse_64 -0x00034ecb T reverse_bd_addr -0x00034ed1 T reverse_bytes -0x000374bd T settings_bytes_from_str -0x000374cf T settings_str_from_bytes -0x00037665 T sm_add_event_handler -0x000377b1 T sm_address_resolution_lookup -0x0003788b T sm_authenticated -0x000378a1 T sm_authorization_decline -0x000378c1 T sm_authorization_grant -0x000378e1 T sm_authorization_state -0x000378fd T sm_bonding_decline -0x00037df5 T sm_config -0x00037ef5 T sm_encryption_key_size -0x00038861 T sm_just_works_confirm -0x00038b91 T sm_le_device_key -0x00038c81 T sm_passkey_input -0x00039051 T sm_private_random_address_generation_get -0x00039059 T sm_private_random_address_generation_get_mode -0x00039065 T sm_private_random_address_generation_set_mode -0x0003908d T sm_private_random_address_generation_set_update_period -0x000390c5 T sm_register_oob_data_callback -0x000390d1 T sm_request_pairing -0x00039c5d T sm_send_security_request -0x00039c85 T sm_set_accepted_stk_generation_methods -0x00039c91 T sm_set_authentication_requirements -0x00039c9d T sm_set_encryption_key_size_range -0x0003a04d T sscanf_bd_addr -0x0003b429 T sysSetPublicDeviceAddr -0x0003d609 T uuid128_to_str -0x0003d661 T uuid_add_bluetooth_prefix -0x0003d681 T uuid_has_bluetooth_prefix -0x0003d7c9 T vPortFree -0x0003d999 T vQueueWaitForMessageRestricted -0x0003d9e1 T vTaskDelay -0x0003da2d T vTaskInternalSetTimeOutState -0x0003da3d T vTaskMissedYield -0x0003da49 T vTaskPlaceOnEventList -0x0003da81 T vTaskPlaceOnEventListRestricted -0x0003dac1 T vTaskPriorityDisinheritAfterTimeout -0x0003db6d T vTaskStartScheduler -0x0003dbf9 T vTaskStepTick -0x0003dc29 T vTaskSuspendAll -0x0003dc39 T vTaskSwitchContext -0x0003e0bd T xPortStartScheduler -0x0003e179 T xQueueCreateCountingSemaphore -0x0003e1b5 T xQueueGenericCreate -0x0003e201 T xQueueGenericCreateStatic -0x0003e269 T xQueueGenericReset -0x0003e2f5 T xQueueGenericSend -0x0003e45d T xQueueGenericSendFromISR -0x0003e51d T xQueueGiveFromISR -0x0003e5c1 T xQueueIsQueueEmptyFromISR -0x0003e5e5 T xQueueReceive -0x0003e711 T xQueueReceiveFromISR -0x0003e7a5 T xQueueSemaphoreTake -0x0003e90d T xTaskCheckForTimeOut -0x0003e97d T xTaskCreate -0x0003e9d9 T xTaskCreateStatic -0x0003ea49 T xTaskGetSchedulerState -0x0003ea65 T xTaskGetTickCount -0x0003ea71 T xTaskGetTickCountFromISR -0x0003ea81 T xTaskIncrementTick -0x0003eb4d T xTaskPriorityDisinherit -0x0003ebe1 T xTaskPriorityInherit -0x0003ec75 T xTaskRemoveFromEventList -0x0003ecf5 T xTaskResumeAll -0x0003edbd T xTimerCreate -0x0003edf1 T xTimerCreateTimerTask -0x0003ee5d T xTimerGenericCommand -0x0003eecd T xTimerGetExpiryTime +0x00006329 T att_dispatch_client_can_send_now +0x0000632f T att_dispatch_client_request_can_send_now_event +0x00006335 T att_dispatch_register_client +0x00006349 T att_dispatch_register_server +0x0000635d T att_dispatch_server_can_send_now +0x00006363 T att_dispatch_server_request_can_send_now_event +0x00006421 T att_emit_general_event +0x00006b59 T att_server_can_send_packet_now +0x00006b5d T att_server_get_mtu +0x00006bd1 T att_server_indicate +0x00006c55 T att_server_init +0x00006c91 T att_server_notify +0x00006d79 T att_server_register_packet_handler +0x00006d85 T att_server_request_can_send_now_event +0x00006da1 T att_set_db +0x00006db5 T att_set_read_callback +0x00006dc1 T att_set_write_callback +0x00006f05 T bd_addr_cmp +0x00006f0b T bd_addr_copy +0x00006f15 T bd_addr_to_str +0x00006f4d T big_endian_read_16 +0x00006f55 T big_endian_read_32 +0x00006f69 T big_endian_store_16 +0x00006f75 T big_endian_store_32 +0x000072f9 T btstack_push_user_msg +0x00007565 T char_for_nibble +0x000077f5 T eTaskConfirmSleepModeStatus +0x00008101 T gap_add_dev_to_periodic_list +0x00008119 T gap_add_whitelist +0x0000812d T gap_aes_encrypt +0x00008155 T gap_clear_white_lists +0x00008165 T gap_clr_adv_set +0x00008175 T gap_clr_periodic_adv_list +0x000081a1 T gap_create_connection_cancel +0x000081b1 T gap_default_periodic_adv_sync_transfer_param +0x000081c9 T gap_disconnect +0x000081f5 T gap_disconnect_all +0x0000829d T gap_ext_create_connection +0x00008361 T gap_get_connection_parameter_range +0x0000839d T gap_le_read_channel_map +0x00008411 T gap_periodic_adv_create_sync +0x00008435 T gap_periodic_adv_create_sync_cancel +0x00008445 T gap_periodic_adv_set_info_transfer +0x0000845d T gap_periodic_adv_sync_transfer +0x00008475 T gap_periodic_adv_sync_transfer_param +0x00008491 T gap_periodic_adv_term_sync +0x00008525 T gap_read_antenna_info +0x00008535 T gap_read_periodic_adv_list_size +0x00008545 T gap_read_phy +0x00008559 T gap_read_remote_info +0x0000856d T gap_read_remote_used_features +0x00008581 T gap_read_rssi +0x00008595 T gap_remove_whitelist +0x00008621 T gap_rmv_adv_set +0x00008635 T gap_rmv_dev_from_periodic_list +0x00008675 T gap_set_adv_set_random_addr +0x000086c1 T gap_set_connection_cte_request_enable +0x000086dd T gap_set_connection_cte_response_enable +0x000086f1 T gap_set_connection_cte_rx_param +0x0000874d T gap_set_connection_cte_tx_param +0x000087a1 T gap_set_connection_parameter_range +0x000087b9 T gap_set_connectionless_cte_tx_enable +0x000087cd T gap_set_connectionless_cte_tx_param +0x00008831 T gap_set_connectionless_iq_sampling_enable +0x00008895 T gap_set_def_phy +0x000088ad T gap_set_ext_adv_data +0x000088c5 T gap_set_ext_adv_enable +0x00008941 T gap_set_ext_adv_para +0x00008a21 T gap_set_ext_scan_enable +0x00008a39 T gap_set_ext_scan_para +0x00008ae1 T gap_set_ext_scan_response_data +0x00008af9 T gap_set_host_channel_classification +0x00008b0d T gap_set_periodic_adv_data +0x00008b81 T gap_set_periodic_adv_enable +0x00008b95 T gap_set_periodic_adv_para +0x00008bad T gap_set_periodic_adv_rx_enable +0x00008bc1 T gap_set_phy +0x00008bdd T gap_set_random_device_address +0x00008c41 T gap_start_ccm +0x00008c75 T gap_update_connection_parameters +0x0000915d T gatt_client_cancel_write +0x00009183 T gatt_client_discover_characteristic_descriptors +0x000091c5 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 +0x00009215 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 +0x00009265 T gatt_client_discover_characteristics_for_service +0x0000929b T gatt_client_discover_primary_services +0x000092cd T gatt_client_discover_primary_services_by_uuid128 +0x00009311 T gatt_client_discover_primary_services_by_uuid16 +0x0000934d T gatt_client_execute_write +0x00009373 T gatt_client_find_included_services_for_service +0x000093a1 T gatt_client_get_mtu +0x00009449 T gatt_client_is_ready +0x0000945f T gatt_client_listen_for_characteristic_value_updates +0x00009483 T gatt_client_prepare_write +0x000094c1 T gatt_client_pts_suppress_mtu_exchange +0x000094cd T gatt_client_read_characteristic_descriptor_using_descriptor_handle +0x000094f7 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle +0x000094fd T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x0000952b T gatt_client_read_long_value_of_characteristic_using_value_handle +0x00009531 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset +0x0000955f T gatt_client_read_multiple_characteristic_values +0x0000958f T gatt_client_read_value_of_characteristic_using_value_handle +0x000095bd T gatt_client_read_value_of_characteristics_by_uuid128 +0x00009609 T gatt_client_read_value_of_characteristics_by_uuid16 +0x00009655 T gatt_client_register_handler +0x00009661 T gatt_client_reliable_write_long_value_of_characteristic +0x00009a8d T gatt_client_signed_write_without_response +0x00009b51 T gatt_client_write_characteristic_descriptor_using_descriptor_handle +0x00009b8b T gatt_client_write_client_characteristic_configuration +0x00009bdd T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle +0x00009bed T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x00009c29 T gatt_client_write_long_value_of_characteristic +0x00009c39 T gatt_client_write_long_value_of_characteristic_with_offset +0x00009c75 T gatt_client_write_value_of_characteristic +0x00009cab T gatt_client_write_value_of_characteristic_without_response +0x0000b235 T hci_add_event_handler +0x0000b97d T hci_power_control +0x0000bb31 T hci_register_acl_packet_handler +0x0000c199 T kv_commit +0x0000c1d1 T kv_get +0x0000c1e9 T kv_init +0x0000c239 T kv_put +0x0000c2b1 T kv_remove +0x0000c2ed T kv_remove_all +0x0000c331 T kv_value_modified +0x0000c335 T kv_visit +0x0000c3f5 T l2cap_can_send_fixed_channel_packet_now +0x0000c3f9 T l2cap_can_send_packet_now +0x0000c5b1 T l2cap_create_channel +0x0000c6e9 T l2cap_disconnect +0x0000c98d T l2cap_get_remote_mtu_for_local_cid +0x0000ce0d T l2cap_init +0x0000ce55 T l2cap_le_send_flow_control_credit +0x0000d0b9 T l2cap_max_le_mtu +0x0000d0bd T l2cap_max_mtu +0x0000d0c1 T l2cap_next_local_cid +0x0000d0d1 T l2cap_next_sig_id +0x0000d169 T l2cap_register_fixed_channel +0x0000d185 T l2cap_register_packet_handler +0x0000d191 T l2cap_register_service +0x0000d279 T l2cap_request_can_send_fix_channel_now_event +0x0000d29d T l2cap_request_can_send_now_event +0x0000d2b7 T l2cap_request_connection_parameter_update +0x0000d2e9 T l2cap_require_security_level_2_for_outgoing_sdp +0x0000d6ad T l2cap_send +0x0000d725 T l2cap_send_connectionless +0x0000d7b5 T l2cap_send_connectionless3 +0x0000d84d T l2cap_send_echo_request +0x0000d8b1 T l2cap_send_signaling_le +0x0000d909 T l2cap_unregister_service +0x0000daed T ll_hint_on_ce_len +0x0000ddd1 T ll_set_adv_coded_scheme +0x0000de01 T ll_set_def_antenna +0x0000de1d T ll_set_initiating_coded_scheme +0x0001dbfd T nibble_for_char +0x0001dca1 T platform_config +0x0001dd01 T platform_get_heap_status +0x0001dd19 T platform_get_version +0x0001dd21 T platform_hrng +0x0001dd29 T platform_patch_rf_init_data +0x0001dd45 T platform_printf +0x0001dd59 T platform_raise_assertion +0x0001dd6d T platform_read_persistent_reg +0x0001dd7d T platform_reset +0x0001ddb1 T platform_set_evt_callback +0x0001ddc5 T platform_set_irq_callback +0x0001ddfd T platform_set_rf_clk_source +0x0001de09 T platform_set_rf_init_data +0x0001de15 T platform_set_rf_power_mapping +0x0001de21 T platform_shutdown +0x0001de25 T platform_switch_app +0x0001de49 T platform_write_persistent_reg +0x0001de59 T printf_hexdump +0x0001e955 T pvPortMalloc +0x0001ea3d T pvTaskIncrementMutexHeldCount +0x0001ea55 T pvTimerGetTimerID +0x0001ea81 T pxPortInitialiseStack +0x0001ec41 T reverse_128 +0x0001ec47 T reverse_24 +0x0001ec4d T reverse_48 +0x0001ec53 T reverse_56 +0x0001ec59 T reverse_64 +0x0001ec5f T reverse_bd_addr +0x0001ec65 T reverse_bytes +0x0001ee09 T sm_add_event_handler +0x0001ef35 T sm_address_resolution_lookup +0x0001f00f T sm_authenticated +0x0001f01d T sm_authorization_decline +0x0001f03d T sm_authorization_grant +0x0001f05d T sm_authorization_state +0x0001f079 T sm_bonding_decline +0x0001f451 T sm_config +0x0001f55d T sm_encryption_key_size +0x0001fd2d T sm_just_works_confirm +0x0001ff7d T sm_le_device_key +0x00020015 T sm_passkey_input +0x000203a1 T sm_private_random_address_generation_get +0x000203a9 T sm_private_random_address_generation_get_mode +0x000203b5 T sm_private_random_address_generation_set_mode +0x000203dd T sm_private_random_address_generation_set_update_period +0x00020415 T sm_register_oob_data_callback +0x00020421 T sm_request_pairing +0x00020e5b T sm_send_security_request +0x00020e81 T sm_set_accepted_stk_generation_methods +0x00020e8d T sm_set_authentication_requirements +0x00020e99 T sm_set_encryption_key_size_range +0x0002116d T sscanf_bd_addr +0x000214c1 T sysSetPublicDeviceAddr +0x00021a91 T uuid128_to_str +0x00021ae9 T uuid_add_bluetooth_prefix +0x00021b09 T uuid_has_bluetooth_prefix +0x00021b4d T uxQueueMessagesWaiting +0x00021b75 T uxQueueMessagesWaitingFromISR +0x00021b91 T uxQueueSpacesAvailable +0x00021cc1 T vPortFree +0x00021e81 T vQueueDelete +0x00021ead T vQueueWaitForMessageRestricted +0x00021ef5 T vTaskDelay +0x00021f41 T vTaskInternalSetTimeOutState +0x00021f51 T vTaskMissedYield +0x00021f5d T vTaskPlaceOnEventList +0x00021f95 T vTaskPlaceOnEventListRestricted +0x00021fd5 T vTaskPriorityDisinheritAfterTimeout +0x00022081 T vTaskStartScheduler +0x00022111 T vTaskStepTick +0x00022141 T vTaskSuspendAll +0x00022151 T vTaskSwitchContext +0x000221f9 T xPortStartScheduler +0x000222b5 T xQueueAddToSet +0x000222d9 T xQueueCreateCountingSemaphore +0x00022315 T xQueueCreateCountingSemaphoreStatic +0x00022359 T xQueueCreateMutex +0x0002236f T xQueueCreateMutexStatic +0x00022389 T xQueueCreateSet +0x00022391 T xQueueGenericCreate +0x000223dd T xQueueGenericCreateStatic +0x00022445 T xQueueGenericReset +0x000224d1 T xQueueGenericSend +0x0002263d T xQueueGenericSendFromISR +0x000226fd T xQueueGiveFromISR +0x000227a1 T xQueueGiveMutexRecursive +0x000227e1 T xQueueIsQueueEmptyFromISR +0x00022805 T xQueueIsQueueFullFromISR +0x0002282d T xQueuePeek +0x00022955 T xQueuePeekFromISR +0x000229c1 T xQueueReceive +0x00022aed T xQueueReceiveFromISR +0x00022b81 T xQueueRemoveFromSet +0x00022ba3 T xQueueSelectFromSet +0x00022bb5 T xQueueSelectFromSetFromISR +0x00022bc9 T xQueueSemaphoreTake +0x00022d35 T xQueueTakeMutexRecursive +0x00022d79 T xTaskCheckForTimeOut +0x00022de9 T xTaskCreate +0x00022e45 T xTaskCreateStatic +0x00022eb5 T xTaskGetCurrentTaskHandle +0x00022ec1 T xTaskGetSchedulerState +0x00022edd T xTaskGetTickCount +0x00022ee9 T xTaskIncrementTick +0x00022fb5 T xTaskPriorityDisinherit +0x00023049 T xTaskPriorityInherit +0x000230dd T xTaskRemoveFromEventList +0x0002315d T xTaskResumeAll +0x00023225 T xTimerCreate +0x00023259 T xTimerCreateStatic +0x00023291 T xTimerCreateTimerTask +0x000232fd T xTimerGenericCommand diff --git a/bundles/mesh/ING9188xx/symdefs.s b/bundles/mesh/ING9188xx/symdefs.s index 7d960eaf7..1b72107a9 100644 --- a/bundles/mesh/ING9188xx/symdefs.s +++ b/bundles/mesh/ING9188xx/symdefs.s @@ -1,326 +1,267 @@ ---defsym:PB_ADV_config=0x00004ff1 ---defsym:att_dispatch_client_can_send_now=0x00006ee1 ---defsym:att_dispatch_client_request_can_send_now_event=0x00006ee9 ---defsym:att_dispatch_register_client=0x00006f01 ---defsym:att_dispatch_register_server=0x00006f15 ---defsym:att_dispatch_server_can_send_now=0x00006f29 ---defsym:att_dispatch_server_request_can_send_now_event=0x00006f31 ---defsym:att_emit_general_event=0x00006f49 ---defsym:att_server_can_send_packet_now=0x00007745 ---defsym:att_server_get_mtu=0x00007749 ---defsym:att_server_indicate=0x000077b9 ---defsym:att_server_init=0x0000783d ---defsym:att_server_notify=0x00007879 ---defsym:att_server_register_packet_handler=0x00007961 ---defsym:att_server_request_can_send_now_event=0x0000796d ---defsym:att_set_db=0x00007989 ---defsym:att_set_read_callback=0x0000799d ---defsym:att_set_write_callback=0x000079a9 ---defsym:bd_addr_cmp=0x00007d89 ---defsym:bd_addr_copy=0x00007d8f ---defsym:bd_addr_to_str=0x00007d99 ---defsym:big_endian_read_16=0x00008331 ---defsym:big_endian_read_32=0x00008339 ---defsym:big_endian_store_16=0x0000834d ---defsym:big_endian_store_32=0x00008359 ---defsym:ble_gatts_find_chr=0x00008a99 ---defsym:ble_gatts_find_svc=0x00008b31 ---defsym:bt_dh_key_gen=0x00008e81 ---defsym:bt_encrypt_be=0x00008ea9 ---defsym:bt_hex=0x00008ed1 ---defsym:bt_le_adv_start=0x00008f31 ---defsym:bt_le_adv_stop=0x00009059 ---defsym:bt_mesh_init=0x0000b7bd ---defsym:bt_mesh_input_number=0x0000b81d ---defsym:bt_mesh_input_string=0x0000b891 ---defsym:bt_mesh_is_provisioned=0x0000b90d ---defsym:bt_mesh_model_elem=0x0000bdcd ---defsym:bt_mesh_model_msg_init=0x0000bfa1 ---defsym:bt_mesh_model_publish=0x0000c039 ---defsym:bt_mesh_model_send=0x0000c47d ---defsym:bt_mesh_prov_disable=0x0000e625 ---defsym:bt_mesh_prov_enable=0x0000e65d ---defsym:bt_mesh_provision=0x0000e819 ---defsym:bt_mesh_reset=0x0000efdd ---defsym:bt_pub_key_gen=0x0000fa71 ---defsym:bt_pub_key_get=0x0000faa1 ---defsym:bt_rand=0x0000fab5 ---defsym:btstack_push_user_msg=0x0000fd31 ---defsym:char_for_nibble=0x000102db ---defsym:eTaskConfirmSleepModeStatus=0x00011779 ---defsym:gap_add_dev_to_periodic_list=0x00013ad5 ---defsym:gap_add_whitelist=0x00013aed ---defsym:gap_aes_encrypt=0x00013b01 ---defsym:gap_clr_adv_set=0x00013b29 ---defsym:gap_clr_periodic_adv_list=0x00013b39 ---defsym:gap_create_connection_cancel=0x00013b65 ---defsym:gap_disconnect=0x00013b75 ---defsym:gap_ext_create_connection=0x00013c09 ---defsym:gap_get_connection_parameter_range=0x00013ccd ---defsym:gap_periodic_adv_create_sync=0x00013d65 ---defsym:gap_periodic_adv_create_sync_cancel=0x00013d89 ---defsym:gap_periodic_adv_term_sync=0x00013d99 ---defsym:gap_read_periodic_adv_list_size=0x00013ea5 ---defsym:gap_read_phy=0x00013eb5 ---defsym:gap_remove_whitelist=0x00013ec9 ---defsym:gap_rmv_adv_set=0x00013f55 ---defsym:gap_rmv_dev_from_periodic_list=0x00013f69 ---defsym:gap_set_adv_set_random_addr=0x00013fa9 ---defsym:gap_set_connection_parameter_range=0x00013ff5 ---defsym:gap_set_def_phy=0x0001400d ---defsym:gap_set_ext_adv_data=0x00014025 ---defsym:gap_set_ext_adv_enable=0x0001403d ---defsym:gap_set_ext_adv_para=0x000140b9 ---defsym:gap_set_ext_scan_enable=0x00014185 ---defsym:gap_set_ext_scan_para=0x0001419d ---defsym:gap_set_ext_scan_response_data=0x00014245 ---defsym:gap_set_host_channel_classification=0x0001425d ---defsym:gap_set_periodic_adv_data=0x00014271 ---defsym:gap_set_periodic_adv_enable=0x000142e5 ---defsym:gap_set_periodic_adv_para=0x000142f9 ---defsym:gap_set_phy=0x00014311 ---defsym:gap_set_random_device_address=0x0001432d ---defsym:gap_start_ccm=0x00014391 ---defsym:gap_update_connection_parameters=0x000143c5 ---defsym:gatt_client_cancel_write=0x0001487d ---defsym:gatt_client_deserialize_characteristic=0x000148a3 ---defsym:gatt_client_deserialize_characteristic_descriptor=0x000148db ---defsym:gatt_client_deserialize_service=0x000148e9 ---defsym:gatt_client_discover_characteristic_descriptors=0x00014915 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00014957 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x000149a7 ---defsym:gatt_client_discover_characteristics_for_service=0x000149f7 ---defsym:gatt_client_discover_characteristics_for_service_by_uuid128=0x00014a2f ---defsym:gatt_client_discover_characteristics_for_service_by_uuid16=0x00014a3d ---defsym:gatt_client_discover_primary_services=0x00014a4b ---defsym:gatt_client_discover_primary_services_by_uuid128=0x00014a7d ---defsym:gatt_client_discover_primary_services_by_uuid16=0x00014ac1 ---defsym:gatt_client_execute_write=0x00014afd ---defsym:gatt_client_find_included_services_for_service=0x00014b23 ---defsym:gatt_client_get_mtu=0x00014b53 ---defsym:gatt_client_is_ready=0x00014bfd ---defsym:gatt_client_listen_for_characteristic_value_updates=0x00014c13 ---defsym:gatt_client_prepare_write=0x00014c39 ---defsym:gatt_client_pts_suppress_mtu_exchange=0x00014c75 ---defsym:gatt_client_read_characteristic_descriptor=0x00014c81 ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00014c87 ---defsym:gatt_client_read_long_characteristic_descriptor=0x00014cb1 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00014cb9 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00014cbf ---defsym:gatt_client_read_long_value_of_characteristic=0x00014ced ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00014cf5 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00014cfb ---defsym:gatt_client_read_multiple_characteristic_values=0x00014d29 ---defsym:gatt_client_read_value_of_characteristic=0x00014d59 ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00014d5f ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00014d8d ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00014dd9 ---defsym:gatt_client_register_handler=0x00014e25 ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00014e31 ---defsym:gatt_client_signed_write_without_response=0x0001525d ---defsym:gatt_client_write_characteristic_descriptor=0x00015321 ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0001532f ---defsym:gatt_client_write_client_characteristic_configuration=0x00015369 ---defsym:gatt_client_write_long_characteristic_descriptor=0x000153bb ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x000153cd ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000153dd ---defsym:gatt_client_write_long_value_of_characteristic=0x00015419 ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00015429 ---defsym:gatt_client_write_value_of_characteristic=0x00015465 ---defsym:gatt_client_write_value_of_characteristic_without_response=0x0001549b ---defsym:hci_add_event_handler=0x00018f9d ---defsym:hci_power_control=0x000197d9 ---defsym:hci_register_acl_packet_handler=0x000199d9 ---defsym:k_delayed_work_add_arg=0x0001ae4d ---defsym:k_delayed_work_cancel=0x0001ae51 ---defsym:k_delayed_work_init=0x0001ae67 ---defsym:k_delayed_work_remaining_get=0x0001ae81 ---defsym:k_delayed_work_submit=0x0001aea7 ---defsym:k_fifo_is_empty=0x0001aec3 ---defsym:k_sleep=0x0001aeeb ---defsym:k_uptime_get=0x0001aef9 ---defsym:k_uptime_get_32=0x0001af0d ---defsym:k_work_add_arg=0x0001af1f ---defsym:k_work_init=0x0001af23 ---defsym:k_work_submit=0x0001af3d ---defsym:kv_commit=0x0001b1dd ---defsym:kv_get=0x0001b239 ---defsym:kv_init=0x0001b251 ---defsym:kv_put=0x0001b2a1 ---defsym:kv_remove=0x0001b319 ---defsym:kv_remove_all=0x0001b355 ---defsym:kv_value_append=0x0001b419 ---defsym:kv_value_modified=0x0001b47d ---defsym:kv_value_trunc=0x0001b481 ---defsym:kv_visit=0x0001b4d1 ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0001b545 ---defsym:l2cap_init=0x0001b89d ---defsym:l2cap_max_le_mtu=0x0001b8e1 ---defsym:l2cap_register_fixed_channel=0x0001b965 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0001b981 ---defsym:l2cap_send_connectionless=0x0001bb29 ---defsym:l2cap_send_connectionless3=0x0001bbb9 ---defsym:l2cap_send_signaling_le=0x0001bca5 ---defsym:le_adv_status_reset=0x0001bce1 ---defsym:mesh_platform_config=0x0002a639 ---defsym:mesh_set_dev_name=0x0002a8c9 ---defsym:mesh_setup=0x0002a8d5 ---defsym:net_buf_add_zeros=0x0002d945 ---defsym:net_buf_get=0x0002d973 ---defsym:net_buf_put=0x0002d983 ---defsym:net_buf_ref=0x0002d9a1 ---defsym:net_buf_reserve=0x0002d9b1 ---defsym:net_buf_simple_add=0x0002d9c3 ---defsym:net_buf_simple_add_be16=0x0002d9c7 ---defsym:net_buf_simple_add_be32=0x0002d9dd ---defsym:net_buf_simple_add_le16=0x0002d9ef ---defsym:net_buf_simple_add_le32=0x0002d9fb ---defsym:net_buf_simple_add_u8=0x0002da07 ---defsym:net_buf_simple_pull=0x0002da63 ---defsym:net_buf_simple_pull_be16=0x0002da6f ---defsym:net_buf_simple_pull_be32=0x0002da97 ---defsym:net_buf_simple_pull_le16=0x0002dabf ---defsym:net_buf_simple_pull_le32=0x0002dae7 ---defsym:net_buf_simple_pull_u8=0x0002db0f ---defsym:net_buf_simple_push=0x0002db2f ---defsym:net_buf_simple_push_be16=0x0002db53 ---defsym:net_buf_simple_push_le16=0x0002db87 ---defsym:net_buf_simple_push_u8=0x0002dbbb ---defsym:net_buf_slist_get=0x0002dc25 ---defsym:net_buf_slist_init=0x0002dc4d ---defsym:net_buf_slist_is_empty=0x0002dc55 ---defsym:net_buf_slist_merge_slist=0x0002dc61 ---defsym:net_buf_slist_peek_head=0x0002dc7d ---defsym:net_buf_slist_peek_next=0x0002dc87 ---defsym:net_buf_slist_put=0x0002dc91 ---defsym:net_buf_slist_remove=0x0002dca1 ---defsym:net_buf_unref=0x0002dcdb ---defsym:nibble_for_char=0x0002ed75 ---defsym:npl_freertos_callout_init=0x0002f405 ---defsym:npl_freertos_callout_remaining_ticks=0x0002f441 ---defsym:npl_freertos_callout_reset=0x0002f459 ---defsym:npl_freertos_eventq_get=0x0002f4f5 ---defsym:npl_freertos_eventq_put=0x0002f549 ---defsym:npl_freertos_sem_init=0x0002f5a1 ---defsym:npl_freertos_sem_pend=0x0002f5bd ---defsym:npl_freertos_sem_release=0x0002f611 ---defsym:npl_freertos_time_ms_to_ticks=0x0002f661 ---defsym:os_mbuf_adj=0x0002f78f ---defsym:os_mbuf_append=0x0002f827 ---defsym:os_mbuf_appendfrom=0x0002f8bf ---defsym:os_mbuf_cmpf=0x0002f915 ---defsym:os_mbuf_cmpm=0x0002f975 ---defsym:os_mbuf_concat=0x0002fa33 ---defsym:os_mbuf_copydata=0x0002fa6f ---defsym:os_mbuf_copyinto=0x0002fac7 ---defsym:os_mbuf_dup=0x0002fb45 ---defsym:os_mbuf_extend=0x0002fbb5 ---defsym:os_mbuf_free=0x0002fc05 ---defsym:os_mbuf_free_chain=0x0002fc1d ---defsym:os_mbuf_get=0x0002fc33 ---defsym:os_mbuf_get_pkthdr=0x0002fc5f ---defsym:os_mbuf_off=0x0002fc8f ---defsym:os_mbuf_pool_init=0x0002fcad ---defsym:os_mbuf_prepend=0x0002fcb7 ---defsym:os_mbuf_prepend_pullup=0x0002fd39 ---defsym:os_mbuf_pullup=0x0002fd51 ---defsym:os_mbuf_trim_front=0x0002fe1d ---defsym:os_mqueue_get=0x0002ff3d ---defsym:os_mqueue_init=0x0002ff63 ---defsym:os_mqueue_put=0x0002ff75 ---defsym:os_msys_count=0x0002ffad ---defsym:os_msys_get=0x0002ffc9 ---defsym:os_msys_get_pkthdr=0x0002ffe1 ---defsym:os_msys_num_free=0x00030041 ---defsym:os_msys_register=0x0003005d ---defsym:os_msys_reset=0x00030099 ---defsym:platform_config=0x0003038d ---defsym:platform_get_version=0x000303b9 ---defsym:platform_printf=0x000303c1 ---defsym:platform_raise_assertion=0x000303d5 ---defsym:platform_set_evt_callback=0x00030465 ---defsym:platform_set_irq_callback=0x00030479 ---defsym:platform_set_rf_clk_source=0x000304bd ---defsym:platform_set_rf_init_data=0x000304c9 ---defsym:platform_set_rf_power_mapping=0x000304d5 ---defsym:platform_shutdown=0x000304e1 ---defsym:printf_hexdump=0x0003149d ---defsym:pvPortMalloc=0x00034611 ---defsym:pvTaskIncrementMutexHeldCount=0x000346f5 ---defsym:pvTimerGetTimerID=0x0003470d ---defsym:pxPortInitialiseStack=0x00034739 ---defsym:reverse_128=0x00034ead ---defsym:reverse_24=0x00034eb3 ---defsym:reverse_48=0x00034eb9 ---defsym:reverse_56=0x00034ebf ---defsym:reverse_64=0x00034ec5 ---defsym:reverse_bd_addr=0x00034ecb ---defsym:reverse_bytes=0x00034ed1 ---defsym:settings_bytes_from_str=0x000374bd ---defsym:settings_str_from_bytes=0x000374cf ---defsym:sm_add_event_handler=0x00037665 ---defsym:sm_address_resolution_lookup=0x000377b1 ---defsym:sm_authenticated=0x0003788b ---defsym:sm_authorization_decline=0x000378a1 ---defsym:sm_authorization_grant=0x000378c1 ---defsym:sm_authorization_state=0x000378e1 ---defsym:sm_bonding_decline=0x000378fd ---defsym:sm_config=0x00037df5 ---defsym:sm_encryption_key_size=0x00037ef5 ---defsym:sm_just_works_confirm=0x00038861 ---defsym:sm_le_device_key=0x00038b91 ---defsym:sm_passkey_input=0x00038c81 ---defsym:sm_private_random_address_generation_get=0x00039051 ---defsym:sm_private_random_address_generation_get_mode=0x00039059 ---defsym:sm_private_random_address_generation_set_mode=0x00039065 ---defsym:sm_private_random_address_generation_set_update_period=0x0003908d ---defsym:sm_register_oob_data_callback=0x000390c5 ---defsym:sm_request_pairing=0x000390d1 ---defsym:sm_send_security_request=0x00039c5d ---defsym:sm_set_accepted_stk_generation_methods=0x00039c85 ---defsym:sm_set_authentication_requirements=0x00039c91 ---defsym:sm_set_encryption_key_size_range=0x00039c9d ---defsym:sscanf_bd_addr=0x0003a04d ---defsym:sysSetPublicDeviceAddr=0x0003b429 ---defsym:uuid128_to_str=0x0003d609 ---defsym:uuid_add_bluetooth_prefix=0x0003d661 ---defsym:uuid_has_bluetooth_prefix=0x0003d681 ---defsym:vPortFree=0x0003d7c9 ---defsym:vQueueWaitForMessageRestricted=0x0003d999 ---defsym:vTaskDelay=0x0003d9e1 ---defsym:vTaskInternalSetTimeOutState=0x0003da2d ---defsym:vTaskMissedYield=0x0003da3d ---defsym:vTaskPlaceOnEventList=0x0003da49 ---defsym:vTaskPlaceOnEventListRestricted=0x0003da81 ---defsym:vTaskPriorityDisinheritAfterTimeout=0x0003dac1 ---defsym:vTaskStartScheduler=0x0003db6d ---defsym:vTaskStepTick=0x0003dbf9 ---defsym:vTaskSuspendAll=0x0003dc29 ---defsym:vTaskSwitchContext=0x0003dc39 ---defsym:xPortStartScheduler=0x0003e0bd ---defsym:xQueueCreateCountingSemaphore=0x0003e179 ---defsym:xQueueGenericCreate=0x0003e1b5 ---defsym:xQueueGenericCreateStatic=0x0003e201 ---defsym:xQueueGenericReset=0x0003e269 ---defsym:xQueueGenericSend=0x0003e2f5 ---defsym:xQueueGenericSendFromISR=0x0003e45d ---defsym:xQueueGiveFromISR=0x0003e51d ---defsym:xQueueIsQueueEmptyFromISR=0x0003e5c1 ---defsym:xQueueReceive=0x0003e5e5 ---defsym:xQueueReceiveFromISR=0x0003e711 ---defsym:xQueueSemaphoreTake=0x0003e7a5 ---defsym:xTaskCheckForTimeOut=0x0003e90d ---defsym:xTaskCreate=0x0003e97d ---defsym:xTaskCreateStatic=0x0003e9d9 ---defsym:xTaskGetSchedulerState=0x0003ea49 ---defsym:xTaskGetTickCount=0x0003ea65 ---defsym:xTaskGetTickCountFromISR=0x0003ea71 ---defsym:xTaskIncrementTick=0x0003ea81 ---defsym:xTaskPriorityDisinherit=0x0003eb4d ---defsym:xTaskPriorityInherit=0x0003ebe1 ---defsym:xTaskRemoveFromEventList=0x0003ec75 ---defsym:xTaskResumeAll=0x0003ecf5 ---defsym:xTimerCreate=0x0003edbd ---defsym:xTimerCreateTimerTask=0x0003edf1 ---defsym:xTimerGenericCommand=0x0003ee5d ---defsym:xTimerGetExpiryTime=0x0003eecd +--defsym:att_dispatch_client_can_send_now=0x00006329 +--defsym:att_dispatch_client_request_can_send_now_event=0x0000632f +--defsym:att_dispatch_register_client=0x00006335 +--defsym:att_dispatch_register_server=0x00006349 +--defsym:att_dispatch_server_can_send_now=0x0000635d +--defsym:att_dispatch_server_request_can_send_now_event=0x00006363 +--defsym:att_emit_general_event=0x00006421 +--defsym:att_server_can_send_packet_now=0x00006b59 +--defsym:att_server_get_mtu=0x00006b5d +--defsym:att_server_indicate=0x00006bd1 +--defsym:att_server_init=0x00006c55 +--defsym:att_server_notify=0x00006c91 +--defsym:att_server_register_packet_handler=0x00006d79 +--defsym:att_server_request_can_send_now_event=0x00006d85 +--defsym:att_set_db=0x00006da1 +--defsym:att_set_read_callback=0x00006db5 +--defsym:att_set_write_callback=0x00006dc1 +--defsym:bd_addr_cmp=0x00006f05 +--defsym:bd_addr_copy=0x00006f0b +--defsym:bd_addr_to_str=0x00006f15 +--defsym:big_endian_read_16=0x00006f4d +--defsym:big_endian_read_32=0x00006f55 +--defsym:big_endian_store_16=0x00006f69 +--defsym:big_endian_store_32=0x00006f75 +--defsym:btstack_push_user_msg=0x000072f9 +--defsym:char_for_nibble=0x00007565 +--defsym:eTaskConfirmSleepModeStatus=0x000077f5 +--defsym:gap_add_dev_to_periodic_list=0x00008101 +--defsym:gap_add_whitelist=0x00008119 +--defsym:gap_aes_encrypt=0x0000812d +--defsym:gap_clear_white_lists=0x00008155 +--defsym:gap_clr_adv_set=0x00008165 +--defsym:gap_clr_periodic_adv_list=0x00008175 +--defsym:gap_create_connection_cancel=0x000081a1 +--defsym:gap_default_periodic_adv_sync_transfer_param=0x000081b1 +--defsym:gap_disconnect=0x000081c9 +--defsym:gap_disconnect_all=0x000081f5 +--defsym:gap_ext_create_connection=0x0000829d +--defsym:gap_get_connection_parameter_range=0x00008361 +--defsym:gap_le_read_channel_map=0x0000839d +--defsym:gap_periodic_adv_create_sync=0x00008411 +--defsym:gap_periodic_adv_create_sync_cancel=0x00008435 +--defsym:gap_periodic_adv_set_info_transfer=0x00008445 +--defsym:gap_periodic_adv_sync_transfer=0x0000845d +--defsym:gap_periodic_adv_sync_transfer_param=0x00008475 +--defsym:gap_periodic_adv_term_sync=0x00008491 +--defsym:gap_read_antenna_info=0x00008525 +--defsym:gap_read_periodic_adv_list_size=0x00008535 +--defsym:gap_read_phy=0x00008545 +--defsym:gap_read_remote_info=0x00008559 +--defsym:gap_read_remote_used_features=0x0000856d +--defsym:gap_read_rssi=0x00008581 +--defsym:gap_remove_whitelist=0x00008595 +--defsym:gap_rmv_adv_set=0x00008621 +--defsym:gap_rmv_dev_from_periodic_list=0x00008635 +--defsym:gap_set_adv_set_random_addr=0x00008675 +--defsym:gap_set_connection_cte_request_enable=0x000086c1 +--defsym:gap_set_connection_cte_response_enable=0x000086dd +--defsym:gap_set_connection_cte_rx_param=0x000086f1 +--defsym:gap_set_connection_cte_tx_param=0x0000874d +--defsym:gap_set_connection_parameter_range=0x000087a1 +--defsym:gap_set_connectionless_cte_tx_enable=0x000087b9 +--defsym:gap_set_connectionless_cte_tx_param=0x000087cd +--defsym:gap_set_connectionless_iq_sampling_enable=0x00008831 +--defsym:gap_set_def_phy=0x00008895 +--defsym:gap_set_ext_adv_data=0x000088ad +--defsym:gap_set_ext_adv_enable=0x000088c5 +--defsym:gap_set_ext_adv_para=0x00008941 +--defsym:gap_set_ext_scan_enable=0x00008a21 +--defsym:gap_set_ext_scan_para=0x00008a39 +--defsym:gap_set_ext_scan_response_data=0x00008ae1 +--defsym:gap_set_host_channel_classification=0x00008af9 +--defsym:gap_set_periodic_adv_data=0x00008b0d +--defsym:gap_set_periodic_adv_enable=0x00008b81 +--defsym:gap_set_periodic_adv_para=0x00008b95 +--defsym:gap_set_periodic_adv_rx_enable=0x00008bad +--defsym:gap_set_phy=0x00008bc1 +--defsym:gap_set_random_device_address=0x00008bdd +--defsym:gap_start_ccm=0x00008c41 +--defsym:gap_update_connection_parameters=0x00008c75 +--defsym:gatt_client_cancel_write=0x0000915d +--defsym:gatt_client_discover_characteristic_descriptors=0x00009183 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x000091c5 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00009215 +--defsym:gatt_client_discover_characteristics_for_service=0x00009265 +--defsym:gatt_client_discover_primary_services=0x0000929b +--defsym:gatt_client_discover_primary_services_by_uuid128=0x000092cd +--defsym:gatt_client_discover_primary_services_by_uuid16=0x00009311 +--defsym:gatt_client_execute_write=0x0000934d +--defsym:gatt_client_find_included_services_for_service=0x00009373 +--defsym:gatt_client_get_mtu=0x000093a1 +--defsym:gatt_client_is_ready=0x00009449 +--defsym:gatt_client_listen_for_characteristic_value_updates=0x0000945f +--defsym:gatt_client_prepare_write=0x00009483 +--defsym:gatt_client_pts_suppress_mtu_exchange=0x000094c1 +--defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x000094cd +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x000094f7 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x000094fd +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x0000952b +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x00009531 +--defsym:gatt_client_read_multiple_characteristic_values=0x0000955f +--defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x0000958f +--defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x000095bd +--defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00009609 +--defsym:gatt_client_register_handler=0x00009655 +--defsym:gatt_client_reliable_write_long_value_of_characteristic=0x00009661 +--defsym:gatt_client_signed_write_without_response=0x00009a8d +--defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x00009b51 +--defsym:gatt_client_write_client_characteristic_configuration=0x00009b8b +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009bdd +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009bed +--defsym:gatt_client_write_long_value_of_characteristic=0x00009c29 +--defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00009c39 +--defsym:gatt_client_write_value_of_characteristic=0x00009c75 +--defsym:gatt_client_write_value_of_characteristic_without_response=0x00009cab +--defsym:hci_add_event_handler=0x0000b235 +--defsym:hci_power_control=0x0000b97d +--defsym:hci_register_acl_packet_handler=0x0000bb31 +--defsym:kv_commit=0x0000c199 +--defsym:kv_get=0x0000c1d1 +--defsym:kv_init=0x0000c1e9 +--defsym:kv_put=0x0000c239 +--defsym:kv_remove=0x0000c2b1 +--defsym:kv_remove_all=0x0000c2ed +--defsym:kv_value_modified=0x0000c331 +--defsym:kv_visit=0x0000c335 +--defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c3f5 +--defsym:l2cap_can_send_packet_now=0x0000c3f9 +--defsym:l2cap_create_channel=0x0000c5b1 +--defsym:l2cap_disconnect=0x0000c6e9 +--defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c98d +--defsym:l2cap_init=0x0000ce0d +--defsym:l2cap_le_send_flow_control_credit=0x0000ce55 +--defsym:l2cap_max_le_mtu=0x0000d0b9 +--defsym:l2cap_max_mtu=0x0000d0bd +--defsym:l2cap_next_local_cid=0x0000d0c1 +--defsym:l2cap_next_sig_id=0x0000d0d1 +--defsym:l2cap_register_fixed_channel=0x0000d169 +--defsym:l2cap_register_packet_handler=0x0000d185 +--defsym:l2cap_register_service=0x0000d191 +--defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d279 +--defsym:l2cap_request_can_send_now_event=0x0000d29d +--defsym:l2cap_request_connection_parameter_update=0x0000d2b7 +--defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d2e9 +--defsym:l2cap_send=0x0000d6ad +--defsym:l2cap_send_connectionless=0x0000d725 +--defsym:l2cap_send_connectionless3=0x0000d7b5 +--defsym:l2cap_send_echo_request=0x0000d84d +--defsym:l2cap_send_signaling_le=0x0000d8b1 +--defsym:l2cap_unregister_service=0x0000d909 +--defsym:ll_hint_on_ce_len=0x0000daed +--defsym:ll_set_adv_coded_scheme=0x0000ddd1 +--defsym:ll_set_def_antenna=0x0000de01 +--defsym:ll_set_initiating_coded_scheme=0x0000de1d +--defsym:nibble_for_char=0x0001dbfd +--defsym:platform_config=0x0001dca1 +--defsym:platform_get_heap_status=0x0001dd01 +--defsym:platform_get_version=0x0001dd19 +--defsym:platform_hrng=0x0001dd21 +--defsym:platform_patch_rf_init_data=0x0001dd29 +--defsym:platform_printf=0x0001dd45 +--defsym:platform_raise_assertion=0x0001dd59 +--defsym:platform_read_persistent_reg=0x0001dd6d +--defsym:platform_reset=0x0001dd7d +--defsym:platform_set_evt_callback=0x0001ddb1 +--defsym:platform_set_irq_callback=0x0001ddc5 +--defsym:platform_set_rf_clk_source=0x0001ddfd +--defsym:platform_set_rf_init_data=0x0001de09 +--defsym:platform_set_rf_power_mapping=0x0001de15 +--defsym:platform_shutdown=0x0001de21 +--defsym:platform_switch_app=0x0001de25 +--defsym:platform_write_persistent_reg=0x0001de49 +--defsym:printf_hexdump=0x0001de59 +--defsym:pvPortMalloc=0x0001e955 +--defsym:pvTaskIncrementMutexHeldCount=0x0001ea3d +--defsym:pvTimerGetTimerID=0x0001ea55 +--defsym:pxPortInitialiseStack=0x0001ea81 +--defsym:reverse_128=0x0001ec41 +--defsym:reverse_24=0x0001ec47 +--defsym:reverse_48=0x0001ec4d +--defsym:reverse_56=0x0001ec53 +--defsym:reverse_64=0x0001ec59 +--defsym:reverse_bd_addr=0x0001ec5f +--defsym:reverse_bytes=0x0001ec65 +--defsym:sm_add_event_handler=0x0001ee09 +--defsym:sm_address_resolution_lookup=0x0001ef35 +--defsym:sm_authenticated=0x0001f00f +--defsym:sm_authorization_decline=0x0001f01d +--defsym:sm_authorization_grant=0x0001f03d +--defsym:sm_authorization_state=0x0001f05d +--defsym:sm_bonding_decline=0x0001f079 +--defsym:sm_config=0x0001f451 +--defsym:sm_encryption_key_size=0x0001f55d +--defsym:sm_just_works_confirm=0x0001fd2d +--defsym:sm_le_device_key=0x0001ff7d +--defsym:sm_passkey_input=0x00020015 +--defsym:sm_private_random_address_generation_get=0x000203a1 +--defsym:sm_private_random_address_generation_get_mode=0x000203a9 +--defsym:sm_private_random_address_generation_set_mode=0x000203b5 +--defsym:sm_private_random_address_generation_set_update_period=0x000203dd +--defsym:sm_register_oob_data_callback=0x00020415 +--defsym:sm_request_pairing=0x00020421 +--defsym:sm_send_security_request=0x00020e5b +--defsym:sm_set_accepted_stk_generation_methods=0x00020e81 +--defsym:sm_set_authentication_requirements=0x00020e8d +--defsym:sm_set_encryption_key_size_range=0x00020e99 +--defsym:sscanf_bd_addr=0x0002116d +--defsym:sysSetPublicDeviceAddr=0x000214c1 +--defsym:uuid128_to_str=0x00021a91 +--defsym:uuid_add_bluetooth_prefix=0x00021ae9 +--defsym:uuid_has_bluetooth_prefix=0x00021b09 +--defsym:uxQueueMessagesWaiting=0x00021b4d +--defsym:uxQueueMessagesWaitingFromISR=0x00021b75 +--defsym:uxQueueSpacesAvailable=0x00021b91 +--defsym:vPortFree=0x00021cc1 +--defsym:vQueueDelete=0x00021e81 +--defsym:vQueueWaitForMessageRestricted=0x00021ead +--defsym:vTaskDelay=0x00021ef5 +--defsym:vTaskInternalSetTimeOutState=0x00021f41 +--defsym:vTaskMissedYield=0x00021f51 +--defsym:vTaskPlaceOnEventList=0x00021f5d +--defsym:vTaskPlaceOnEventListRestricted=0x00021f95 +--defsym:vTaskPriorityDisinheritAfterTimeout=0x00021fd5 +--defsym:vTaskStartScheduler=0x00022081 +--defsym:vTaskStepTick=0x00022111 +--defsym:vTaskSuspendAll=0x00022141 +--defsym:vTaskSwitchContext=0x00022151 +--defsym:xPortStartScheduler=0x000221f9 +--defsym:xQueueAddToSet=0x000222b5 +--defsym:xQueueCreateCountingSemaphore=0x000222d9 +--defsym:xQueueCreateCountingSemaphoreStatic=0x00022315 +--defsym:xQueueCreateMutex=0x00022359 +--defsym:xQueueCreateMutexStatic=0x0002236f +--defsym:xQueueCreateSet=0x00022389 +--defsym:xQueueGenericCreate=0x00022391 +--defsym:xQueueGenericCreateStatic=0x000223dd +--defsym:xQueueGenericReset=0x00022445 +--defsym:xQueueGenericSend=0x000224d1 +--defsym:xQueueGenericSendFromISR=0x0002263d +--defsym:xQueueGiveFromISR=0x000226fd +--defsym:xQueueGiveMutexRecursive=0x000227a1 +--defsym:xQueueIsQueueEmptyFromISR=0x000227e1 +--defsym:xQueueIsQueueFullFromISR=0x00022805 +--defsym:xQueuePeek=0x0002282d +--defsym:xQueuePeekFromISR=0x00022955 +--defsym:xQueueReceive=0x000229c1 +--defsym:xQueueReceiveFromISR=0x00022aed +--defsym:xQueueRemoveFromSet=0x00022b81 +--defsym:xQueueSelectFromSet=0x00022ba3 +--defsym:xQueueSelectFromSetFromISR=0x00022bb5 +--defsym:xQueueSemaphoreTake=0x00022bc9 +--defsym:xQueueTakeMutexRecursive=0x00022d35 +--defsym:xTaskCheckForTimeOut=0x00022d79 +--defsym:xTaskCreate=0x00022de9 +--defsym:xTaskCreateStatic=0x00022e45 +--defsym:xTaskGetCurrentTaskHandle=0x00022eb5 +--defsym:xTaskGetSchedulerState=0x00022ec1 +--defsym:xTaskGetTickCount=0x00022edd +--defsym:xTaskIncrementTick=0x00022ee9 +--defsym:xTaskPriorityDisinherit=0x00022fb5 +--defsym:xTaskPriorityInherit=0x00023049 +--defsym:xTaskRemoveFromEventList=0x000230dd +--defsym:xTaskResumeAll=0x0002315d +--defsym:xTimerCreate=0x00023225 +--defsym:xTimerCreateStatic=0x00023259 +--defsym:xTimerCreateTimerTask=0x00023291 +--defsym:xTimerGenericCommand=0x000232fd diff --git a/bundles/mesh/inc/gatt_client.h b/bundles/mesh/inc/gatt_client.h index 36336a7e6..5723f5d79 100644 --- a/bundles/mesh/inc/gatt_client.h +++ b/bundles/mesh/inc/gatt_client.h @@ -1,14 +1,15 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// +/** @file + * @brief generic access profile + * Copyright Message + * + * INGCHIPS confidential and proprietary. + * COPYRIGHT (c) 2018 by INGCHIPS + * + * All rights are reserved. Reproduction in whole or in part is + * prohibited without the written consent of the copyright owner. + * + * +*/ // ---------------------------------------------------------------------------- #ifndef _GATT_CLIENT_H @@ -25,28 +26,88 @@ extern "C" { #endif -typedef struct { +/** + * @brief Bluetooth + * @defgroup Bluetooth_gatt_client + * @ingroup bluetooth_stack + * @{ + */ + +#define UUID128_LEN (16) + +#pragma pack(push, 1) + +typedef struct +{ + uint16_t handle; + uint8_t value[0]; // length is given in `value_size` +} gatt_event_value_packet_t; + +typedef struct +{ + uint16_t handle; + uint16_t offset; + uint8_t value[0]; // length is given in `value_size` +} gatt_event_long_value_packet_t; + +typedef struct +{ + hci_con_handle_t handle; + uint8_t status; +} gatt_event_query_complete_t; + +typedef struct +{ uint16_t start_group_handle; uint16_t end_group_handle; - uint16_t uuid16; - uint8_t uuid128[16]; + uint8_t uuid128[UUID128_LEN]; } gatt_client_service_t; +typedef struct +{ + hci_con_handle_t handle; + gatt_client_service_t service; +} gatt_event_service_query_result_t; + typedef struct { uint16_t start_handle; uint16_t value_handle; uint16_t end_handle; uint16_t properties; - uint16_t uuid16; - uint8_t uuid128[16]; + uint8_t uuid128[UUID128_LEN]; } gatt_client_characteristic_t; +typedef struct +{ + hci_con_handle_t handle; + gatt_client_characteristic_t characteristic; +} gatt_event_characteristic_query_result_t; + typedef struct { uint16_t handle; - uint16_t uuid16; - uint8_t uuid128[16]; + uint8_t uuid128[UUID128_LEN]; } gatt_client_characteristic_descriptor_t; +typedef struct +{ + hci_con_handle_t handle; + gatt_client_characteristic_descriptor_t descriptor; +} gatt_event_characteristic_descriptor_query_result_t; + +typedef struct +{ + hci_con_handle_t handle; + uint16_t include_handle; + gatt_client_service_t service; +} gatt_event_included_service_query_result_t; + +typedef struct { + hci_con_handle_t handle; + gatt_client_characteristic_descriptor_t descriptor; +} gatt_event_all_characteristic_descriptors_query_result_t; + +#pragma pack(pop) + /** * @brief Discovers all primary services. For each found service, an le_service_event_t with type set to GATT_EVENT_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t, with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. */ @@ -57,27 +118,29 @@ uint8_t gatt_client_discover_primary_services(user_packet_handler_t callback, hc */ uint8_t gatt_client_discover_primary_services_by_uuid16(user_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t uuid16); uint8_t gatt_client_discover_primary_services_by_uuid128(user_packet_handler_t callback, hci_con_handle_t con_handle, const uint8_t * uuid128); -uint8_t gatt_client_discover_characteristics_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); + /** * @brief Finds included services within the specified service. For each found included service, an le_service_event_t with type set to GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. Information about included service type (primary/secondary) can be retrieved either by sending an ATT find information request for the returned start group handle (returning the handle and the UUID for primary or secondary service) or by comparing the service to the list of all primary services. */ -uint8_t gatt_client_find_included_services_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_service_t *service); +uint8_t gatt_client_find_included_services_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, + const uint16_t start_group_handle, const uint16_t end_group_handle); /** - * @brief The following four functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. + * @brief The following function are used to discover all characteristics within the specified service or handle range + */ +uint8_t gatt_client_discover_characteristics_for_service(user_packet_handler_t callback, hci_con_handle_t con_handle, + const uint16_t start_group_handle, const uint16_t end_group_handle); + +/** + * @brief The following two functions are used to discover all characteristics within the specified service or handle range, and return those that match the given UUID. For each found characteristic, an le_characteristic_event_t with type set to GATT_EVENT_CHARACTERISTIC_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. */ uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid16(btstack_packet_handler_t callback, const hci_con_handle_t con_handle, const uint16_t start_handle, const uint16_t end_handle, const uint16_t uuid16); uint8_t gatt_client_discover_characteristics_for_handle_range_by_uuid128(btstack_packet_handler_t callback, const hci_con_handle_t con_handle, const uint16_t start_handle, const uint16_t end_handle, const uint8_t * uuid128); -uint8_t gatt_client_discover_characteristics_for_service_by_uuid16 (btstack_packet_handler_t callback, - const hci_con_handle_t con_handle, gatt_client_service_t *service, - const uint16_t uuid16); -uint8_t gatt_client_discover_characteristics_for_service_by_uuid128(btstack_packet_handler_t callback, - const hci_con_handle_t con_handle, gatt_client_service_t *service, const uint8_t * uuid128); /** * @brief Discovers attribute handle and UUID of a characteristic descriptor within the specified characteristic. For each found descriptor, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of discovery. @@ -87,7 +150,6 @@ uint8_t gatt_client_discover_characteristic_descriptors(btstack_packet_handler_t /** * @brief Reads the characteristic value using the characteristic's value handle. If the characteristic value is found, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. */ -uint8_t gatt_client_read_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); uint8_t gatt_client_read_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); /** @@ -99,7 +161,6 @@ uint8_t gatt_client_read_value_of_characteristics_by_uuid128(btstack_packet_hand /** * @brief Reads the long characteristic value using the characteristic's value handle. The value will be returned in several blobs. For each blob, an le_characteristic_value_event_t with type set to GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT and updated value offset will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, mark the end of read. */ -uint8_t gatt_client_read_long_value_of_characteristic(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_t *characteristic); uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle); uint8_t gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t characteristic_value_handle, uint16_t offset); @@ -135,22 +196,18 @@ uint8_t gatt_client_reliable_write_long_value_of_characteristic(btstack_packet_h /** * @brief Reads the characteristic descriptor using its handle. If the characteristic descriptor is found, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. */ -uint8_t gatt_client_read_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); uint8_t gatt_client_read_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); /** * @brief Reads the long characteristic descriptor using its handle. It will be returned in several blobs. For each blob, an le_characteristic_descriptor_event_t with type set to GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT will be generated and passed to the registered callback. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of read. */ -uint8_t gatt_client_read_long_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor); uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle); uint8_t gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset); /** * @brief Writes the characteristic descriptor using its handle. The gatt_complete_event_t with type set to GATT_EVENT_QUERY_COMPLETE, marks the end of write. The write is successfully performed, if the event's status field is set to 0. */ -uint8_t gatt_client_write_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); uint8_t gatt_client_write_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); -uint8_t gatt_client_write_long_characteristic_descriptor(btstack_packet_handler_t callback, hci_con_handle_t con_handle, gatt_client_characteristic_descriptor_t * descriptor, uint16_t length, uint8_t * data); uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t length, uint8_t * data); uint8_t gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset(btstack_packet_handler_t callback, hci_con_handle_t con_handle, uint16_t descriptor_handle, uint16_t offset, uint16_t length, uint8_t * data); @@ -174,12 +231,6 @@ uint8_t gatt_client_execute_write(btstack_packet_handler_t callback, hci_con_han * @brief -> gatt complete event */ uint8_t gatt_client_cancel_write(btstack_packet_handler_t callback, hci_con_handle_t con_handle); -void gatt_client_deserialize_service(const uint8_t *packet, int offset, gatt_client_service_t *service); -void gatt_client_deserialize_characteristic(const uint8_t * packet, int offset, gatt_client_characteristic_t * characteristic); -void gatt_client_deserialize_characteristic_descriptor(const uint8_t * packet, int offset, gatt_client_characteristic_descriptor_t * descriptor); - -int ble_gatts_find_svc(const ble_uuid_t *uuid, uint16_t *out_handle); -int ble_gatts_find_chr(uint16_t srv_handle, const ble_uuid_t *uuid,uint16_t *out_att_chr); typedef struct gatt_client_notification { btstack_linked_item_t item; @@ -204,7 +255,7 @@ int gatt_client_is_ready(hci_con_handle_t con_handle); * @param con_handle * @param characteristic */ -void gatt_client_listen_for_characteristic_value_updates(gatt_client_notification_t * notification, btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle, gatt_client_characteristic_t * characteristic); +void gatt_client_listen_for_characteristic_value_updates(gatt_client_notification_t * notification, btstack_packet_handler_t packet_handler, hci_con_handle_t con_handle, uint16_t value_handle); /** * @brief Register for general events @@ -215,125 +266,52 @@ void gatt_client_register_handler(btstack_packet_handler_t handler); // only used for testing void gatt_client_pts_suppress_mtu_exchange(void); -#pragma pack(push, 1) - -typedef struct -{ - uint16_t handle; - uint8_t value[0]; // length is given in `value_size` -} gatt_event_value_packet_t; - -typedef struct -{ - uint16_t handle; - uint16_t offset; - uint8_t value[0]; // length is given in `value_size` -} gatt_event_long_value_packet_t; - -#pragma pack(pop) - /** - * @brief Get field handle from event GATT_EVENT_QUERY_COMPLETE + * @brief Parse event GATT_EVENT_QUERY_COMPLETE * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_query_complete_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field status from event GATT_EVENT_QUERY_COMPLETE - * @param event packet - * @return status - * @note: btstack_type 1 + * @return parsed result */ -static __INLINE uint8_t gatt_event_query_complete_get_status(const uint8_t * event){ - return *decode_event_offset(event, uint8_t, 4); +static __INLINE const gatt_event_query_complete_t * gatt_event_query_complete_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_query_complete_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_SERVICE_QUERY_RESULT - * @param event packet - * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_service_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field service from event GATT_EVENT_SERVICE_QUERY_RESULT + * @brief Parse event GATT_EVENT_SERVICE_QUERY_RESULT * @param event packet - * @param Pointer to storage for service - * @note: btstack_type X + * @return parsed result */ -static __INLINE void gatt_event_service_query_result_get_service(const uint8_t * event, gatt_client_service_t * service){ - gatt_client_deserialize_service(event, 4, service); +static __INLINE const gatt_event_service_query_result_t * gatt_event_service_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_service_query_result_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT + * @brief Parse event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT * @param event packet * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_characteristic_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field characteristic from event GATT_EVENT_CHARACTERISTIC_QUERY_RESULT - * @param event packet - * @param Pointer to storage for characteristic - * @note: btstack_type Y + * @note: parsed result */ -static __INLINE void gatt_event_characteristic_query_result_get_characteristic(const uint8_t * event, gatt_client_characteristic_t * characteristic){ - gatt_client_deserialize_characteristic(event, 4, characteristic); +static __INLINE const gatt_event_characteristic_query_result_t * gatt_event_characteristic_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_characteristic_query_result_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT + * @brief Parse event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT * @param event packet * @return handle - * @note: btstack_type H - */ -static __INLINE hci_con_handle_t gatt_event_included_service_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field include_handle from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT - * @param event packet - * @return include_handle - * @note: btstack_type 2 + * @note: parsed result */ -static __INLINE uint16_t gatt_event_included_service_query_result_get_include_handle(const uint8_t * event){ - return little_endian_read_16(event, 4); -} -/** - * @brief Get field service from event GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT - * @param event packet - * @param Pointer to storage for service - * @note: btstack_type X - */ -static __INLINE void gatt_event_included_service_query_result_get_service(const uint8_t * event, gatt_client_service_t * service){ - gatt_client_deserialize_service(event, 6, service); +static __INLINE const gatt_event_included_service_query_result_t * gatt_event_included_service_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_included_service_query_result_t, 2); } /** - * @brief Get field handle from event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT + * @brief Parse event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT * @param event packet * @return handle - * @note: btstack_type H + * @note: parsed result */ -static __INLINE hci_con_handle_t gatt_event_all_characteristic_descriptors_query_result_get_handle(const uint8_t * event){ - return little_endian_read_16(event, 2); -} -/** - * @brief Get field characteristic_descriptor from event GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT - * @param event packet - * @param Pointer to storage for characteristic_descriptor - * @note: btstack_type Z - */ -static __INLINE void gatt_event_all_characteristic_descriptors_query_result_get_characteristic_descriptor(const uint8_t * event, gatt_client_characteristic_descriptor_t * characteristic_descriptor){ - gatt_client_deserialize_characteristic_descriptor(event, 4, characteristic_descriptor); +static __INLINE const gatt_event_all_characteristic_descriptors_query_result_t * gatt_event_all_characteristic_descriptors_query_result_parse(const uint8_t * event){ + return decode_event_offset(event, gatt_event_all_characteristic_descriptors_query_result_t, 2); } /** @@ -433,6 +411,9 @@ static __INLINE uint16_t gatt_event_mtu_get_mtu(const uint8_t * event){ return little_endian_read_16(event, 4); } +/** + * @} +*/ #ifdef __cplusplus } #endif diff --git a/bundles/mesh/inc/kv_storage.h b/bundles/mesh/inc/kv_storage.h index e9259de9e..83c62ed53 100644 --- a/bundles/mesh/inc/kv_storage.h +++ b/bundles/mesh/inc/kv_storage.h @@ -1,21 +1,24 @@ -// ---------------------------------------------------------------------------- -// Copyright Message -// ---------------------------------------------------------------------------- -// -// INGCHIPS confidential and proprietary. -// COPYRIGHT (c) 2018-2019 by INGCHIPS -// -// All rights are reserved. Reproduction in whole or in part is -// prohibited without the written consent of the copyright owner. -// -// -// ---------------------------------------------------------------------------- +/** @file * +* @brief helper function to cache data into flash * +* @version 1.0.0. * +* @date 2019/10/10 * +* * +* Copyright (c) 2019 IngChips corp. * +* * +* * + *************************************************************************************************************/ #ifndef _KV_STORAGE_H #define _KV_STORAGE_H #include +/** + * @brief Bluetooth + * @defgroup Bluetooth_NVM + * @ingroup bluetooth_stack + * @{ + */ /** * @brief A simple key-value storage * @@ -149,7 +152,9 @@ void kv_visit(f_kv_visitor visitor, void *user_data); * @param[in] len data length to be appended for the key * @return KV_OK if successful else error code */ -int kv_value_append(const kvkey_t key, const uint8_t *more_data, const int16_t len); +// int kv_value_append(const kvkey_t key, const uint8_t *more_data, const int16_t len); +// WARNING: ^^^ this API is not available in this release + /** * @brief truncate an existing value @@ -157,6 +162,12 @@ int kv_value_append(const kvkey_t key, const uint8_t *more_data, const int16_t l * @param[in] new_len new length of data for the key * @return KV_OK if successful else error code */ -int kv_value_trunc(const kvkey_t key, const int16_t new_len); +// int kv_value_trunc(const kvkey_t key, const int16_t new_len); +// WARNING: ^^^ this API is not available in this release + + +/* +* @} +*/ #endif diff --git a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/port.c b/bundles/mesh/inc/os/portable/IAR/ARM_CM3/port.c deleted file mode 100644 index bdbfdb7cc..000000000 --- a/bundles/mesh/inc/os/portable/IAR/ARM_CM3/port.c +++ /dev/null @@ -1,619 +0,0 @@ -/* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the ARM CM3 port. - *----------------------------------------------------------*/ - -/* IAR includes. */ -#include - -/* Scheduler includes. */ -#include "FreeRTOS.h" -#include "task.h" - -#if( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) - #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html -#endif - -#ifndef configSYSTICK_CLOCK_HZ - #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ - /* Ensure the SysTick is clocked at the same frequency as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) -#else - /* The way the SysTick is clocked is not modified in case it is not the same - as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 0 ) -#endif - -/* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) -/* ...then bits in the registers. */ -#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) -#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) -#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) -#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) - -#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) - -/* Constants required to check the validity of an interrupt priority. */ -#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) -#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) -#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) -#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) -#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) -#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) -#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) -#define portPRIGROUP_SHIFT ( 8UL ) - -/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ -#define portVECTACTIVE_MASK ( 0xFFUL ) - -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000 ) - -/* The systick is a 24-bit counter. */ -#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) - -/* A fiddle factor to estimate the number of SysTick counts that would have -occurred while the SysTick counter is stopped during tickless idle -calculations. */ -#define portMISSED_COUNTS_FACTOR ( 45UL ) - -/* For strict compliance with the Cortex-M spec the task start address should -have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ -#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) - -/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is -defined. The value 255 should also ensure backward compatibility. -FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ -#ifndef configKERNEL_INTERRUPT_PRIORITY - #define configKERNEL_INTERRUPT_PRIORITY 255 -#endif - -/* - * Setup the timer to generate the tick interrupts. The implementation in this - * file is weak to allow application writers to change the timer used to - * generate the tick interrupt. - */ -void vPortSetupTimerInterrupt( void ); - -/* - * Exception handlers. - */ -void xPortSysTickHandler( void ); - -/* - * Start first task is a separate function so it can be tested in isolation. - */ -extern void vPortStartFirstTask( void ); - -/* - * Used to catch tasks that attempt to return from their implementing function. - */ -static void prvTaskExitError( void ); - -/*-----------------------------------------------------------*/ - -/* Each task maintains its own interrupt status in the critical nesting -variable. */ -static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; - -/* - * The number of SysTick increments that make up one tick period. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulTimerCountsForOneTick = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * The maximum number of tick periods that can be suppressed is limited by the - * 24 bit resolution of the SysTick timer. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t xMaximumPossibleSuppressedTicks = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Compensate for the CPU cycles that pass while the SysTick is stopped (low - * power functionality only. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulStoppedTimerCompensation = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure - * FreeRTOS API functions are not called from interrupts that have been assigned - * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. - */ -#if( configASSERT_DEFINED == 1 ) - static uint8_t ucMaxSysCallPriority = 0; - static uint32_t ulMaxPRIGROUPValue = 0; - static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; -#endif /* configASSERT_DEFINED */ - -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) -{ - /* Simulate the stack frame as it would be created by a context switch - interrupt. */ - pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ - *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - pxTopOfStack--; - *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - pxTopOfStack--; - *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ - pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -static void prvTaskExitError( void ) -{ - /* A function that implements a task must not exit or attempt to return to - its caller as there is nothing to return to. If a task wants to exit it - should instead call vTaskDelete( NULL ). - - Artificially force an assert() to be triggered if configASSERT() is - defined, then stop here so application writers can catch the error. */ - configASSERT( uxCriticalNesting == ~0UL ); - portDISABLE_INTERRUPTS(); - for( ;; ); -} -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -BaseType_t xPortStartScheduler( void ) -{ - /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. - See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ - configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); - - #if( configASSERT_DEFINED == 1 ) - { - volatile uint32_t ulOriginalPriority; - volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - volatile uint8_t ucMaxPriorityValue; - - /* Determine the maximum priority from which ISR safe FreeRTOS API - functions can be called. ISR safe functions are those that end in - "FromISR". FreeRTOS maintains separate thread and ISR API functions to - ensure interrupt entry is as fast and simple as possible. - - Save the interrupt priority value that is about to be clobbered. */ - ulOriginalPriority = *pucFirstUserPriorityRegister; - - /* Determine the number of priority bits available. First write to all - possible bits. */ - *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - - /* Read the value back to see how many bits stuck. */ - ucMaxPriorityValue = *pucFirstUserPriorityRegister; - - /* Use the same mask on the maximum system call priority. */ - ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - - /* Calculate the maximum acceptable priority group value for the number - of bits read back. */ - ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - { - ulMaxPRIGROUPValue--; - ucMaxPriorityValue <<= ( uint8_t ) 0x01; - } - - #ifdef __NVIC_PRIO_BITS - { - /* Check the CMSIS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); - } - #endif - - #ifdef configPRIO_BITS - { - /* Check the FreeRTOS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - } - #endif - - /* Shift the priority group value back to its position within the AIRCR - register. */ - ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - - /* Restore the clobbered interrupt priority register to its original - value. */ - *pucFirstUserPriorityRegister = ulOriginalPriority; - } - #endif /* conifgASSERT_DEFINED */ - - /* Make PendSV and SysTick the lowest priority interrupts. */ - portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - - /* Start the timer that generates the tick ISR. Interrupts are disabled - here already. */ - vPortSetupTimerInterrupt(); - - /* Initialise the critical nesting count ready for the first task. */ - uxCriticalNesting = 0; - - /* Start the first task. */ - vPortStartFirstTask(); - - /* Should not get here! */ - return 0; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* Not implemented in ports where there is nothing to return to. - Artificially force an assert. */ - configASSERT( uxCriticalNesting == 1000UL ); -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; - - /* This is not the interrupt safe version of the enter critical function so - assert() if it is being called from an interrupt context. Only API - functions that end in "FromISR" can be used in an interrupt. Only assert if - the critical nesting count is 1 to protect against recursive calls if the - assert function also uses a critical section. */ - if( uxCriticalNesting == 1 ) - { - configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - } -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - configASSERT( uxCriticalNesting ); - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -void xPortSysTickHandler( void ) -{ - /* The SysTick runs at the lowest interrupt priority, so when this interrupt - executes all interrupts must be unmasked. There is therefore no need to - save and then restore the interrupt mask value as its value is already - known. */ - portDISABLE_INTERRUPTS(); - { - /* Increment the RTOS tick. */ - if( xTaskIncrementTick() != pdFALSE ) - { - /* A context switch is required. Context switching is performed in - the PendSV interrupt. Pend the PendSV interrupt. */ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - } - } - portENABLE_INTERRUPTS(); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE == 1 ) - - __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) - { - uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; - TickType_t xModifiableIdleTime; - - /* Make sure the SysTick reload value does not overflow the counter. */ - if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) - { - xExpectedIdleTime = xMaximumPossibleSuppressedTicks; - } - - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; - - /* Calculate the reload value required to wait xExpectedIdleTime - tick periods. -1 is used because this code will execute part way - through one of the tick periods. */ - ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); - if( ulReloadValue > ulStoppedTimerCompensation ) - { - ulReloadValue -= ulStoppedTimerCompensation; - } - - /* Enter a critical section but don't use the taskENTER_CRITICAL() - method as that will mask interrupts that should exit sleep mode. */ - __disable_interrupt(); - __DSB(); - __ISB(); - - /* If a context switch is pending or a task is waiting for the scheduler - to be unsuspended then abandon the low power entry. */ - if( eTaskConfirmSleepModeStatus() == eAbortSleep ) - { - /* Restart from whatever is left in the count register to complete - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Reset the reload register to the value required for normal tick - periods. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Re-enable interrupts - see comments above __disable_interrupt() - call above. */ - __enable_interrupt(); - } - else - { - /* Set the new reload value. */ - portNVIC_SYSTICK_LOAD_REG = ulReloadValue; - - /* Clear the SysTick count flag and set the count value back to - zero. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can - set its parameter to 0 to indicate that its implementation contains - its own wait for interrupt or wait for event instruction, and so wfi - should not be executed again. However, the original expected idle - time variable must remain unmodified, so a copy is taken. */ - xModifiableIdleTime = xExpectedIdleTime; - configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); - if( xModifiableIdleTime > 0 ) - { - __DSB(); - __WFI(); - __ISB(); - } - configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); - - /* Re-enable interrupts to allow the interrupt that brought the MCU - out of sleep mode to execute immediately. see comments above - __disable_interrupt() call above. */ - __enable_interrupt(); - __DSB(); - __ISB(); - - /* Disable interrupts again because the clock is about to be stopped - and interrupts that execute while the clock is stopped will increase - any slippage between the time maintained by the RTOS and calendar - time. */ - __disable_interrupt(); - __DSB(); - __ISB(); - - /* Disable the SysTick clock without reading the - portNVIC_SYSTICK_CTRL_REG register to ensure the - portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, - the time the SysTick is stopped for is accounted for as best it can - be, but using the tickless mode will inevitably result in some tiny - drift of the time maintained by the kernel with respect to calendar - time*/ - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); - - /* Determine if the SysTick clock has already counted to zero and - been set back to the current reload value (the reload back being - correct for the entire expected idle time) or if the SysTick is yet - to count to zero (in which case an interrupt other than the SysTick - must have brought the system out of sleep mode). */ - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) - { - uint32_t ulCalculatedLoadValue; - - /* The tick interrupt is already pending, and the SysTick count - reloaded with ulReloadValue. Reset the - portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick - period. */ - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); - - /* Don't allow a tiny value, or values that have somehow - underflowed because the post sleep hook did something - that took too long. */ - if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) - { - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); - } - - portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; - - /* As the pending tick will be processed as soon as this - function exits, the tick value maintained by the tick is stepped - forward by one less than the time spent waiting. */ - ulCompleteTickPeriods = xExpectedIdleTime - 1UL; - } - else - { - /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted rounded to complete tick - periods (not the ulReload value which accounted for part - ticks). */ - ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* How many complete tick periods passed while the processor - was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; - - /* The reload value is set to whatever fraction of a single tick - period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; - } - - /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG - again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - vTaskStepTick( ulCompleteTickPeriods ); - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Exit with interrpts enabled. */ - __enable_interrupt(); - } - } - -#endif /* configUSE_TICKLESS_IDLE */ -/*-----------------------------------------------------------*/ - -/* - * Setup the systick timer to generate the tick interrupts at the required - * frequency. - */ -__weak void vPortSetupTimerInterrupt( void ) -{ - /* Calculate the constants required to configure the tick interrupt. */ - #if( configUSE_TICKLESS_IDLE == 1 ) - { - ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); - xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; - ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); - } - #endif /* configUSE_TICKLESS_IDLE */ - - /* Stop and clear the SysTick. */ - portNVIC_SYSTICK_CTRL_REG = 0UL; - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); -} -/*-----------------------------------------------------------*/ - -#if( configASSERT_DEFINED == 1 ) - - void vPortValidateInterruptPriority( void ) - { - uint32_t ulCurrentInterrupt; - uint8_t ucCurrentPriority; - - /* Obtain the number of the currently executing interrupt. */ - __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" ); - - /* Is the interrupt number a user defined interrupt? */ - if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) - { - /* Look up the interrupt's priority. */ - ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; - - /* The following assertion will fail if a service routine (ISR) for - an interrupt that has been assigned a priority above - configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API - function. ISR safe FreeRTOS API functions must *only* be called - from interrupts that have been assigned a priority at or below - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Numerically low interrupt priority numbers represent logically high - interrupt priorities, therefore the priority of the interrupt must - be set to a value equal to or numerically *higher* than - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Interrupts that use the FreeRTOS API must not be left at their - default priority of zero as that is the highest possible priority, - which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, - and therefore also guaranteed to be invalid. - - FreeRTOS maintains separate thread and ISR API functions to ensure - interrupt entry is as fast and simple as possible. - - The following links provide detailed information: - http://www.freertos.org/RTOS-Cortex-M3-M4.html - http://www.freertos.org/FAQHelp.html */ - configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); - } - - /* Priority grouping: The interrupt controller (NVIC) allows the bits - that define each interrupt's priority to be split between bits that - define the interrupt's pre-emption priority bits and bits that define - the interrupt's sub-priority. For simplicity all bits must be defined - to be pre-emption priority bits. The following assertion will fail if - this is not the case (if some bits represent a sub-priority). - - If the application only uses CMSIS libraries for interrupt - configuration then the correct setting can be achieved on all Cortex-M - devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the - scheduler. Note however that some vendor specific peripheral libraries - assume a non-zero priority group setting, in which cases using a value - of zero will result in unpredictable behaviour. */ - configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); - } - -#endif /* configASSERT_DEFINED */ - - - - - - - - - - - - - - - - - - - - - diff --git a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c b/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c deleted file mode 100644 index 215a6a737..000000000 --- a/bundles/mesh/inc/os/portable/RVDS/ARM_CM3/port.c +++ /dev/null @@ -1,698 +0,0 @@ -/* - * FreeRTOS Kernel V10.1.1 - * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the ARM CM3 port. - *----------------------------------------------------------*/ - -/* Scheduler includes. */ -#include "FreeRTOS.h" -#include "task.h" - -#ifndef configKERNEL_INTERRUPT_PRIORITY - #define configKERNEL_INTERRUPT_PRIORITY 255 -#endif - -#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 - #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html -#endif - -#ifndef configSYSTICK_CLOCK_HZ - #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ - /* Ensure the SysTick is clocked at the same frequency as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) -#else - /* The way the SysTick is clocked is not modified in case it is not the same - as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 0 ) -#endif - -/* The __weak attribute does not work as you might expect with the Keil tools -so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if -the application writer wants to provide their own implementation of -vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION -is defined. */ -#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION - #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 -#endif - -/* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) -/* ...then bits in the registers. */ -#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) -#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) -#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) -#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) - -#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) - -/* Constants required to check the validity of an interrupt priority. */ -#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) -#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) -#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) -#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) -#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) -#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) -#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) -#define portPRIGROUP_SHIFT ( 8UL ) - -/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ -#define portVECTACTIVE_MASK ( 0xFFUL ) - -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000 ) - -/* The systick is a 24-bit counter. */ -#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) - -/* A fiddle factor to estimate the number of SysTick counts that would have -occurred while the SysTick counter is stopped during tickless idle -calculations. */ -#define portMISSED_COUNTS_FACTOR ( 45UL ) - -/* For strict compliance with the Cortex-M spec the task start address should -have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ -#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) - -/* - * Setup the timer to generate the tick interrupts. The implementation in this - * file is weak to allow application writers to change the timer used to - * generate the tick interrupt. - */ -void vPortSetupTimerInterrupt( void ); - -/* - * Exception handlers. - */ -void xPortPendSVHandler( void ); -void xPortSysTickHandler( void ); -void vPortSVCHandler( void ); - -/* - * Start first task is a separate function so it can be tested in isolation. - */ -static void prvStartFirstTask( void ); - -/* - * Used to catch tasks that attempt to return from their implementing function. - */ -static void prvTaskExitError( void ); - -/*-----------------------------------------------------------*/ - -/* Each task maintains its own interrupt status in the critical nesting -variable. */ -static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; - -/* - * The number of SysTick increments that make up one tick period. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulTimerCountsForOneTick = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * The maximum number of tick periods that can be suppressed is limited by the - * 24 bit resolution of the SysTick timer. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t xMaximumPossibleSuppressedTicks = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Compensate for the CPU cycles that pass while the SysTick is stopped (low - * power functionality only. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulStoppedTimerCompensation = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure - * FreeRTOS API functions are not called from interrupts that have been assigned - * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. - */ -#if ( configASSERT_DEFINED == 1 ) - static uint8_t ucMaxSysCallPriority = 0; - static uint32_t ulMaxPRIGROUPValue = 0; - static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; -#endif /* configASSERT_DEFINED */ - -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) -{ - /* Simulate the stack frame as it would be created by a context switch - interrupt. */ - pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ - *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - pxTopOfStack--; - *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - pxTopOfStack--; - *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ - - pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -static void prvTaskExitError( void ) -{ - /* A function that implements a task must not exit or attempt to return to - its caller as there is nothing to return to. If a task wants to exit it - should instead call vTaskDelete( NULL ). - - Artificially force an assert() to be triggered if configASSERT() is - defined, then stop here so application writers can catch the error. */ - configASSERT( uxCriticalNesting == ~0UL ); - portDISABLE_INTERRUPTS(); - for( ;; ); -} -/*-----------------------------------------------------------*/ - -__asm void vPortSVCHandler( void ) -{ - PRESERVE8 - - ldr r3, =pxCurrentTCB /* Restore the context. */ - ldr r1, [r3] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ - ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ - ldmia r0!, {r4-r11} /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ - msr psp, r0 /* Restore the task stack pointer. */ - isb - mov r0, #0 - msr basepri, r0 - orr r14, #0xd - bx r14 -} -/*-----------------------------------------------------------*/ - -__asm void prvStartFirstTask( void ) -{ - PRESERVE8 - - /* Use the NVIC offset register to locate the stack. */ - ldr r0, =0xE000ED08 - ldr r0, [r0] - ldr r0, [r0] - - /* Set the msp back to the start of the stack. */ - msr msp, r0 - /* Globally enable interrupts. */ - cpsie i - cpsie f - dsb - isb - /* Call SVC to start the first task. */ - svc 0 - nop - nop -} -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -BaseType_t xPortStartScheduler( void ) -{ - #if( configASSERT_DEFINED == 1 ) - { - volatile uint32_t ulOriginalPriority; - volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - volatile uint8_t ucMaxPriorityValue; - - /* Determine the maximum priority from which ISR safe FreeRTOS API - functions can be called. ISR safe functions are those that end in - "FromISR". FreeRTOS maintains separate thread and ISR API functions to - ensure interrupt entry is as fast and simple as possible. - - Save the interrupt priority value that is about to be clobbered. */ - ulOriginalPriority = *pucFirstUserPriorityRegister; - - /* Determine the number of priority bits available. First write to all - possible bits. */ - *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - - /* Read the value back to see how many bits stuck. */ - ucMaxPriorityValue = *pucFirstUserPriorityRegister; - - /* The kernel interrupt priority should be set to the lowest - priority. */ - configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); - - /* Use the same mask on the maximum system call priority. */ - ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - - /* Calculate the maximum acceptable priority group value for the number - of bits read back. */ - ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - { - ulMaxPRIGROUPValue--; - ucMaxPriorityValue <<= ( uint8_t ) 0x01; - } - - #ifdef __NVIC_PRIO_BITS - { - /* Check the CMSIS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); - } - #endif - - #ifdef configPRIO_BITS - { - /* Check the FreeRTOS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - } - #endif - - /* Shift the priority group value back to its position within the AIRCR - register. */ - ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - - /* Restore the clobbered interrupt priority register to its original - value. */ - *pucFirstUserPriorityRegister = ulOriginalPriority; - } - #endif /* conifgASSERT_DEFINED */ - - /* Make PendSV and SysTick the lowest priority interrupts. */ - portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - - /* Start the timer that generates the tick ISR. Interrupts are disabled - here already. */ - vPortSetupTimerInterrupt(); - - /* Initialise the critical nesting count ready for the first task. */ - uxCriticalNesting = 0; - - /* Start the first task. */ - prvStartFirstTask(); - - /* Should not get here! */ - return 0; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* Not implemented in ports where there is nothing to return to. - Artificially force an assert. */ - configASSERT( uxCriticalNesting == 1000UL ); -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; - - /* This is not the interrupt safe version of the enter critical function so - assert() if it is being called from an interrupt context. Only API - functions that end in "FromISR" can be used in an interrupt. Only assert if - the critical nesting count is 1 to protect against recursive calls if the - assert function also uses a critical section. */ - if( uxCriticalNesting == 1 ) - { - configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - } -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - configASSERT( uxCriticalNesting ); - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -__asm void xPortPendSVHandler( void ) -{ - extern uxCriticalNesting; - extern pxCurrentTCB; - extern vTaskSwitchContext; - - PRESERVE8 - - mrs r0, psp - isb - - ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ - ldr r2, [r3] - - stmdb r0!, {r4-r11} /* Save the remaining registers. */ - str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ - - stmdb sp!, {r3, r14} - mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY - msr basepri, r0 - dsb - isb - bl vTaskSwitchContext - mov r0, #0 - msr basepri, r0 - ldmia sp!, {r3, r14} - - ldr r1, [r3] - ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ - ldmia r0!, {r4-r11} /* Pop the registers and the critical nesting count. */ - msr psp, r0 - isb - bx r14 - nop -} -/*-----------------------------------------------------------*/ - -void xPortSysTickHandler( void ) -{ - /* The SysTick runs at the lowest interrupt priority, so when this interrupt - executes all interrupts must be unmasked. There is therefore no need to - save and then restore the interrupt mask value as its value is already - known - therefore the slightly faster vPortRaiseBASEPRI() function is used - in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ - vPortRaiseBASEPRI(); - { - /* Increment the RTOS tick. */ - if( xTaskIncrementTick() != pdFALSE ) - { - /* A context switch is required. Context switching is performed in - the PendSV interrupt. Pend the PendSV interrupt. */ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - } - } - vPortClearBASEPRIFromISR(); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE == 1 ) - - __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) - { - uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; - TickType_t xModifiableIdleTime; - - /* Make sure the SysTick reload value does not overflow the counter. */ - if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) - { - xExpectedIdleTime = xMaximumPossibleSuppressedTicks; - } - - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; - - /* Calculate the reload value required to wait xExpectedIdleTime - tick periods. -1 is used because this code will execute part way - through one of the tick periods. */ - ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); - if( ulReloadValue > ulStoppedTimerCompensation ) - { - ulReloadValue -= ulStoppedTimerCompensation; - } - - /* Enter a critical section but don't use the taskENTER_CRITICAL() - method as that will mask interrupts that should exit sleep mode. */ - __disable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* If a context switch is pending or a task is waiting for the scheduler - to be unsuspended then abandon the low power entry. */ - if( eTaskConfirmSleepModeStatus() == eAbortSleep ) - { - /* Restart from whatever is left in the count register to complete - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Reset the reload register to the value required for normal tick - periods. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Re-enable interrupts - see comments above __disable_irq() call - above. */ - __enable_irq(); - } - else - { - /* Set the new reload value. */ - portNVIC_SYSTICK_LOAD_REG = ulReloadValue; - - /* Clear the SysTick count flag and set the count value back to - zero. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can - set its parameter to 0 to indicate that its implementation contains - its own wait for interrupt or wait for event instruction, and so wfi - should not be executed again. However, the original expected idle - time variable must remain unmodified, so a copy is taken. */ - xModifiableIdleTime = xExpectedIdleTime; - configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); - if( xModifiableIdleTime > 0 ) - { - __dsb( portSY_FULL_READ_WRITE ); - __wfi(); - __isb( portSY_FULL_READ_WRITE ); - } - configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); - - /* Re-enable interrupts to allow the interrupt that brought the MCU - out of sleep mode to execute immediately. see comments above - __disable_interrupt() call above. */ - __enable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* Disable interrupts again because the clock is about to be stopped - and interrupts that execute while the clock is stopped will increase - any slippage between the time maintained by the RTOS and calendar - time. */ - __disable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* Disable the SysTick clock without reading the - portNVIC_SYSTICK_CTRL_REG register to ensure the - portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, - the time the SysTick is stopped for is accounted for as best it can - be, but using the tickless mode will inevitably result in some tiny - drift of the time maintained by the kernel with respect to calendar - time*/ - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); - - /* Determine if the SysTick clock has already counted to zero and - been set back to the current reload value (the reload back being - correct for the entire expected idle time) or if the SysTick is yet - to count to zero (in which case an interrupt other than the SysTick - must have brought the system out of sleep mode). */ - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) - { - uint32_t ulCalculatedLoadValue; - - /* The tick interrupt is already pending, and the SysTick count - reloaded with ulReloadValue. Reset the - portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick - period. */ - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); - - /* Don't allow a tiny value, or values that have somehow - underflowed because the post sleep hook did something - that took too long. */ - if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) - { - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); - } - - portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; - - /* As the pending tick will be processed as soon as this - function exits, the tick value maintained by the tick is stepped - forward by one less than the time spent waiting. */ - ulCompleteTickPeriods = xExpectedIdleTime - 1UL; - } - else - { - /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted rounded to complete tick - periods (not the ulReload value which accounted for part - ticks). */ - ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* How many complete tick periods passed while the processor - was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; - - /* The reload value is set to whatever fraction of a single tick - period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; - } - - /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG - again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - vTaskStepTick( ulCompleteTickPeriods ); - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Exit with interrpts enabled. */ - __enable_irq(); - } - } - -#endif /* #if configUSE_TICKLESS_IDLE */ - -/*-----------------------------------------------------------*/ - -/* - * Setup the SysTick timer to generate the tick interrupts at the required - * frequency. - */ -#if( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) - - void vPortSetupTimerInterrupt( void ) - { - /* Calculate the constants required to configure the tick interrupt. */ - #if( configUSE_TICKLESS_IDLE == 1 ) - { - ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); - xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; - ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); - } - #endif /* configUSE_TICKLESS_IDLE */ - - /* Stop and clear the SysTick. */ - portNVIC_SYSTICK_CTRL_REG = 0UL; - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); - } - -#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ -/*-----------------------------------------------------------*/ - -__asm uint32_t vPortGetIPSR( void ) -{ - PRESERVE8 - - mrs r0, ipsr - bx r14 -} -/*-----------------------------------------------------------*/ - -#if( configASSERT_DEFINED == 1 ) - - void vPortValidateInterruptPriority( void ) - { - uint32_t ulCurrentInterrupt; - uint8_t ucCurrentPriority; - - /* Obtain the number of the currently executing interrupt. */ - ulCurrentInterrupt = vPortGetIPSR(); - - /* Is the interrupt number a user defined interrupt? */ - if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) - { - /* Look up the interrupt's priority. */ - ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; - - /* The following assertion will fail if a service routine (ISR) for - an interrupt that has been assigned a priority above - configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API - function. ISR safe FreeRTOS API functions must *only* be called - from interrupts that have been assigned a priority at or below - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Numerically low interrupt priority numbers represent logically high - interrupt priorities, therefore the priority of the interrupt must - be set to a value equal to or numerically *higher* than - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Interrupts that use the FreeRTOS API must not be left at their - default priority of zero as that is the highest possible priority, - which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, - and therefore also guaranteed to be invalid. - - FreeRTOS maintains separate thread and ISR API functions to ensure - interrupt entry is as fast and simple as possible. - - The following links provide detailed information: - http://www.freertos.org/RTOS-Cortex-M3-M4.html - http://www.freertos.org/FAQHelp.html */ - configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); - } - - /* Priority grouping: The interrupt controller (NVIC) allows the bits - that define each interrupt's priority to be split between bits that - define the interrupt's pre-emption priority bits and bits that define - the interrupt's sub-priority. For simplicity all bits must be defined - to be pre-emption priority bits. The following assertion will fail if - this is not the case (if some bits represent a sub-priority). - - If the application only uses CMSIS libraries for interrupt - configuration then the correct setting can be achieved on all Cortex-M - devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the - scheduler. Note however that some vendor specific peripheral libraries - assume a non-zero priority group setting, in which cases using a value - of zero will result in unpredictable behaviour. */ - configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); - } - -#endif /* configASSERT_DEFINED */ - - diff --git a/bundles/typical/ING9188xx/meta.json b/bundles/typical/ING9188xx/meta.json index d490faad0..878f75eb8 100644 --- a/bundles/typical/ING9188xx/meta.json +++ b/bundles/typical/ING9188xx/meta.json @@ -118,6 +118,7 @@ "platform_write_persistent_reg", "platform_read_persistent_reg", "platform_config", + "platform_shutdown", "platform_hrng", "platform_printf", "sysSetPublicDeviceAddr", @@ -198,10 +199,12 @@ "sm_address_resolution_lookup", "sm_le_device_key", "kv_init", + "kv_remove_all", "kv_remove", "kv_put", "kv_get", "kv_value_modified", + "kv_commit", "kv_visit", "xQueueGenericSend", "xQueuePeek", @@ -251,6 +254,8 @@ "xTaskPriorityInherit", "xTaskPriorityDisinherit", "vTaskPriorityDisinheritAfterTimeout", + "vTaskStepTick", + "eTaskConfirmSleepModeStatus", "pvTaskIncrementMutexHeldCount", "vTaskInternalSetTimeOutState", "xTimerCreate", @@ -267,16 +272,16 @@ "base": 155648 }, "ram": { - "base": 536880176, + "base": 536870912, "size": 30488 }, "rom": { "base": 16384, - "size": 132756 + "size": 134316 }, "version": [ 1, 0, - 0 + 1 ] } \ No newline at end of file diff --git a/bundles/typical/ING9188xx/platform.bin b/bundles/typical/ING9188xx/platform.bin index ccb62fbb3b5fc497357625a646fe9203c4f9b02b..d8648ba223df185a642b4f217197ffd2812949cc 100644 GIT binary patch delta 52424 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�|Oyhr6^%!%Wd>6_yX z%mJ0b%eNixqwnL74jr4*4lIW|*hzCe9mr^@+ya;h`HjCrN<*91LWGU{HLH+W)WG02&Qnm4(tO0CR0@h#$N-8!-$MCqa(+Nwx%LWx8d<&f## zbwa(n4$oPW+V~p;YF={WLufS>md*Q;f>y(F;H!wcEyQc{*n{07F9s4_yX+$WCA8k) z_`w!x?edZM0dY=8`N{SX9(1Wg z5{zA-HPhx-g=z5jC4pA06{e~v^JPK8lnK)ZT^1C~coQi{KzS~dW1vi%yM%bvtHL*c z@Gc=y)goL{MYSPCS7SgVm@Ixm-{|wu85HX}&6okfWuxF6ym$nei`dh3rED{tJe>^! zqTmYPnu3%CtiWLkGt=fOvyxT)6@~y}hM3$H8{tJgUSfB9`Tszklb8R>6FvTl4dk|& zzTQL`=M&Nw`DZ~$j$QH4LyPg1C;AcYNIy9yX*;9`kx2;Iw+T!7$R1CBvUq4u0P;by zW(G5v(gCat5_>%S=fJ5Y4#EK_=2mxDn;vKsJQD~Xf3m#sHSb_ZKSmlU zgPw)hf=J@zYItpFSB{r~`!TNGp^!KzE%=lBX}&~Xx0ivOqw0x$DbO@)OuttxsgNwWi4*L$`j~b zMk8j$isdfb#7LXt>}7CXR6+Kzp2iy*wG&c;4K2{n(j|j%jG<0t zml#3u2rdCY=ID-sMc@mE?kHd4AgM;1)GEmDMko@Nq%#pTM8Y}QiN9{tsP6NW-LMrK zZZ}ckFiNQhE3M4X%YZL32x&|@5p^U9a+8}_e}3X6#N96(R@d68`qpw8I1?wcR<*!C z=EZZZdU~!GH(L{?j|BEY%)-!gh|7ZHQ5htULZ&NV8gT*6K~XF#HV4S#gn)lr%Ow2?@uOl#wMO8Fdq|8t8+rH{0jym&p7sauL+c91 zCiG#M=)RjE{ZILdhkr?wg74qM#|9`!(Jp3FV8AKDv_sY45EA&yZhj!T$mdk`jpxSS zuNz3e9l+7+SvmpkIIK6(e&LjX(GBJjsW{KxtknLEV# zpu$1JUkXXH-iB!DgK)}HU}4_{@S>+#dY*{idRk4ri9dO|iuwu1Z^%-oiWX>}f)e3x zD%vWf)kgKCQ+iNrD-KysEm=)Ds8YB8#f>skcy1wANU+4_xbGFaFPkO86H z=GqEgBsy#Rg01mJ0WywP!GKB>4S&N>R8KfWzvH+M-1z(kZ9+mo)#nfsAtO%#%t2j> z!#8F|uMBc>mBGV*)dg!Gx-pv>?w7gDFv&>&sjaQ$QU`fv;O@#z=NOQJ zlH`)$qO*p$B;Yavim4e6!{i<(Z@=|X+sG*?-+H8+cIxfnS=!))M_|xDoF0CfA6M8W zMLsST^=;!GFMioposbROO9G@j0t~P~4dSwo0mK2@7PZEw1mA>*&+^e((t=pWv=AdD}0am(hEyjI}-9=N?hmh%Yc`Q6S9&;>G7INHJBedVU6)^p_pfOHt zw~L*iZo=y`aLk|l1fi`baru_n^z$CvvL&;BuAkD$AR=yrQ&9lVPddocevb@|aOj>u zx<{Ph`@H;e{PUJMX=l8&OU67cl%c1Ea!YuY;sB9Z0saTLowAixe&#m70e;?%4{R+h zz6HJ@MQ|Cn!Ij)B3`8A$)Or#8GB=!Ppc68~MBeHf+bxA{{?UySwmnGI;>K;Mxz9k8 ze>soB+#A_MBJlpl&cEP`53T+W?>XE z+D%(w3k98hy)epjWvj_7@@YZjO?Knx?P=6wIB$FZLV`WQS3~gzP?}*!=x^z&GC^-3 zEIY_^tCWy?NKlEN+MYRRiD#Hy!zRI=%=gq02X&K&-|q&c-?7Dd*7~`rNl;nSfzq7< z1$z*QKij^ThJ#kzTo}BJ6}cEMY1Y!rV!XLIpX$Wz%>zb|)e;CO@L+iO`#`j)99Oo6 z!4&^;n}In3vOF4A3h%67juSrb;eQ5!14k%r#~A8ieE*JyXup_}OZETMCEe%d;eL~A zhn`Btu{#G+2;Z}Ffa+sW2b42Rc+zFw>gRt9;59pQ>Hh@qt2=Y4qxh4ZqpJkIO~_|u zknm)zBHZkxP<}(T%5bA8mh@~D$X|=V1p99Yxa{FT5KNFDrZBGy29&ogpB>r4^EYq} z&dJFDqp|Vkpm!zv{QQ&RP#5`rMU=5<4Oj@eLg!VRpP!0fz!@}f?G8L9!3Z7RcZM8$ zAlk{MP&j;7K9zxo>{{5L;E3ejC&K+J1z=<<_{61-0AJ&-wIfZKYd9MTbAO3X?8=ko zd9Qa90f!TwO-P7$gC^1+x#<2R_D>o;FXBf^DmC)_sQ^h9BfI0~ zUpy{=Y#@;$k!J-d7&Q?vL|XtAs2mzL*68LR2M+J%|L{k{b1ATKsUxVlgS|Kt4|+b2 zkj%{IXU-fBS(Zq1@?d~Ra9wJ)<~Dyt%(0MM!1<;QNI_P5D-TkQD zc>C^tv~U!+?aq#0aU`WQhSMDdj})ZWCOLTU$an9~%lPPsrR&%V&}TF;-0PrS5pNf{ zc%T3;#0z-f3#su3+$6JtYeG!T&6-tVtsvp?{V(*R+_>R|^z^ELf<-yG^>MC$K?noF z=x}+&de91&*0$kyUzk|(jE91&a~e=e{QL_7DpWa8t{gnfi2{`#4yb&__b4PWww2$$ zM9`*$nzhHUeh(9^;-2aVdF6OM*@NfqDNGML0#_0MRUlj#Fhe1|fE7%_}N##UPX$?2#6f23pKNZKKB zQOwP5u#3QYuoz_87;g5lzkJ1u>y{9spE#V<2#@~<3mV6ce#76%^$@O};LrA0KTv%)! z92W4PVCgg-`RcROS?qi@p6bOvzdA=r!oI_gJ;a{OjJ_!8vfjLY#M-e;d5ZdqLTOu(8VPsd2q10k>)F$H`=yp~RzjH3 z+>PU8IO52Hw8IT7 z+L@%C%trMj16R@r_~kc}sQ=*hHwH;>^H~DE`oC^X!;LFWXxkkgC0^-y8#623mCERuam|E6&*k3*5*&lFIImE>0Hip=h zoDE~-+z_zEP*0@v&fNyXjX$;Nusst!IP<_zS^}#&pig-8DB(JAR_85Ty=oabus{QQ z4yb3i1d(xB?h~k(Gr}sW-h4)QltS8Ah+NWKiI~#4OIS<6MKwpHF*2(d0EsA#=DzbN zG?Ybpt84W*tHxYrnh$B9(U3n3%F?PJPbY&%znMmTg!A4UPG9ojMQ`e8(5$w-nM*x_ z+ut0}|9(*POAWXAfuMxmeIST?gAk$$+#Au{L9BR7L$%_(xBAnA-FV7dLunX!^IN%; z7u(+&SWt0v2(XM0HWFDi$bOoY!`{kZZ@+TOEz*^D$a~OH9R7A%RF=CL)C-lP1sH@A z7rmWaHO`M*aXE|)H4~e&46G25SHMb$04D>d26>Vcay=*pu0&jyYVS<2(_LYeuasFr z=jS@!@pgLDlTdf3=4;&f_C4`u!Cgegfkjoy*<{$TVjS^KhLi`vj|<)@iFh`k)JS_G zz=PV1m%cMV`cNm?nRoJ4J%W|3xw&RR5t|OnN$}$H?~EDwi}zk3Tcy%cw_aYUglj*y z_{&}cU@FrSirq`##P2>53t^nnzc3?XqhQ({c;dUs+51H)!&usEkY#aGtVOpRmNqN7 zs!DTmfWxGwIXZxC@8&104~nV(A(#)}&Afjc+|vVkli#7YnwwWwg}2`3=ZGz~(3s7Z z7Hb$pN-gS0E)XCITLeWEH|ZEb#Q)Nvr9DK)sd#i-@_?ehjiQ9RDrOkv3kWcw>vBd5 zmV9umESg(`8{5hn39Y10B8tUyA;)lDXr`jLvcP#^7krO~@7-{_@|+K8T%h1j@SGP~ zpuPw+u@ofdlKoP^pqz{Mn;ul!<=h~@%Pi-<^R<{s=_xQQqqy_{k%Q6PE1<5hATJ4d z_iZOIOJ$8Mu1XDerX~wat&Hd+#whLp_%TSji{7>u{0pTph(rYM5nP@fZU0hOPo3N;nqfDrr`hEjPQw59*{r7sgu$=jLqj!;dOZCo{`HNS=YGXeJVFhwJV24V0F!*|gnoB^3`k zl#w{vZK}^_8BT&s7SO+7Op0s5^AE-6666quOJc)PxWg009SjCl8Au|%#edehw+vE1 zfxr*xQl|U#b}cBTcW#HC?*R83H^GO$IaJvAu3vYE(hYRb;P#?}r%?xRKO)LemNOb0 z-qM~nSm$&%rIFs+Wr^fs{1&^kXE#k{CBu*;Y0c%=*{G}($S9?_w*pGnF5zQTZ_l$y zd+O;lM&wVsb#Uqjvm{T0Z^Ap;CpVrveqIPuofPCM(2P{XOL&KX z@{Ol^75$r8BD{gO#~iq5IJ|S|h!^0r1+$wsmV;j`68+gtGq?LXUtJaI3~@JtzMND*UyebR6$M9c z79=%x>XdH)|0ebajy{qZ`>ZF3&}_Bq%OH1HhesdD%Kyy&0hG-4a@MZC$rlDjf}_3s z#x%+ZYabXgO*SgBd&#OdA4!Y5zi*H<7=*BvN;iJ*NM`;H7-d&*luj7srk}X$%WvEp z9Hloz9CtZk#-q7NO-qNd=l z;qPGRy;%k~gy51)+rpO%9c$yox9ZRcRi~;4Xqb&}Kn7SvEop=|Bt~ z-VM6;-Heai5e;=MaL<5Kn&)7$Kqu6sz!sdsv0cfHPM=EKs@AhN`G5Nu8+pDLoB`<8 z8wvybTdLwiem6092qQMOpX+m0tSe(llN4pm-!ElGkaT^Jf z6Cu56fNcbzp8-np@V^9V>#e|712j#*1rD7BcSzP>w`HxYW(NYRIupj_?}ba=^hOUQzkRUr=6&z>vyTn}^P86p-X?sARGpIDkzA=LYYXCKJK3%~ z>dET)4=)Wy-mDMlOsys9p!U;OS5rSHS5H6Ns9H2NXM z!LmpVy8Wi6raSsQQM)2RXSRQkPR98BgQS@I{1sMqZAjgXag)dyUd@|cnY6oYNpJH3gbi@2!il$eZpCok~{;FFCbs-ak7{Qx9 z?3cXsZ|}@cBHb16?V0e24~G+AJRjzc{;@ANK>~-Qp(8}$LYC~el+(yP!8_zfFB$HH9c;H8+nflpc_A?Ezfy znKptk*V?7K4L4S50=VeYeu?%ZvR=N1?lDN$vFEQvs1n%#Ui@jyOP>RiIm+T5RR$f)ajQ>9A0aTH$uF%-PbAVxPe(UJ&_b{G|4)5aiKd->lXBo+N03^U^0*q;&8G5P8aMY)%c+zL;FsuI#oDYAdNzNZZ zBLXYYnWD!}0o_>%XX7jU=4YvCWo}4g7Iq@WPPx(;xIzGogZO*^Pv3pEeqe=2oG3y& z2^_|-AxBXpx57=KRAZcj$^%Crn5lUz+T{mTb^E_H)KqN$cg8)DK4LdTG9Oz?ZHRjW zxHAc+r}c>eVuO(TJQ60HI|PpAcu3$PrXHl^X%xmtFzutxCTAocwRGhN1p&$G3$-Ag z1Tc+BF8J92IlbUY%=~N26c8&Ez$wp)g%(ePIMTy1f5bb^4j%jwh$F%g)qSn|m~mMO zFklK`AuL&*l??r+KtCPyYs386VT0AaX74SIS*f>~tPIp{?h|VWrQbCYSr17OlrU1x zkLQ0ri251t_&k{?vY(Gk{jWd;aR%Oy2v|cn%=8)df1Z<LA6cfRH8bG?y&S=0|r38NZK$8LE9me=S^CvbyJdK=~ zNbW!<5k5sQ`kmD(K=ej~u_WafV2OYCVnoFyw%+7R#Vl41YCZXlAV2)FO_^gJbs4uh zlBrv`)A3B=KVi2Nj$~k16@9L(NLcax&LY)2Knj8hl)r2Ed<6#4st#ySo-)p1(j@2L(s=rv_*6iB%e5f^-stF(5IHNa>yzfjYb z0IvT+&yI9Q7>Bb4^?8t1kz5G`xQI((Fep%l+fS60f&*R-@{jZju_Yo-243@3?gaNW z>~l_JZUk@^{Kpr$bb<#bof}GSNKHDoNIgR&vO9qy`GISEuk`66BbN~i3x9r2OAWz2 z=aQ2r`tP>9qk}ecIQIwccm7|L4u5^Va_SzD#J~|`|Bn%+Su<&wra$c2yZ!{gTZ=%M zTFqfko$9s5o&skER~Et1C+xyRYOnARWfy9wxBDh0yJjJADA=z@@X9Zf>8(Dz`O6LQ zchns63XV;llvCrZuQVhDo&9QP!ente@X;!kNOKiP^9ar;;^wck$~5t};L!NUSNefB zAyq&Ii0*(`R%qY+{8vGbL5Q`Al~#5@Rpf3kwG9EB{B=&@BOcQN3VuM2$hTYk6M-{A zb~E9ZXRb-%=eI~*8`Lq)Or692^PML7YUkdr>BVmHG0-s@JUU{wl zZ6UJxRPTBU!ttuNh4AM56?O0p1m7 zhHmEZJIcdm~u zn>2b!06+T82x8qIgs=0J_>XVYX>UMAXNdeP?I@>!rE=xhr9cE~56=EpM=Lyd(zm0i zX8g>zqYFX|LJl{1B-}XoX{x&q<`Hci9Lu?IA%?NQ&+54G&2LMy?tu``|7-24_8^64 zM{pZ(&7~apt(8YEt!pH7)Cj>AsxCH5qD_Q7|B&#wCn(^%%ULOR(G3^>v^w?%{}mW= zb?nKW7&0y z$&kQ8zVb2i_t`ad2tRgtpg{#Ne06-&wtMfr7sL<{Ze2_tEXyD)ol+7F(RzdW1~|E; z+$NZZsc(aynWCBVa1Y`J|ELfDbeW;{W7&5(MOT5RM8X6~kW}&FArg?i!LRW3Uwr0T z;sy<5w1B_cXIdy~72xJ8MH22kJnOrAGYAqOsEeZE;tu%{IygBl#EjBPTYLH6@!9VN z=AQPOmclJevxFNEFfEmEPx)QTRrZw9aPCXU-zR~@a4z8lX1*__e#Q5HKT!8IsQubz zr2UmaJ3)Ie)TbJ+)0AYw6u{{TuVoRr$PD?{@8Ng8&yV{{?4fVvrWy88Pj;5>>&N(g_hgztU1}p|}3Oqb_mfD&bKmLQdi0Ay&KbLHys$Iej z3&^V(6a0onz^XTyfEZSpz!Oa}ujq~$%kY7p(rEbl@TcOOE zj?qE#xfl{*+e{)q!!&l&HZt$>M+BMY@jRr9EoV%Y9EJ$@Y zx5JGz%u*@%(9DNWt`soefpQm${BZF5&Et?vdi`nS5IP`z_f^kwwRGU^Z*3*H3zsZ> zW8p6grwO*OaLxrcJyoz<%Y@Jlu7+>2d&h;){><>_S}ZYLL4R>@!)m)!OYy;LBeE9< z;QFXea_%M2f{|{7BZ>**2D)nxselE@G-`m;0NMDz8tWeSNnFY*2t=xEOD@3AXoPbQ zx+&&k!PYDzYVbO;(W794iBC$^t~7?*)NHwRvu&+)lkJoh!Ehw4Ny!}mZ<-3UJ%Y|c zXm4pxtj+{^K#sl^a(;5~sb2?A_(;^*cb3VIYfVHf}c)=RCid!gTn4kF^Kmt!25l0-|DwzB@^BCozDv6P_!!y63;jFi{>ia z`e2O?JRvf!8nQwuf}NlaO$IGlhJXD{ORjB2|E|p>H8NwfFir(O>*0{(5%y}SY!()T zg6ETdFHHLX==u_XsH#2g`=1?T89)#a@DA&ssDMjorUU3WxLa1XJRMwWKrJ*YatW|{ zYFScL$9C*x+4d5Rl$6x6vK`!BwmDV`YT*@^JNtaUa|f*VzVDmDbMLulKmT*i|NK{; zL~UzxZ2|;veGPs(0%V{1Gv5&=-RyeWB^lT2qmK&a$hJXB^9G`^x8R)0wHl;iZz9?e z4%y08t*-&o2$$@xRXy`-Y=-iTfMpKML}$AskML@3hN5~GsN^ktP44uDgkG_B2X-xp zFkYo~q4wvy3NtT&NYe`|FlQtEuDtV;v^2e>doIbc6DrbORlp<4&u3(>bn&C=a{%WB z`30DcE$JQ)qLD1W7ozp7K3m(%cw6n|Z~lF!i7hETpR={)pK2+9{c zU)kUC;Y0-_X)}_n5w|u678wuAZk8+RVznsC8ylXyuq1AFhzO>%CjqE`n6$YeraP%$q94~Qg|`}x z(gy`&&`<2g4aME@HmlMG-iOg>heCmz!gDSQs9>S#wF^dVfwkE+OT^YA(ARQaCWonrVB zujtF7hV+ZG>5qn$7st`V4ZAN6NUOvL4l4@busGG4KCLfq;cu0w+aje8{0**)LqN68 zxirW&+8vO;g}sD#N>ptn-Ni)ClI}hv0_036qO<3W>`}vCuEyqar(b2(KxonHF+hc3 z60WsM3!cAZ9nuln36-fdHYZubupados;~Um#&MXCG!KI>V$#ASQ?McGaysp8D7YLq zc?&SIrjN|s(FSWx;lJ}EH2 z2=<#s0_xBNT8Og`cH>B?2wKzpoWf3M(@PIEoWGJZlyB(8J#AgpLrvj;nuHR>>M#&W z!<3C70`kqWyrJ=B+b_{|5 zmT6JQ>aYN0*>Yu8Y|7?tS;SXv2Xva}fGZ!um1^l5cP-domMb^Kp6CdDvnbylSl_sz z4)$~n$pbvKZq*Q78>eLa(C~^YYaoZ}%Od?Hjd1r8h5q~I1X30rPHSc94FfjiTA}61 zmozMKPsBdl?4Dt~T=#%^b#Yh_Y`?OAa3RnT@0p;l2wJe?Pi`pp^b4O6P;`i2DgK~g zjVE1ov!~&8&uAdb&I*#^c64}#5-n@!=Nr-IY{5-dA!EQKl~mMlvu|NMuZf?XKKkp* z@@7N3FG)2YhDm(mDW{>pKcZr*CyE}&YWA3ya*oP?HiU700Ck{4k~ zhgRQPN;w56XV>4BLKw=q4&{WD^Ju9(y<}+}6!bn`O3QeO8ygA&{US0@A}=RWTIXt* z6%bWRJPr2+#;bI`hCP9l!LnCe$L&mswNav8`Vi!%@1Z89Zv$H5(K|y#SwXrU@`wiM zc!L&7(QOSm!7bs7U~m<~!q4_&!9rlA&xBLHYHaYCF_cYjJTsr(L>!AE8loEQ+c}nK zB=Ly*R8*vz8DQH~w6#y2Psna-Qi}%3#pbJNP`)#GdSO+oa|y5P2|qX5#>buCBlj&4 z%>A);3{o35w1oBuGQ_$Cs=IM z!m=<`sZC@f=@t0fn5K+HFx?E&tR&l98-Q0x@?=*y0fqU*|)AW>_f5EFV7q!oJWebAIClB$|@8-{;?3%U+6W3$D*PG+4SkEb# zE;rkxrx^;%fL{yyS=aSYu?^B2%&(`^m;~=Y)aVC|WfG+7^?P*$M+$CPDdEIl=oXjolrTLj)^CDx(}cl^KrG7%qXA``JTcA^DN$AD%7=(yrouH7aoaTm30~$u-2n;~ z3QEGV=W8rPH;Mx3nUghRfRP!bJE3fEkbYqs!ziO>v67I}^Fm4gYS~^-j3V<=R~^g^ zZyT6yQ2J5m2@S;xP+qE9F{Z%hb(oUS*9@gJj)aB!^OfhyRWe&N?RUf*Mw8Xz!IQK3eKanrH6e}+)rVqCm>&zB^pSY0al{f!{Ib$NSXHm(7oNV z+IJGt2u`J@pTPL3YL2o-L1a}g_Ep4yc%Gpi))h`E#@Ag-tGO23FWzqK5rCNFKA5v` z4=d_J*BAVb_VX5`r6*%ReGq23f|4&QDS5dO|5NHg_GdUHg{#n&aW39f_Ddg1jD5?^ zH=1VvuhlI^z)QHB86rp=)F-r?DBXi-{6sENhi2vqCfg(kRTxvP*Sm77)}gtp*bNbs zr7Cl?6%mw7ZuU$B-3g|Z-U>llb68tQ6nL(WMMct#h)bT0Jx%m4VU>}T68EcX8>9e+ zgF!H&ovWsLDR=8B}uaW$?Fs~^B9 z`Q#P;zf#t_ojsNCnc-UsUoBaDcCxvsL$+m|GCS4mwkS%i`3<|^CHPB71VVBqaI!im zCgeJ+G;ITw<(C;a-=P%+>3c9465G^}9onlhTp;4pIou^=aN;<(;WEjMD=+SY-$T}d z%R2J7r`+uwdZiQ!e5_1*FQ{by)tE3#q|%yf*R#=-Fkw!h2y&C5{UcGy`xx5S)xjC! zqpb00Hb}j+J^)z&FdCEF5^d_-Xf`pHQscq`dgs;c5x0D=JcivLOF0lo3~@O4 za_-#~!%%x0gbVesiievYP;G5l5Ix8;9>mSWD|3@+Rjr{hV86stqG6lQjMO;+7Ko)n ziev?GG$55Xj?X~^IE0Dget|%8 z4Cc7rGr#)mb}m`W?FSt0m{-lM<9X#r1K(hV|C$10&*=c5WrO=tPL12gH)Wq(?3EN5 z4kMqJ_5`OIvvSmDY2veL5Z6`lv%xJt1(m~PDJE+&w4KbpC?)3+x7rzjCoilJ@V@q* z9HCK;vBsez-@;_MUYg){qV(jpXmE)$g@>RWJcAwXOSwZHQO>Tv+Q~;k83zSe68#0% zR21?&%#G_IeZmIDQzqTcrpMFZYy4h~6NdFszgs@(Rbc@1(rv+GSE24|Q8>Z!QOJ!- zAz!l{@pN1G%RLzqgDf$D(x-gwigBu)o!h;#$sggYF1*+=;{i*P>hjYt4$Zq<;++Ly zlZi|5uQ3Sj^ZWl*O~0!ruU?w(WB*J5C*Ys#y#yLJTv;tj7H&`7D;seMZo9hwgm9|! z@@j7c$bH8^&pa>Jd0Bct%8oKXokV4teo0lOmnQFJH}#`Qs;nS;wI2-(w{$-g8@^eR z%f0MaKN?LFSWF__K%cOMiIfpO{nCff#F1pRmpzpTL|DtdNTj2~OFV*Pz(gHz;aI6y z*Tl77`Yr2&gm*)tHiBj}fnY0eNzh99-~d;2y?zu z(#z^-h5ow)4Q%f34TLl{V7ubMAyRlU- zEofm?$&{c3M_nk_j>v%#uufSp>Lds)Ku2W`7!P zvUI1$s>>w#g{uiq?@GkInNNP|v_8@W_CS9cq$=~V*Zb3u1xq|(uydrBPC@+wN*84? zAt;>yvse(qExe6_Cfp*ZAha+StX(^_ifvTU#)sxC>@@XK7lF@mjeMBp2>d0%X6fD> z%Lggn&BPR%RWlck4R~LjkOtzq7hG@ry!-*U7FCMo=6U(UU0l&EZ~D^^LI{7pr~=m8 zT@eL&0|bep%+uzaRY%3O?bEB;^4D8Z^6NUQ_kpL$36C$k^49~tjzbU{n1Lc*SqHoM zp%f4cT>}w{SNq*r;wZT!#Fp6ATZMYn+XP*iKGNO(XHzMA$V_jz;&>I$M`K1{T;q4+>J4qFdibs@Mg~ zyr_ZKWNa>*LZZoGzbKH&egQOTR+&aV3a~o|P{B7+xghP&7tkxJ+>wppYsTEjl)!9w;Y5++W+^y4z^ z=JRrW;5Ap@>$~LZ1Npe9qO>6<%2TDZu-i?Psp=nKYfMy>HQwDN>jKv`b;)jjKCmf4 z`rO+k`~B5g%~62lL^S~N2X?|lNvezh^O(p^-R!n>s-f-d$8@@x{<(8l21V1{LciG| zF5m*?o4~XPxebiiy2M2_>aX?Rnmd)e|FN;i}!vHiU4r1Z8bm42)S~5mmGkOZ*N^)kh2TOr-H_o z2;2TeNq~+J8Cv6*0wU^6&t^wNa$z1FFC3$G3YqZT0SA{|^3N!NFSXDJNfXo9&x0t3 zyiA)%*JvX>L3t`G&ZGXfgc_v7r2W%noN{W>H%$)5wvvQ)L3GX+9a~Fcz`8o;=HeEB zDLdENt`58p{{oh@*YGbKGQv+$s$yoQOTHVcl$XZ`sD?G?(bSsok9d+Q%L5ieX;{1H zFx$B<^RPg(Qp6Vgn{VX?27C~SIQCH}bC;azik!mDRZJ3`i}+b&=}syP!#aY1vBQjB z*C-9*;L8_cmmIx|M2>{<{2)sx8jB0&-ZS5!SJa?zIt(8SkXi2DcSf+LePhT^+sBU} zjzaJIkWWWYzJon9m_}r8_P{d{oE90{AiA-FC*oTmXJT!Gx+}Lg62`Z^Uk1~Vs7rFy zUeG#Bdhlr%?PbYBXgFo`1(XcVZQ_4@GdpV6@g9Ur5gzt*0b1o|%>^{HUqA(8 z`JTo*GRJUp?$a;j&P(6iB_Ctn0(u~PW-|%%@rTYmScua*Tw3J*`=}IL9hJFm)>TO9 zO27Z(W(mV6tspck1iV~}+f?&q;cksX-zJE&;Z(It9_Vj$7@PD?;wl5UjRxe~*ur5n zOf_7^o*zcZN&FPx2vj6EyP`#0#3e*{vK;o!Fv?L~TFR~r1C8+CZe|`%1I?SvE^MkSu{==KqJ}JJJ8OaH zvhv9Q8#Wq8UX#5t5qjzHwZ<+Cr#Rj;-3Y3so7vhC^ls)iL9X{xi#y$n_8_20b0IS8Z1zaHi5_I{jil$I;M-H=(gwVC93eMd13$d)fY%jmHI&BS{vH7d zQ}^mH(46B;AND=h6kn=FPt_4&1bV5)-GP<-?^6?~vI zR;|hm&TGofj3OFD`aF+)kzc-%-8hOe5|RSi@#15SCLvvW`PqA+s07wQbbviEiV{_- z0NXl>2I2%hJc^1{vWF#%rt#We zi09Z#qp`WyvhPMyYBHa7-oM^OtdQr|#R(N3Fx|C)yAqajElo{a@9JY!!2ksci_Kl6 zf{-d_JH6^*8?J?UoL||SV+aT!JAW;WqwCnvF*Fpo;oLEVs{y-r3=O0El_W#IfM&N! zdeq&7y@OW`%n%BECYz8oz^ZZZ!*VN3e2r|gSLQ={c>}vRhL-SooOd0KM~QD-hXaj# z?Az;T4z;quW9eF2$tuQzmia1sY%G;g1v@$xE3<<6$I^(@(ZQ{J9mTxlnlFSW3+MV! zX_5}po;dyw*}|reqroan?1SS#KjH_~IGU0ExR1jH>>nfSi!d5jT8)$rcB-y`Zp$J+w=l)z^ z3oVpOr`bjecAGERyB10^T2a{*d1}u!Y|q_0k6CakC*^qap+$YfwE-|{@^X!8s4(HV zKT9nkQ^W?>c24IKDb<4EVj&u=D+XDG{xBdkiT;qK(R3aW@AN- zw30nuLPKv_3^b1?j|I4M{7qx!WP>*4{$c6vxIS|8pYnV#yBe|R!rT+^jq~ptO@GJ@ zZk|%JMpW^An@n0M2j{}?@Pmcr9$QLP#x*`}!kzn#%^Qs}6UtmoaRZ=8ola~{b!Rdm^5&%lVZz<@(MQl?j4+`C65u0bFA$?DIxmh~3IUGb+uBg`yQ#R~1D@}^~;Q#t^8>5L> zOfRv5i8LxK!dGu9vY*2ianD2=997Um>*Na{NK%yjFtf3&$d4 zAM|b(vA{$eWC?7j4Njw9cC%GB8m}B+`1F~L#u#ozMkAlU@G?*>Utn2fG(CH8z+Sz% znk&3jEp=9JTgrtUW$c}*7BzCC7>HL z8CR7pp{9eYK=}5Cc;$jGp&&4+t(|A5FvfHM0xTXey0luTku?yi>f;0zi=ZEW`pnjbL*pO5s8>%f^bFzKNH zcj_69IRXDTi%;fQ%7^e-7F#kCd-Vmjc_zgHb#0zWb92YLUxQySm_`4H?u9ZgJp|W0Ebc}sNaCBPfSWpZ zW1_VlSo|FHm$~<;8upJHX`?Du#ky|9Rz85G-b6=7-0Fo`I}V9;V4$z7igog>y&9lh z>)9~e?pV;7p*J{Zxi&=m<@>>Y;a~moGL~~QO$bZv$vTV|3M1Y}gY2!@Am+WyzMD;^ z@Y_7UcaSIpW|$`wJ>VAHf$=)}7E0#Z>`k{&BmKeTTX6FJ$dYaaBG}<)({9C+0ciBs~QCU{9Uz`s) zhwz)Nueo9yVIdlL-59|ue+(Hu{yZGdb6B6-shDIo^>&(!{q4EisVw0&0GCF3E+9QH z3Pb?4%2BPCZuK!}Qr@KU`q+$rkR>M0%Ufl?+NvMf=6_H>W$(o7e)JDYP(b+Jo$QBy z(6P8TeD(^j{GM;fI;awf*3zx(1MHJIbT>KJu(>oYGLZFn=Wro$av}QtDyx}Gx9Cni z2Zfst*e`R*0@D^uw9_PNWQ**Ss`1Kuf^37Grf35&pZqxc*-pa}IK`H^9_^bQxZE+CseP#E(RDBSFs1vE8Maz)i!fXPH}^2yuT z`2{q9Qdsmt8a7}Zq#C#>`-k1rrPA;$dzUipp^8apXXOiVFY60*Z6VE2wV=v{R8L!3 z%^fsCb=b{5fURNudbb9K)K;*ZJ830OyMNtDFGYPGSPd4x*%1Rwx zYtjNTvH&4EuwAo*RZSH*Fa_zPS0jYOXMh(xT~5!xcjq$>(o%{?z7P!EAI880 zalXGu$rSn+@a_D1F;IN^fyqlSGheXyyJ$z`KcI;YpeD2R4}ihZyD)4^*yX$El&aIi ze!8111AX4c#RBLCD|;Z~zc733hrI&&*Dhw(Dq5rC6h7>C-&RrLKV}DGAr@y( zkFwIGbU!HZyO+{_%3`aRp;rm)g=LscY)r?N(X)Jqx$7RnEyX1`UthMh!fxOCm{{k4 z)dgo2;V5~X6LYvMNB2FzVvezl<#ZkGWaZ0g1gKSPInK=hJGGqd%oqilvg@HB?CN+F z@F~Kr_UAJi&8vz`gz$_;yZxnQj= z7UP<3Aom_9BzOdNvB-e z3dxY?S5o%SIuLa@>ki6E*mBccV4WzO1A;?D?QUZ$-^2N6@GEeq{0lq3l5W(wQP8SV zHfa@EqMvYaTs@?*)CpYixmA?g|0|ch1)Pei2uK(YkIA)fa}`mz(u0rK&#QoYgqp>{ znWF){Vm+|HK8i)H#=!-^8MqqsLcC8}4cR2TuUHMmE3Gug#a>=bqgCj@53509!j}Ng zVO_+M9|WNgcTUTLlvvOS0OZ(546LK{Q>>%ZTAzlx!4>%3sYQ5Mei4GKTt2N5B2uuH z#MVDZ{dKoMg|TxPd+R||j_}I|Y0cOyml10NLSPn>YObo)QF>5bv6oj9vh|_CeQmfx zbmO)@I_0UmotPDr@n{XD)WAx-sR}FYbx-J8HlVG_)G6n4b2dWkq}Z|pwRp>(;nHL^Vtnt$+l2dRl<$Z5@E*FHjJBeYT> zXw4X`iGq`yf>i#IDrb-4Ye5inf=0oR`9@s3h#PrR!J&yDO=m5S&_$JT5&QQ)X}fB- zhs|3H_DUUlVJ&u^c(#8n=w%qLV{1WY!L?!?P35nZ>u5WW@znL8;9(-I>p^h6i>+J_ z6rqy6y`Baq4B(a?MV&Ln7R<8B!R!w8490gWBKQ^#Lplp;ic;r1IK*`X&?1Sl- zYKs9qa+Wt53`0W|E?^J}k5tGUH{z)e(0`3I!>fTUbwL^*6gG9pll|xAWcOLw3o868 zU~)YW40K$<1>qm}33mx~P_yI1)hTyE+Ktj*wUFbe!-d)W_@iKe%>{`J6dqm4qYc?cFNP)lN;#T_%0q{+vwM*`~XYP`PA!%J+HAtO% zAp`5+^VB;eLe|&Y_166m0@3Hup-@E)>4}>=<)4B{HUTCd$2)pW__6d@#J2^V>$fT0 z;*Hvr9*MZmlsMyY5q@MgJJz$oPtZ`+;$>{k6IkS%*vcm;Y3gH01D?&*&RiR-M$Xz` zqr>tKepK<+_8OPqgJ^8-kOv3#U|Sw=6{&^2NARyvqG(ThhdhX#e1hVpJqzQ*VJ<<6 zR5+f3lmuQ1?`R6nvJQFeZr({_GrT`y4!?18Xvo73+##<3efpbr5_mNP)geLpsAcIP zRNY%2t=P$hH9!21~3IpQyXV}ilT=l&JOioeA0`I?HuvQ}BV0tP_ z7|doq35snxyYorPs)-JC$Y1!md!N}&kq~hT%CUjV9o*KWA)mMJPgfVDfr4;w&d-w$ zxfLzsB@+$J0oDK_ihdL-hML2mL9MsZ`U3`a}>T+VmEQcZD$Ts)~ z&Oa-6_J;-6VEPeojRk2W_B%Aye_R;`3|972G&XInpAQyq$_7`5JP$GsKul3&u`-ct z%~K$ze8ZZb0%TXR|2zfC@eD8+pQ7xMrT&PP4jB3f$8vuQ%RL6moyYinXXJi?s#eXP zg7bd|5P5HH0A|q7&mL@mc%H%E3)$e6#d0_fvUeLm1;4<)XaETT0Nm98w(HlhlpUJj zr|B-oP#E6iR%hYV7sE1~ue3Td2JO_ng0S>!0>A|2#}(`RAv6BroU>7}7#ujkf6`G` zqCR9vwxmtJ5?pFX<|Zm^rN&mSBp9lL11v^OKI>!Ko(9uO%Z@({V)zI~&*1#YW&@s~ z$?<~k2wVjj>>}p198%8)XNSCp)jUI4v2S`w>`Lb=>letao$kO$fA9>A>3>?j0<}!u zR@gw80=k|~e>CeZi+D!9hebY1{c29Q9&Re1_V~7v?!4JwT9+@GV9m2Eg&M#aIDHjz zwptr?s-uMD>wS$HI_j2BdF=WXM~^9z3-`5Iq}mCC2WXyo2GSDT8vHXLxN>{&TkqD^ zJMM0Ftr0)jUT1CJt{w!!`Jln=nNBSPRughl+WK*cvE0m>_I}PET}4LKlVM=DMUy_a zf4l0rvIo}d`W^ku6|wn8mql>P4|$4gs^^UPSL8c9DNY{Wd3S#xAHOz;qyj>k7&MWeD8$7Qx zIkmAz?p>liYtWj}?-PNNZjJD8X004>eVJ-uW4cle#!l%wCV z8yV%+aPbYde9&Xp(NUNDyhqg6T%PnEA=wlD2_2E!F!~$$Ny;x89EDi094H!J+SsnT z!c*EHQ3`J=tP&zIRkIsMRyPS9o|qT^Br zM1zeFzZM`VB{(@@Db9JYX1iJ{+!GEwKrNl!6J`@~$)Rd1zO=7g>onnC7*n?i_#-<% z!SE9w?+dJhG!_F!E&_i%p1W0tg&6!>tfZ?)x~K8SJ@C8(hZ^g*Uy(N|8@sj)tMDF` z^Wo|Zv-YK^*0B}OQC~`C8=s?ong?6@3hb@tXmrh!%C@ADmb9So$)&D*qx#%Fp+qU1 z`~2W$lf%m*Zwgn;pOf;PNt;~1U;@zRJ04L8jG(wr`GA_p>2po-}GJ{ec z2-a7hH7Hvx)th%4$}DF|Whndd&UUD4O}|uCntrLOM19t1RF&>W45T=Mf)Hdi&jT3- zbvosp64#HsK22i>n29@|r-Jy>-F+Ih&WJ{}Gps41QE*1$(^Be`w!dfu{Gu+3x_GVj!485Vfct#M_1LC*6|?9RU)meq^-TPcS3j2w%SaIoTD z(ol6vUuJoc5);>N3fTZooDvODu+t6^+$ptG?PpalQf7(NDmq4tZ!Vc&hhL}*u!wP} zagnl{OJB8ea{>qbjg{Qp@|Jmgw-f~M%ETFAp*y1%komKp9eWX`*q`y=ml8eX%Ha$f z?9uv7w!Zml=`sHRn;GF+f2wT^!iW6*Z8H$o_*vddG+g(nUoAEJ*&Q!Y_D#IpBYMCk z%I2q45!ChX_eV{E07*+E${g#DP|6(b54Sn(ee=a~!(<4CT`Sb9FHBKIn8JZ0XShWm zxkVPWw4&9H^337v*Ow?gwPiO~>fo2XM;7(N@)fdGi`O)Lj^q2Z{5CVaOc~Kf1JGU< z8|_g}J0hQAH@r-x*RN<5F#=6J!;s8@y0>@i{g=Ty`UD74gqr>OGFfY8gbU(}XzPF};nRxMe}LG}{H`Po(%^G7MMz z6xa`_6O_#j>V!VC~UFkdf6$gI(;y zS0D|_*o9Z<+VI1QJux-J!Pv+~nvycjC**PS1=n+{s&oKmRW^6pRU&%%0z|bM=?>M4 z0@H1#{Dm_W80PcGw@;Gyl?es$ z=pTHLE;EVJG2isWL>zkBJz>UZELo0u5qn`XF5XxKdo}|F0=Lq+nX=9E z0=AavmwZbN$oNmM+9?8)yUZq5ePt zk6Z<;^;J-&Q&`8Vlsf5C&tGLgmiWzl>=xGoCw!`1$CdCLsa?ro=*e;Mr-xnRvA}_9N{ubNbXelgR!fq%aC(u$&;qQSjoLyPQ77H;P1TM^ zpuvgZ^0LY;pqPBf-rhnZ(zbY`TGY~MSCwAVHvLlFQZ;(`jGNPoq`D0P3v8kEG(LU+ zJwelM={{AUMT+~-zALWZE7TGc-^RX9g{n_av1PB*O|kq`QrU`El%*6e;|qN`u^(Qi zG&;%LuY>V;4;%ajtc}G58(Xwa{W=FEX;jjiL3YO*G*A3bFmL?$3Fm&?4J{kZHfv8&GlwnZmpW8+Nd&&t6pI&EOFiyzcwQ|+s5!R3HA#))#E%Mv5 z*A-ibG@h2@;q~X5aPE3o4Qq=OouSD4+waLn?(hI@-~4bcQmNRex2Rlo#Lr%Qi_EI; ziGB7KO}gId>Em>OXkqizt>Dgqbl_nNsi(N0RuhlU!Bw=YozqD`yldOA%`)W*@3aGH{$Om{6SfO*u1yNY?}l7%?pGsd5-^$d${rLGT5>mUyH$>cno)| zOMCgGaYBT8GG+dB&kqao_neWx-NoZV9v~vIy`7Q|_}HPh>2(z*c*Q&PESU8%??TRw zC)-fLmc2{2_9^<18ya#T@$>9I@6ztRV_=1atVhp8!Gq|(mvJMZ$o=}iX=MDW3PFs9 zclk+=)|Y61Bx@vw<#l%9-=Gs9N&0&-|%^stxTBWrA)dkeR&J`uc)U5io8qr|SfM)ACi9KLc=3OeMwg51+*hg=n$ z=-^Ck0VV93$YZVtz7z8F`Bz;=We^KJW+rc=-0&xMRkiYu!YDSdi9W+k?m`pTbAXKP zG)QwwJ{M$;?KCCgl>A9Bcjes1Q}W&*+qa!&g*_cKt(=JWdX~C_ZqTi9{~@>f*?l`e z>P8Q@@1XA@;qhlN{*2A%WMCIhyiY?S>@G8SVjKz%xY)t>X|bkL7IrZZ@rtm(mNwIM zs!TuI)=c9yzoSa#YNo=Qe)86BH&-^g4j9die))vkT$%4WFrZ}JOiNvD7GjRMQ^k`V z6&NwNM|4GjJl7$Ad^Jyhr1&(HXK3BJNtTk@M8xcIv)T{HqQK4V73{MQs4;qMPoB?= zB2pBydv}5}HHv{hcr)))_fE>z{0S$WEM*s^<$vhW!70I?@-mO+!gA8vY}gUuRs`I$ zH-Sy_L2cX}DZJZF!g@crn-^H+F1j_G$MXSs#>>9l1<7QT>*)!zTPQQ{0iU^2sN@d5 z0BH&W$#dk5QsDxj6T_;%&mg$nK%8wdv&04WaSR)*(ui}UqM zf0w`Y*JI882`OD}x)nut7aKdc-#@FlvfgEhDZ&h<_@*?$4-ir%LNSGh2?14oXGd=3 zlP(JtwW!{r?&26Y?1FzAmj59oWGsV8-|=nc2h2_8%CFOnreE`am#h7`mB#d6;V{r9 z{4URA6(3Un&3QOecI9Pl?AI(P-PoXjSoSh%w~H(r1+>vk80DlhXbu# zGGICF{Pja@+#oT~9#GmbKxun$$U|J#x(64p&pmA09?Fk-8>&l|$Mc)scV`+OM3JxW zys(GrNOj81mVX5HE%JT#5xuS~Gk(Vc3509fuL=!a2&d73=yr`8S_6hVB^YlyT>};vMtE}Q@+N7gF5xJe8#V`=2pLpss_8v)#WSKmFU_xm+8{y z6qr-7?A*+?p9+V^dY)8r>9F4)Y=1&|hF(w$i7*!8oi1hc!9DeU-X3pYv(nDgAe-|s zR{0>8*koR(gB)L*pKbb>?5bCQjlaul*r-ov z0?lPLpHTl%GlPwf?&2p8%AO6#t+{mLdpu^`rSJZ&Gc{Vzf$=Rh?Q-=Mg0dZ^^1It| zS5}~u5$y0MRG>=oGu;8Yt9Na$IDlRE`y#ge0ClQf3$PbIrM&*517f9M5-vYnbz1J@ z(^ReAZ< zGT2}9yI84zvmxIPk4}%cBDUqO)4w&xb{0PUmi@lT1ux*{gf_8q8&sliK|@db-s$)r zgrWTv<#;>cW3>nA9o3IMHslK!DJ{RJ)I`{xu6g$P%TWQV?>eup8}qqORb5&o$!d2e0Mu7zw;rl_VGvnxJ|&9_wml2{TjMy zkF)l#L&v7-8_LV++O2^I4JRCMr7Itd7)HR`#~`b*`sNg$e2rgcErQzYFm~fNG_ghk zeu*WC4FG>Vtbjz0(Unbt1%uT(7fS}T^`CsZ zs!daq8_^E+uecc8Y*iI8<4sac$#ltSdbGUOVJPQ!R-Q=>yHpz7CczvLPs`(X>1}mT zgsP3Hv)4I_mGBHOi!cjskRWI*Tyu#d33I0&%z^BX;e@OD$vIPW)<;}%wJP&9haIc7 z?%29&)9yY)Y6=dUS5@ym;_9p3rym5XIv$r=>|CBSq|fm!a6+bXjE1LG0`dZze272p z(p2frS%rP)J~Ms}y3U)RaC=>v%a-M#OR9LuQf0TFStUBkFJjQ_ui?un_@lK<%U{H8 za^%nNT%|Fmw0-8)yX)YHpA7QhXiw+AeU!roW z&EL!KwLogt=9eL}@z)OB1n=_1R))#Ojlw0uy%yw4b-w5NI6*XVDjK<&OF|L%dI`QB_L%jWteE4f3A>V!k z4f??q0lS%>w4nmyC{&|?NjE_}jsiG^F1P$RzB|g_gx^y5y)_9KCwO<2hhj4a_JyZ` zyZDrFVjQ0yWom+UVP9~ZV8Hzv(^SLf2^K$3!GC$u6wH-gE95MXX}ct^4GNKEhHe2On20zI zoQjvX8tb;p(`x1)FPy^pSsVzxP!;+x_?!H!pM%vKpnQaYO2oA21tC?mn{AEdxs%N{ z4qS-~IedTOT2S}T9YXp<{gCk|T=o0zOEbbY5QPbQ$6$I#jeoO5d;Fsk_2Dp&AonZv zY`3KB+YU;Y`TXIE#6>fPamXxni4mW;#?)@wIPcp25`|=t8O}4^_ptM$*>tMdR08CXr=lS5fC$c}k zp&N$NqGCxTnlHe%&IZLbxW+=0J_hrmYGMj5oi$MY?lXydpwfT&c&A?YO->84`fo{` zvj;>{o+9u+DSl0XTUzlq*&m?#cU@uj$6b9a8CK1dfk5aNI2_i-iGkLG|DU|C_T)Vg zU{T*uvhIkIjt%*a(lg%y&_ZdiGy#UUxz`;1m*Fq+7THraSy3Ze_D+B;|BghPv#0cs zeGm<#+-~$((rULqQerqH0wIQ(Z{+dixUu)gz*5Tdceh5z*Jf*mA!Iua8mJ-^|PQSc7ByJg6TcdM}p~;{NnBxkp|KU_$H+ODo=&wuHJ)C5E=_v;1F;S zkBb!@1`d4M#q5V6JM_JatvXD3>3M3tu+?_;g;|2ZUMm`L9M)=ayr)9|OFS!I^CA24 zFg-Q$P7n&018O-rvFh$+%Q>R^rSQEBL7(mT#`u?r@~3yh6YHinaJUE_vApy|k}W^0R^2JMKi$f&s@-tysZ# z2(g@#Y*%|M_&47(?`rD5@~K3zT&&oq?t8ScqRCN|Y)CGwu%y-0m(XDt+&^whgWt3? zqqDIBXJSv0G0rAOW5v|cfyvuptgbX=a_Mu)<>kCmQw2W_Oyz>K!o7`CjmzhK!1sPW z3&!SOWxY3giqRZ#m}41+@%1iAZK_u2!`)jR4HVG*DCF`!s`0k;rjfcz|<;YVB~nLs|(x9k6h z=51`{M7v&+HHSAy%T=oEUnpEJ{*9xa2Wv3V{DrIaDfGQ7-xlam$%TLcn4M@%EC|Xr zc$!oI38qk{g7My4Xeb{ymk*JocFPra0Uxjk>2n_1rH9jSK`0wPWrBcTxsw!jKyTeu&4wvjtJAT$(mWo} za@=wy-lRePxPa4P9`CgCcK&_*RW@2wmO}G65|AmdsP8Gi*eiGVbuiW|TrjAL9o#tC zlOQ(m@F0|edrROw?5(wSyDI#X?dwwxZcoDEsbV$XQxXPgD#(W4)A$-Mkc5|j`oVNE z&SbGlFWSouV4xt**m!}2>1T^!qg^oa_b}bXBldEQIik(dof8v_rdRvz6&eUGOuw{g zX%yb8{4i(@tud$FUQV0LkjMn4f5{F^pJV*?VzR?sJ0$w-_Fv@}fd#I*rB(R-uU(BV z3z6?~9I(*ZuY8S*4K0m}u&Y9!ddmXJ49X`V0ml2OP!$#8@=;~Y4fDUl$F%#Hi7%l% zKihSjh8X+y#C~Yv02=9MSB_Jm4L4lyKZ=_BKuScY=Zr}~8VWW63!-_q~g- zkkia*!MxumczL%S{UY#@r()Ncutm+3SUFuxy(H|&p>^r_pK;tV*IZV9n zOKX~dx6Mmc&Md6L(ijfrFZia2Lj9B`Zs*%7l!A(y3sXqK(_Xnf$S(arqHZ-fOMWj) z{*gu+{|(+xCho|vXADzs9xt>1NRy@&`aT3yzWf%=CZ6t!sT6U2eWlZ}v4(-ubrUc130Q^tk}&)xp6?V9F0He?G6}BU0GHCc(1#iOcm5cpLUdgIU~N!d=}iX>3Vb4vuE_v)hZkle z{6TrTmyQ07l5Z>bYTo3`nD4y#5SaAIt6?s6Hvr)X96t@~;Vs1hYn_Td8wCwqp}d26 z_Q|k_D7^va5cTbU)%+;(i~>>`7kHk>Ap&oT?SY{SjkCfvecXpXpkxD+s+7{sMwS8-U{%8mrm{g4Zv=lwS6* zBfroP+dn;jwbRnQxcoX4unHz$3cbBkwY0nlamzeKe5wq+Q}u_tanY`(GBoUz!z*uu zKIaL@`Cf6u`wgFhhcufEO{q;fXHfpbouf>}STAJ-Ppl^S;F`z(QZc&yLZ{bW<<^&@# z2riS8@~nH@e}{3+%(2L{9dqsQKkcDMMuH8KQeUlnqz(Xuw^V!z*mmZ`6OB!L3z56@Kh{MuQ)o z<-EVL1E9F0XEf%4ILjA?7Nc=Jgu1 z2cT(95z20La^|o`Z;f0HJ2;81ISMqv6g!401~Cgga5xqG8#LAb4VvoVP%RjOrX>(* z6Roj;rsRMi%~nQeE6mEZPjVWw=Bh<)GB4*pJQ@u!vU76A4X(?73p ziw7ml`#WVBJ@S3L4c*gBMzokmII9Dg+rUv920-cp6#}}3BO1?QvIbU`BH`>9Ghbo|u04v?-wzR2c$HOH!R<5)! zO+kD21seIe)2BHmi?24Gt-Z}G{>CrdKI+KjtJRItg<-ak!a5;OtI=5}`ej@2B| zGhGLiP-n2x4k%{rgGtQ}O0MBac+LFcz`5&umU4^xp^kjTfvg?_7!Omp=0%ikZyE)w zWxN_^WvoCYp*9sgQf^sL#*N=-qA-W7meuh2jsihuujS;{@7?Ho#Lv$E9(>*k4KN_?v8c|< z6)M(Q&0_dVUYylj>x|oC$rNC1VHOu1=XM@}+q+rR8Qcouus&A70s5AuDzw<)moc$_ z7mEntydHUeFb0#l4L4PFy{0~d0mDn25BRSsO62qjAtP*aAK<@1Xk|O>h9=6?I3b!5 zqer=8{CWs+a6H$JDVw!qnRvr}^Mwnih`oJ=2F*$K$D;7sCN$9jGaEyUKLq82FwP5T zQXATYbg0l_S$+;=i{EVm8?U!s?%=*QD=;$4+!z0+$-IgSxYGQLKf?bzho7Z-RgDc2 zUNc2ONS~wAUl>KS`^q;U&gs1mQfwIE4JY zf6serPpFO%l;0|Z7w}!%H4vAc8lbA3_znmWYu5l0-q!;yoE*AB6o8@^m6XUQjy1D8%O@?8bWm!p{*FB8)}+ z2!y-=BM~Oz{ThU3ghf5!D6u9q_G1v?M8fNO!m$X4AmKQKxd<%?`5YA^UmBVb-IY2=M1Ee?DbGWEc>i-7MBakK%@eA=h5+fDW^L&jM3`X}n7vY&t3r{mjOiz!&v!BhBVX2u% z@wF3&DE=FZ;;>05Nyi~ue9yB5!;*k!-mGGDGZRg`_gw+&NvDGcS0%nw{6B4-U2GIp z6vxk<-GyD<(r-!&g(;=zqI`>hfKp3o3zSkyQHz!6iy`_#ghZld<)KJ5L{YHmLmvog z1jU31AwC!dLn4XB@L-~en(#m(K@(I^Xle2HpSex;fla!f7M>@VxNKUdkZ>ce(JizY_{CXTch#CXUh{zb)~OYY`)*y_*9q} z`0A!h@f58HDw+G?Vc4shGh;&*GS+RWXa*?byI6 zaXB;1bAHTJeM~ni;xKVlGd4_274sv>x!Lm?Q8HC=2Fk(?d}0iRL0`Th%bB`5)hDaN zVXG*d|BiVf5oeRUR(Y3}h#V+m4fB$2haM z`za~a$nTvQHmO5)_~&QpctK>j47=?0KKJ~_^Q!dOUQKWpcX~ELwfoQOjd~u1pSA?{ zT}wW&2S_+cOGk11{6o$Z?w3EzOLJlE5`M-9o8ct*EcGR@5-Px+m`k9BgS1l=y^LN3 z+zk~0PeKL1_N9&pny}m|@&~*EC&Iowg3{HICWi?LJ55>H?J{L;sb1rv43}G|h{6kR z=QvXu>xCH+eI=AqcA#W(7Q+;`4lZ`4n00Xx54V6abSmWOdi;+L1E4~1z7vHIp>3YC zI=FCwvs(BCoC)_p#jl^~K(VVCL+W80BUbP`LOTV%r|3|@WfXnIi4*jz81XjS_1-w1 zqi5}~lzP4Opn>)smY89EC@6~`Sf&vNR=Zr^f$d>Lry2)(M&0bLKU!Irv9d|O#EqJa zJ8MC50k`GMD5H$m7^+~A1(*Dl)eMI5$NbT`|uBab3$fS?`&_8e8JiG*I1y#Oqsj^ z_oiN}sQ!QWSp(cT%JJ8d>B1=a3J!71wMH7`qD1SXMyNGShWcpDLoCsHCkOe}k{!It zzk}e;TNn$8y;UcHn zyU9iVbQpd4(kj}^NSvd*M1uf99@_W4#F0?sfKRGuH;uc|K5b-6ivfC^xY!RbEk9 zlUotZ^ohaPr!GPH)ZzE#Q>3~>s^_r1C*LtU0(JV2Qm>`xhx?TfaGL`TS1@aQQ;C7~ z+S^JDX2;%AVleAQPwUQ;`*3zGIxiknW-#l0N14H_fpQWS?^C4VTD%YcfUmJ5Ei})+ z;cPJ+q+TI!2r6E6!!-QyU1b(_a9EiOgV5I^@_DEQzvJ(K*#d2yNo=V ztEpzckQz1U@y~V2GgLU!kO=0xT`zLc$R}J4=Cu<$DI1`5(yn&$8x2 z_+ofkh|A;LuZCv34LBkqnNr}Kh;+Kcizh_H7rfrt^muc1*Cn-4$-UI6?lR4RSi z&B9g7=PsSIX4Tx~tF0?mttpsKCQg-wcSYoD1owb0c?)SG@-H7*Q%IwMz5a=ER>{5K z#Xm&Mrsw-{N#vKxJzEf?&%_bxf{=Y~iXj-lBdfke=eTicRF+boiI|tR;>A&8@E1`f z6V|%xEwY_Rd$N~O%T1x|n6zpZSu`Bu3vNMO#V}q9#!Dz|q2xxYO0|mIKLJ40Z46_( z9%Vmred3NI*H`RF<)YnqYP3OFR)^5IEW9;3EBeiQ5u(P@V-Po@qrdog^ceM2Z(W-F z%Ez*AdQrN_hq$pOMpIYnJ=GfmkGw0F9n6aSP0|q68Qt2fTK^u@5j7Q-QuyaTUZ_RuV#|~ zhrJ#-8^PA8(V)xSXM1VtU>}MsXUDSi4SMnp%1wGi4=3FZSR@O)l+q z;}e<*$(`P&9r}v;{mq-5J5+}H@>LHR=J3*iczf!>SZe`|)NP?G(#yJ|*hDsno9D;(r5UKvcw5@cx(u(4-O5rr zhRtF9e3XcE!{K_+Th87M*G{jT4QET8R2I@5WQVhXS|QLT5{7$s|MM$Qo3wgWs-5i| zTUB44a`v2{ucx8isQy|-{s8PNo*?M4zdQ_@ZSs~#ojrzE4v4vPy#z$Z=1J7|^J@R& z>;{%*L!oAfKM3vyo9ytU)Yepp{PV6U?7i^DhYt-%x|j2jdZ=I$JChCj0TA*KIDYWNH}=2z&Zil(u7bYuk;I06exNtdBFCHXuks8$h#4L6&IJlBgb9D!31hASAB}sX@8& zZb}zom1~up=diW%6uhUaOlG;3HYvHqhsiT#L5Qxh_m`RfDkE@SlHiQ#hciZk^Ibn2 z)b@CbL&%^|gWhSu52nWq_w#*Xm!L#8g{)C^TDdQg+wNBGP3Ag8ij8feoRmGb$-j|w7c6O@$5my7GWnrbLL$-|2s?FPM_|1*3RwJH97taP(f!g`NePVeEW6!s&Jy_ml@e zpQWL$;*KnB;S}E=J;T^{1a4m%IP_*Zo>QUXVS5(DQKiV~Hlw)*9suwll!*RwLpf z+EuKA`^Nkg1^#bB(EWk#!WC%T}=l)>$d%v|gl-cAOIAM@fxv2UCOeA&%_7>cDcV zG*`ZEL4!_r!~JH$eFJ;BvPd>Hj+L_%o5n`h=z%d(eDeG-hbrIHT?~tC93GyNch4@b z{N~0rhMQLU*ejL+LJ~3$c^P1)f!$3t zUjt=i0N`Cr%nu%@P$T%mMGC z_Vk6Ih#A#Oi`Y0A<{11{ZYnhr|B^L%Sba>%1ghZY@gxW-Y7@nIqj5>v%%gfQ2 zA3=;0sP#UGCD0;94PfIz)Z2hKZZCG`B~s1Ul{bL;94Fo5WuRi1`c`pptHMa$p=`Em4WFa9h)gIbTT=BLUN zxSvF<9+((C%B!!D>4O{^Cm~W2x6g%31`e$w8W0&B=qhHStB`wj8x3GHfTNTSN?T?n zdXySUzB#DwQn!V{T|B&_97lzWGNLk3Ak|1)A^|CoX1DLxx5-&l6T;H^2oN1=Hi28^ zBQw!7fT~dGEUb@ThOZ7x%6!E|~QV$`7oO|ks9LbIG+|TV;ZHUz*a}}bh3#BK64wTI4{cw+nmP@o>++_Hu z&VDeND~F%)U=5SN)gMHlX2@CF5+ygqtA&|X8$oI0s@oB|0ZpuJVeqs|kOSKquSKbq z+&r%WsT>V37$1My&9JY|2L+q4c4=ACZoDA$kap^}hIExKq$&i;1_{BY*mO##szRw~ zGN%`mRSMHMD2Od2-Kh+SOKZ0QUz3JtBaB=ErEmAbGXZ)xAS2yN<(hV(zq}I4g$&FV zmBQk9wCG+HOf^HM8w*8Q#$@hwpWF#Dyr>!|am7pNX_!@_86(EiL$qT;mtq)v3ipeP zX30j18c;f=HCLx_Jsv!JuqNY-2QlWkh$-$0R6PEVinLVmV-J3Da9ZJ5k9lq}(7F)p zF<2dlnrp2*+AE7D=l~Isg1yaCi*-uisd`Ke8BWc|BZpM03w(?PwNlIpodVuu`|x{1 zw$fdPaQPkU!aoq2w`kHAvrQJnCE!o*7*==LtsW=SA#IbHVv@OE-Db1AFN}&Hd`3;Y zVOxOGb!>2RuqlP3fYLOhE+lVAsiIkFO6G2f8o<*4<0m%C>2ZJ`T!;Ngp&*mGjk1*8 zKv5KkgHRvRk@<;YX-3X{4w|+c1sSb)<alB(_>Ky?~LJnKeaTj7DxRu^W?qPQX zh?pQQP7LMFy4Bnke=HZ|L-{fXffdQE$LEKpriJ(v?7Mx}?h1Bn2WlV&^aT($WK)Xc z?mLV%ccxL-@bEj+b0b&<8^KY&B<@F#O-Y}I0Txoui8oMLqRGe8LL78zff@xqy#3C^ zx=5hk>z)$W9uX7AedI-r@>^#nH{CijX~TXBO1ivB+(Hn5BEL#R1LY3VrvO&jqeldw zNr-X5nrbUC-3;%_k<77&HFU}ubETovTIp{~V-rBOu>^{14!i|j+IXYw_hk_?^L7{4W zjU)7@ralD<)vx*b+$F@_xPJNC<;#7SFGrn6rTQff`A^aMYDbKIVfRJnJ#~6dck!=h z1cY9$8O=5bQ`DCM^lIPS+CI3h@a0&VYU+h4=z7(=f(!-Q?d37uITokAS(u7)EV^|b zeZ6ouBl|wb;$cXc-qIpWRbPU(lYQ6zYNPDdTh7~?gfG>9!kY@;t-s#Xg#oyx)QZAz zHlFJNeM{tnJv2MF_G(k6Q>Y>xWLc1rVltJgs98Rq_gRTGH$CU$I>iV5XH)z zA?F`-CY=vE|2uRL>(g5rgjvXV-57QBx-Gg&a|KF+eP-u131Y-w5NFr*gCq@Rt4ZTq z-to@sQnldj=DLu}lhxXXjhDOCIhK0i0d$x159wVHnLQbIFUabzaArwn=qyw9hRY9|4L<%}e1Ay-eTNsXEy<#_ zUi@N7e%;0Mh*SG0Flc0)+*jK(ueQ17S%CY9CjiIoLHeg1HX*8INso-X?w4^2@qwNu zQ0kuO4%Fy{8jm^VuA|n>f^wyPtV8`1rB89l^-bMQs8`Y51PbuCQ0p#-&Cpz1W~Hs8 zdqO}djMnd{>t=vpPkep8ruM)F==Q9qxQ8^_*ZsO(HAw$8VOMlzv%*rX?hyIM+?Kft zlX{yz)X{zaU z8qa5)AAbIl^Cz&cO{1zxMo%9-A!KSvrlF_?p%eL7H?pM8JBUUWaO*5xIA_(uxeMmZ zd+>n=7OtAJx_aHh5{CR`G9S!m=C62g`5L%GD8umY`VU#E*DRc~w0iZLf46~ApbG$d z+=}^gmojAw7OYyhdUZZ?_nNtD9$a0*7-|R>B}^T8Q^I7fMn6Gi>)iQE7Or8|)LIv= zW-<*!08LarWzgt~Da`5zt;E+PVKZ*@KORX(azJX0W#R48g$o#{^1wpq3gFCLwUBg2 zV4Z?Ko`DZ{*tOw*4R!^>RnFv&oLQd9IX;`1o*RU80+;+Z6)M z_S#J_Ur)JZ+$0Z~C0JDGsPg3LUc2#Ddr_51#vS$i`r8meHixj5#XZmdiv7GjV+*kc zrW#l~vcujKd$N~S=CGwud!I)^wCNqNz!){OnCMop+S*~z#{xG~3q3GLuN=i&M#R;r zDo~$|atOQ8XdyUK^|;bW`Y&4wPXk&66WVKg={Ga5To%acw(ie+TK6*m?{iP!`l*|# zQRvhAnK#zWwK{rHwEW@GTTjBCE#o4^ON!XjvbVLY4*E`WpJ%oK^lbvwvQ40k;eE0s zN)H0;m^WB!0kAK-CA25XxYb?whmktv7eLe}445u0!V5|Z>b@2kR^1iDhOn@~vNR0z zy8Ec)VVnvSCkiep>+LTa0yCj*v$uq?)zAm)mG5KVTJDvd@7+XidSVd%?5^aj6xRb1sVVqN0l{gbOrr2B zuHvo@f*p~nuu4OWjVX=7$NN!6ICy;JS58pDSIVd@noCJ)otMwVUB=WQQ+$Z|uxAJm zfee@iPiTX%6%l=mJj<(sEt3VuAlf{}Qf}U2sRug&07sPRiUafsP~vr0|2zSWWYA>H zQrg@qnAG()Qk~F;SgUeil34<_l+CDH=#ss}Lx1>gak$if)3|Q%Q zy(9f)_x+<@TYuT_QoX>^d9%N4#2BbZ90?IDxE#3&q8zCm#bCu&3ZS@wOE;v+%ik}y zl?Q#3!xn?`$Cb&r;q8=G=y~8l^Hw9rAoGSm>AQIIs9`w^`vH3a?mwq#=553R)69vu zchp^VGR`2C6V5mREr?Q21J~65gYhVMRxJo{&;L8YYG|+N5}^IxvO*c?3&=^r2C)}!1)R4N;6Nnq>Yufcv+Ff@&=rt#|)af2WCAKlMXn;SJErTB zf5&t%eGs|?@CWvKE2GCpvaj~#s%<(zDSU6`U~p>es7zs&!}h5f7Ui&9K?t^wX@ zx;hPbc~yLJy(D>Q6b6_DczSZbFvTxcX%b_-`c~U|(7urhn4Z|!@FS!7x=L?geL+A% z4ho8)qq?^6J|?X5k`-;cR3pt65dbtd*e7qXLY)c&&K)x*C5{^*((ElwNXvo!!@v;^ zGf?U0U+RkEGdr&^o3}Js{QN6kq`l)j zIQBJh+%jMDHtG$ui(yGy2oZRjw=ry}E|Ht<8r&1=)H!)4@ygxfKD1xEW3h%{1%bx> z<8<^_Ui|I25wy;SW5+WYJ)Y(*@#(}5;OB>XODovXKmN$TA`jLz_mtU{dlR`?ZaibW zq4<~&R;lAaKQ3wr(&T`zCXs6v-nppVF>l8b&1(#LI*xn$U-i5md~|#kwFdW$&x@Tc z7+c%GfJoJuH-j4w8b2oBtO;o}f@tIfmj2v>w@)zAL*3XhAwFi8C-kB;1)IrcsA6Ne z6zrOiO$A}?#1wjw2bWIFr+@L`mb(-2rirn1n;Snnk)aO;N={9TrlVc>(nJmYqz@}6 z8R+#sTs*0Wo(Iz~DK~kjn|R$2cLvsowTn0`W2HWf(0o!>%(DXG4oa_Xcb<-WC*@EP zIA(G-{gD@sn4G1aDaiZGh-`O0{=$*x^YN<51?A`b0U!9?9oDW!a5@E5!S2VXtg1q# z$z)cs6!$ySP#a|?FYkgq5<%E>;4XxI+e$oUu^jj{f0=AZG#<8skC-b{vS)jhH5zb; z5(;btU+m08Ts|dPP1^m9_B=0MI>kU&f!#Hwh#us{Ur))W60taCAVuMUci%x@^Z=nW z*midWeNey+cc;-uNlBI=flCr&BvRZ7YH%-zi`$M)2{Q?WK=;a*V!0*@bF=#CP7a*^7M(_3}C(A)x6_qn!P;g2lDhL zxVoBm9E0jjeg^dY5&qy7X%$Wk*ZTRL?dD~2&g=sHyygR_v)zx~Q)?2g3C?Y5oowH> zOF`(BZ7*-hVU>&*eCu1LrO??O__b*n$tLk^PZ$iuxeYatD&@CmO2vQ^!i6tP)6=tE zIAS^zwOart?f05ePs_LneAo1u?B4baXn7ltIPSN0Jv{4nG;axR34sj`JSKcfNAADs z9B$A5*YmgS_~+^IhVdR#PnI*vsd9=v1^=qBq22JW=Lg&4NQ@-o9)|wFgV}p>3t~CH z7zPeEx(U=Xi!5CZ&Rr9zv#tJYDqFD375Fp-fUOaBb6#9@CH_eEpp~ZVMN~u(QZe|<~naNNz&YQW2{!);5 z>aCeY^j>mXOg~O8vAAGXa^hX!p_M_HC9(BMM(COjKZcFr&ik=>Ry_TL3)jpVN8o-m zt00kgr`OE0XIdB9=$2ui9st$KVmaY34!bv5{j)oXF<2=erMI5A(DBfFGjuaOXM5w- z(cBENt6Y92we<%n*2g-j^vR&&d-)AMy#C(ggf5@Hqx=>{k)ro~=GHQnfw39z+xMnx zn|ym)A=t;nH*P3bcPpMrXms9kMxi6dk-G?*opG8-DuAl%goQKoQ z8N+@P&i2MZZx_6Q86z~L8fL&i<~a$X5uPp~3|%^~w|v4k?d22CKy584&%*yPC&i8R z%Mkd=^M{`)b9VF(Ef4QA-%sV@pt%F-Up;u}-072y0?Hf?=2wXjXP(_!1hkt0w7bXk zf6I?$(5}%FDw+C+`a6Ir`)O{5+{3>mV)?uoqufFe)J$n|^WTVr{*T!( z0K{n$#M`qm)DxJE_xd3k@JsWw0C1d$Ps|&a)FdE%f}=}_K*tm@r;R~Tr|Er007BuM z`ROExGhu!jy-L8#=j-T`Uc765ZuCoFX~X<(j*-@c&;ymeoL@}O_F~n7ak|D`h?xgI zB5)PWpR;WBBH}n!52H~F`IXS9X*gcHUH|4-$#g-ato@+cuNqRK3II2M? zp~^1XnEL$z$2#Id4iOM4JaJ(hp71~{Ui?5)5CYFcG&decEy|-icj3}S1>~}PQ5Ly8 zwPwe=5D+G7vO7;7c593!g~Of=Wv!i*($ z!dOtFo%2GNO%SX>T)dz#B^tc^H80sxl~r=6_(SI;fc;M*5(2ipgAin7Y0GSswQS`v zFfR~l--S0=hETZ&-nZ0J)M;F}I6LK7XDM_a2Hi(M_oy$C8lx$DJjy2W@8Z>qN7BDd z#`_nKkSBID?!wm=kGNkBflg#Gwz~P90uj*%C6m_8?{0^rGo6+t*i8t8)Bv|yNc$j| zwFpUuCirc9eB;LBk00MC@^&5MrEqcos=uwZKUXm9X-8t%UQkSkfzENNKy%A3M& z+6wO&76co<2(tOy(#b_DZZv6C6(LnUJx}O@AsFN4KLf6SWG+7iD%bz=G>z=T@w{cb z>lz@O9L=3|bzKr+tDwdlhbWV^l28qVY^9uu;>P>W343iMQlaWgR1UE$ZFSm>n$7#$ z1s!THPx^)|;b8FV(coeXbM6&%4P>z~i_2=Y97DnE!_`I|Tgk9d+&}KKU5i3~p6Yb@PzizfL)%HrH|GeA$M9zIijd|0lUK!I+c@=~|u))vE zht_rWqlYpg*`zUAb`D1=i-agcUhBqk*%_sqx}HAj`TbQIbOrspw`^~6p%EC>TDNs7O z%|@_!SmJnHwQ%BUW?nToYz;*ZGS#b@A|5&TfyuRYMMkVwV8Gus1u_T`L_OgZ zvBln5Q4swh1RG-wHz4i8YD8SgAt?TH#kcyiE^f#$=QKh7<|Nj|tK0+JHdjZV5J`PM zkrRRqNn^m)aPgnH@bA{dAs1Z2kR&I4(g5x@7yq71JtP{QRGdf~l3e^dF1SM~ry+?x zSl^VG$7$$IW!_LI103IkSLkBd{u^O z*C7&pi_OH#SLsN#U8_oFpYo|d6Y%ig`jEE5lE)T7sI3V?Z63behxC2jerdGC`kf~^ z6OrUhq`{FW^4~*rT-6rMCAcY8)#TzwigTqp0f%EW7wX2jtBrCOA0y)BtEc2HR);{X zi+=MzYB3g>wn12oz&(iw%q3zmA^YXkQ}4VF{3XSm_Y1Ke;>jT6v9_rpze2%Y&@vVm ze8346yFpl@rY#$UU)0F56j;aU zBcc~^ZyXGlYK22BN~(n{wALmpu2YNrBuOeFZcj&`@}xrn&Y@8!c-sOVJdq#ZQ;(xr z;4jw_bp%i+-7npvmOk+=bvI*)8?)3>;HFiIkHR@~|2rKTb4w}2tj!f3dw+7#K-Tu<=Z3wt-XBW~A;%ETTPkzAM z;B9LQfyvm9=dabqlV{jQU$&s>P^(b^ZBJ>D;G% zde#c-5PlL)>Ne###&Xo6ZaoSiejCiUoXmHB6B;Q^l$OlW6lty&!(53l7fbr_4J>t& zwA9J?ME(W5ttKyilxGNw@~=TC6)~U82N?qb7_j-WrY3J!*A!*Q>9VbqPRkjovJJ=V z15IS9LyWttN~6j-@*@f4knrbXys|c-ZV96GX%ME{+daq`s7D`uzV$b|$TJ{TUU1|> zEIkS6lj)7ulBiF!m$)lbt{7boyT3=|MSq-gcPokFk^tZ@_CW0j?|E?ct00M}OqzEh zYW{2&c^&Wczp+VK36fR>i_y2i!rT02K}Q2fQKhx5cZ5zi&%_ z-|$Al{p*rG5&?HFckThl7KzS5^e<0}yvd>9dHB5xg>`-r-GJ)}_+>!Z@9?_;zomt^ z!H_|Xv~mVLDe`+nk`*y71E)P4U;3ku_=L&yQQTdJk(59}JSHxFsEdNX zgTV{q;!U6qKn4-qjp~4nt3Qnk^5EA#Je67QQaF_+5@}O3x%fpcf6w|X#H?7cEOP;f zwu%gV`QZ$WSD>||y&%vT=KV6Q0=AuNf*$^UC*a&ih74KeDei#07F|T4ye|R?{6dea zm27;0UCs*mS27Tc(XC~$IMkAO*bQm;kLU)KOBJn9(b^@4DkxXxkeMj^7L6Jb%)$K% zo|@-3ktj$Qu=rLiKB83@y2`HEi;TDGsSuNg2S=5mj?uP(I|u@zQf1PJ=sWR{99_@) za^rqN++@76E{6WE8$VWOsC&xY4$-ij8dZgD|6aI5+GEoYHyC6Hu}K5{Aua`s69r_V zDujUGO>Za3Z9(Jcnsj?q;1}>+N8eMBe&GY57 zBPx;aA>=^lMHq`L%4DoYda&jI{r|LEE1T?ix~+(QaTDHZE2c)^4{TN0yCLh2MeWM__8XR*0R-9mZ`0B|m>39$bGHJyyVL>PzUCUAUz_o<7lqKdILbX$N8u zB5Z)f(VgIJMV#5K1S=2nE+OGj;fUeno)sJwWNeLgma&;l0)Jh^85@}R@BMOAcg*XC>WLBPv2C?bKC-{hN_p`{ARzLHL-4f4x}uQ-9Hfk zJ|<2*Fb;f`0-x&Q2cqx!%&LBPl{jJJK>8&gW;e2QekR_&(M)d;Ft<@dkAuS&o8swf zew?*w2K}KQ+cqWBi6VY}6FUGD5^2k);V*@p+elnf4h~on_4M<+@b)qdps1Y+wR;3z9Tw) z$GmMZCIM39S3y526ajyOQFvbn#FwLCr@>*5>5LQn>V8j{$j6F7uw+LR^@kq8zG4tj z*2_U%N^uC8WJaObe96J z5HhP_f9Zi_RphX3C;U?iIEPh{df{FY%XRaSUIklk*MZ_B@Pc=*y{Vk)*0ZHum>MZ z0gOMp-F&GRuirc&?2x~(e-1CX@wc1D#m;~XMKZj6Fx31L5tl&*H`M-wCdQ)zzlNKS z^U&#|EpxXmWIg7a-25`o&i;T^HzE@!Zy6GFzt_CY%ctULTLvh9 zgrhu-MR?toQa0R6X-k}lyWjJg6Eejo-7O7Zn>$*}1C7C*lleT8p9dH*P8X^IKd^f-bs5N< zFm7vyY^u0mffZlk*#OTiunsyAYd;C6P*PeMiEj!;w=@k%dHo=N0g8PRZyiG!?vTA6em+ip;{Ig6hjuEMM};!Ym8kyrX*LFv+I{JZ{@!{Z{u60;st8 zKRA@>NV{0F3YJP09)@P`cR$cWh63TGpSQ)2G{LRBN>wB3We%f8Wrd)9B?US=DfhRf zO2o7XC`&EjQ7u4vo-hKLTFu-1{8?PMJtlP&0PXFD10Naa$TVRHvb8F%oCqqeHMjct zRy=omwvrHb_ZGZ;dvb&%W2;n<6-o$--`k!x=vmjDty(r7X68v(HE~|o0}p|$33EJQ zJ8ApUTra3?DJB>Hfk?qj&{(!(Aq{J5@s0xNAee0nesPD62KdK!#+D5c)UI~!^vuKE+R zsO-<2^1UwpsvjrrG*FXq)y{!b34Um2p8BAlY{pvgVW(xAk53ix{+(HLu!w)ynMK{i z)UJ^Oc@X=#tOByHOjTt2epxKPre0;dRv$%LZiK8q7e7U0r1nSgl3giO7T&xoGc(eU z^mR7|{a3cv$G~OIENa9wY%?% zO>%)Qk&T>mHVL4Ux1am*n%z3;27Y??y|E7A_Um#sqABIUOec@Ibj7p z3ruJbv?})FXP+ELO~*Y?rr%%UCLvmq+D@kC*fzO|=WqH*a#~;l9_dO1aZX}HBF_S! z<*=au;sPYisvTN33MOkAh;tWz#v1|mxgfLU4x)zO_fZrwrfY(c(ryo2YX@qoshs-T0`uHP}7H_}FO-LSEMs!&EwEd+u8XB(tw7|aUC z=+>s1z2&NJC?*Kzg@SlcBPf)TX~RssF>zIJv%p8;os9#iOx)U-LPg<|jY-rb+|xKd z{D_N!lX+TDJP3c3Jrfgq#IqJsAzR9C{X__*0&>202wR?EA|kn$k3c#$*yB8Ss_|3L z6r@yvh$GmM2|yV^PQ{f?$Y=>GR&i7Cxo5J+PIqZQOf>aTNM%hip&DC|{PfE;j6DYe zEEiqQ8cS<9iFi8^;5mI&IN&+brDvPL5`dm7$AfNaymo(45R@0<$7_q{-lrd>Kv z$ll^(ancJp)C@f81#RSYuhZOQ(RUziF`QJi;MFgrXY7J3aEISKFEEQikU&DH3}e5; zFlXt~`7m(6@!$*h#hFE>{#_v)Y5$|DFluc3wRJ(oJUDo_8%a+y@apC#axy2+EbVo4v-xL%3R!&k>&Qvt)p#(VI#Py zhs)+3ugz)IaYp+1N*iEftt^Lop$D5^y^qAF55HP`_hNTqYd90t0t<8p%Gf4^7^%H7 zZVo6Tk92nlay2Z7D-^R4B--Pk)2-=_*G*=_`x4MieuwzIkf=T>M5#Lj4P*+&fwmh8 z6v4RawL$Wm{7w3N$aIOcNBDhaHxaoBbm4v%q&!acH@a5N;_*IfnieXWX z+(9xQ6WN=5<6+F~HA5`Ees2o+B3{^=uw*2h^_(eW8v;oqjg?ZwbWQ}fvvW-C6s7$1 zEY=LEW^&JOJxDhb?)p5=o+kuz{VdST=hfJRIa(mnO96Ixex#J1R(Vda*$Bh#BPPn|@Nj7vCI81D0uTWl;~}(QggRKYZ{G=s7U>I93D1qgf@)umWayl1pio zue{C0`wrq4-%2ijL1+NYLG5UQ#r~;(Mr&vlutnx%AzNK9n5kxv;xsqXhn&%wj2$%) zTe1uc4DfJziPRD{LhtUkGWD4k=kqi^$J&pAwp&yam*+M5N@D za8<*V_L&!}T9sUy&uLL|C%sJ;@5@JXP&OXsCcv-}tjZ1tP4IUuk+E4K z7|K9ZgMAOE@5Ruj4zgidG-1nyz~(0{HeG9h?rC3;X%a+46G2ZTr;z>wy0Ep2obRW( zJ0X!8W`0%c7-|ddYE7ZLT=<99G;*M`HI@F*g%kJdBWVL2cScd8vh z_aA!jssja79&SDmSNAF$)lTn@057q;uLZdDBZ1P&Z|=5+aa+9BR(W3|O{FIQ2k zUvH<<6Lp~XaeMqK=WgK>RMVPcm-p4s$&ARKaOq)n4rWQ9UkR(T0dW7UM_&U+4mqWt z0}Ykno+&L!DO$?LhNXk+cb-C<1H-7rW$)H&8V}!|I`sq)y_rPfz^-i#=eBwA&+qEf zDb6DXrc0uP6rEMF1Ns5w0U-DeNZaJP5rHF4tI2ApL&emy9=ft@5| z8;M*u0w-j9X~?jmGY2_aYKmJ4cQzf^E$pF=1{HQIVWfK~hNI9XxTZPbj2}@=z$2gT zi0-G>!ychke)Eep%zunfk6CS!vXB_Yttzs zc#tQ6#3u4u>Be{URQyNd7SQ5u~0ehwT`p7#E8@yj5{|5HB!_B;hVup9Q@9a!1ULX>`d`yEt1 z-q?OWbsV2>UqT(h<2w>U2(1#ICROqBj(GYUI7vJ7Dllq5l>_d2uOlrg$t{sAL*qOx zE#`3iTSxlzLB0>+$`oUrA#o|y91`e=Aex0x5rtTERAy~8RsPU z>P3bL#(CBifSe4FiFoK1@a%(W>`m{7@JK*+0O+MY;sYp?ki5>GW*$e9$*z2d^h50=NvTZvg*g^>1~A zzXz}lU|NQOEf5X|X20(mHk@$BMF>?n1(FCrI?R?tMLdk1@P8QBE4G805a(d*!*!8x zw)#hr28An}yBCi?oTMrOgeB%&epoXzjO!97L1mSL2Cq6zkl3sTr`MhCAU4ll0)%FO zZ`^#CII)#s1K?f+aD@HRz=a699!wUIZ%UAXC_PpZqwr-D{Oe(D>g{O>XSKwjVG_Wg zVT|B}0wh;s?UBj)7Vjod)AV*fALGlj7eRkIiKkxtj1_+Dr*&`Z_UTlCl9R{f0 z*-eD%j6>ja10fvB?eycXk7UsAxv_AhVCqpn%9Lq|xT<#LvE{&+GE*p58sL@91S!2l zu@Hh3P;4?-J7L^uzYz$bbmX^!FUP8b@F2y-_z0~C5_sLw8F9aK)?2UlfC&UnudCgL zPBl=Nc?D0amnkxmT{PDzD zU%5~9koc3IcX%@_2J~7VrM$Jj?#4a;9nd;b>iJI(fz%>=gw!3f#xSnauV|4-vV-7% zTj^Lccl8pY{1QuHD2xfr?rX>OQEMS@V2y*)qi!mbS*qlgAl6I+5 z;cnQ0s#yh?ARqZnFeBsfvJZ0NL*S6*ZH_hGnh-q!c(&7v-}*q4^B{yE$p)ARj+GRV zS&TX|=iT7fcyI6)uX(Y$L%}&cW++*L`#!jXvf%6!GwBb!c*BW;5DEftD2ev>RRp=r>9aWjaI2j)KVG1=3&-^eY zo7A&{11f^0GC^eqrB#QjP!dS&Ttfild}=xFHIJ@cJ6hGrdL`XCS}|ID%%KUNEZdPqaY$y_|X7rHJxRRCpw@}!GuR_B}toV35ebI%de$320 z?J8vVf=?!lbGSewhLeZD-mL}@U13~@uMmPyuo}vU`W(i2x@6${gs&_JftrS>GEPm| zKxF>CV){F+R6vx8Via5yKK*efz1xkw9~+{V_yS5S2d4}|B`k62C#*6>@*LrK1$e!vARmZVk;PB7N?xku=Ovk`eL2)w5AVf0;AqoM6$?6Jpv(;)Z zM`u**2Ka(Zxw^?-57Cq+IDtHa4SEJ_Zuqc8IjAQUs2;)vD){ID40MP5>3tSG8=UIn z@51{&OO3dV6~PFiZEt<5!?!-u1k*lwqw(5G?H4%Zb8XQW$k8Jxl5DkzF;fI)k_tF~ zmWzR<5Asj1?xvhH6XHzLDkQ=30VGg<9#5wCvClURWWjZ9?Ghl1Egn7;LM&b)$*v0& zN-{+|s2sHe!9JM7qTN3JF?{D2S}^oxevz8jAXzzK%qP}jIC%OH2w)P4P6oyZaIq5d z?88_Y6T;nro4<%ju5`(@l$Ets*m5jo=4wm5nJA`V+;a!WC_qb@9tDda81k|WfZ8HF?Bw8RlDtTynC5ov9r%%xiNW8(7NmztL-0!{?;Kq2 zYVh3Tn3V>**~UO=ME{nAP|9D;$ciJ*h;YDF&ha?-%Rx!!0`^nTUozv`mgvyt8+$xb0uYQxoy4UuNb!-;ocXAcF`15aNY$Pl_fWd=L;GluE!cr-m^027LX?ywvX? zW0qne>)VyqvHU`(sv%^|I{52odR{|;<=8;H#N!EkN+YkL?)x!dmRDqlUtQ}@Y&C0oP@F6#1n1>mz z^IjKT+O0QI5G|I5QVA(J{RZ}Ju@S_^nBw3ALX%*Vf-jB%kL&?|XA;DON&rYWY;5g* ze5yMuOWsasK>9WS9S9AGQI}i=IuW=C7^9jE?Qk%F}1j3T-y-sm)#N0$c|oqjBa5D5rWNh*W8BS+4~E}H7&(lL=Py45X2(DtuF0O`M zJe2#wkBh(6sb2K|E_H_IeQOx#cjrI~YbaL^A*jII!)I_Lmq1|Z#7Y~RUlrC!X#WL1 z@@;0_e7AWX1>c+_Tj5Rq3Ev4Jqk%}&6TNcy&=x5>3S~?KQ*AMutH-iswPjM`C`X&mZ@9MXO5JT>Y zYB&`@s}-DMu>1XfQU$gna5n*|;HU))%Ogl)Q$2%7ex>o6QWpc{`q+(keU}T4!>;dA zjX!nW);j)nx&6JnDPc|1jEr+Z07L=@V33mp5mc*G0BWNfC!a~CLh&7E=0x8C3n|W_ zd}ezJWYbb|?xu)eJCj8nJ8<$$3Kf4BBou%v6okF}OqWZE3c)#khX?z=Po{tJ;p87m z=Lq~sC1bw4%oy5B3Zwl0*B->5CX5lVHvef&t8L% zfPMT^>Y$x}Jr{%R$XMml*(9qml(QYI0J{Qu8OKzUh=dGK{1V5Uy~AjOKE6G?W&5;g z(?F;KFIPwQ_w^?P8WM*@K=j?HxyJJzIX4a9Gc_&nEiW2;N+IYPBsgIESq9u2`_5(- zjsckz27n{rLpIMJuz-4TjsMM)z3@bD++$iuP61!I*F0a;1%Yd?7|FPIuy}S_Dj6ii z08s>-)FEG`3(WWkoxJ%ve-B>y^T4cwKJyYdNNJIA>3;JP8MoHwT&8YKEDquB?+@69 zaL*scCw?xb+OhBFf%>n&9?&%)T|0wzfy!a5NitobDcRU5K(og^)&=CyFGBaX;VI{G zqdQfxf;r{&xrPtD&@LY%ol z4?^@s2EN+i&Pp(9H#$G3X5oqF^Mb$jnU^NE$~hz6czz`H3_f-~fhxz}pC1dTX8v-g z6k!@O1kd}W6bhPunWl~f4K@&s5cy4q;g#~&QtAmj`qu%}lX&5;&rvfmbs;;8OdEWM zfRp(lm(ncbM4!!IHWQDu8GO=e@ITS*pETeJ7m{hXEWS_#pKp8NLPGf6t}sX-Bzbi* z?oE8`LM=4~5C5&IF2wtQl?Jv5fsKIT#z3|LWL`ceCb<6L=mZBT)dW!5uLXWvTAk-D<98^pG0wfLv6_Itk&9 zcs2`yS#Kd9FoP{3p)AoraXXKYLb79s{AkaWo|+w4cd-Tzi#&Jnzw|FIJgz4r{71L7 z^<53w=_qavez+%v?t`uc3qWF+NC2HBCqFg6497w$XNLpbfx zK(L`K0VItQJRqSEPgGtxfrb%xu^UHUDoqP)0pw-Kc=*OCgd0zw7Yr)+pkg2Yo*ys2 z6i>s(^w=dGxx8^Ht1i$$J5Hw60(Eq*0Vc2;H6dK83uzhP*Kb720hA>Ns<)%8`655k zr#~={aLu~WV5n->H%NVF11I1|jZ3X=|~ zVR0+88o=`-H}32;7|DYoV=jPVYg^p7G@vC}yE;h1$-&Dm4<7rusBevio(jQcR)M(&TX`30F{qzQ zkglwX@LIKC1gB~Ue1haI6SdU1bmEQjl_O1k{9>P|lWRx7-E4g2@|^?JKJ#jn`ReN5 zR%clknSUPwZM^^~=AY6cze*Qg~T-?7G#FO_jlS62Pxg%RC*@NI!=^utV6*yvc z3!HjOP~>T(4|n8AnB)Qxi8CmNRdF9e7?LcpJK_7Bdq5!w=6;7yeg>vY-3I4f5G+nm zAe5#Xe5G4qQWZA{-~#U;E9!tJkTF^V2$1ER1ZnyxbGL8?C9q}Sx-;TG{um!t{Fk>1 zkYfKV%1DBO+gt%(ZsAUWgdn+^YIc;a{MsCf=T(qE_@|Xh#^G1fvnYY=Djx&4^+9$T z(f%sHKg9Fj1^hLe3C{t)O~0B|HwubQKtO+H16tNKyX(Hgm_bjN1fDfK6Dv(fJ z>fOHo@435CfA9DE=kwW|xpQacPC0XC=Clb)*mYYkFRE^GktxcV3?5i#tp@@#O}4oI zDQieS6gD*w_m{#n;37nzuou3HmZljz}qm-I`H-yUweZz<{WVI#+)Wm3Rs5w~E6-IMW&ilgO942X# zP$3BTF+=)!B#ZUBwp1%CP_-U*X<=f$%FGH?ijN|Z&K_&_T}rL{yAOvjRYV$vPc#SO z(bXWkuAoxuHMEgDZHca8R(cVX7NVSo)rxT$H*)26fay4nOLF-&`SGo7Y&%?2 zWFzL+he+#Kveq>c5&&u?XNOyIUI!7X*~i1*x$H!*x%slWcpP+%>`R|=m6NP8nwypy zon`(MXwf|7svs$sk*G*TB7OK|0{q=_Im37v+a(hy)S9m^PlE&G9#=+ynSa-n?pdqx zB7|r>8!~N{30-k!-%_S+iE$qHt$F=QU-15qTe{_YZDmdtnjD7$t=7VW&NXdQ^&$_EX=QkFTXnOHq?lA_1dMXW`sAZ~s}Fzf?w2)0ZQ?9Ig!a zjvndPK>SHHCd>ki1sJc_Eo1q-$^^lVZx82BfJYMzakFHPbbjO2;MmRs_XR?l7M=6s zfU!9mM$lbA@MD}ayd~y<7YUUSer+Aue0 z#p+SMCdQK-B?nXk;a4~8Sku>I(fsIMGud;a!4PblN6xtIYdrl3JK%qM2X@(2G}R_$ zcORp18rNujbGz}Ec*)Iz0YvAKNLUJyE z4^Ga=s9*@=N~GIZ+3G4bGio-&?6>I;++;^KrhUcXG2uMMFw*~yEmcE3qx`{|gY}H` zHZ|=4q~&y_NXKaQ{WvVMR(PJZW;k)W>70gzYT_a!J`U@wPP~jnhJT{q(i*0-RBN}C z)i%^xEuYlVBK}0TH9z{3qu=7gGp2L2b4ze_K-OGwudxJ1Y3jXe9D$5JwO)Az`(Tpm zV`T$a|5E;O*l!tHBAp+&4Q(NouH>A&Ck4uRbJsKn%rs`rk-(;?d!cz9A|h)Z4ff}q z#fQN{%@=_+9l<>6^+FuIg}4{?P+!f*-W_LY5aCf+G*qHl>=(CbXmc06Ps(d)*2+fb zBO*>qy$bIPo}OE?uWccJD$UO>&O+;e&URp-1jmM)bSh|gQfoA-dc-T{YbhsvXzPH1I0CUJTJu_Mi^G3A+lXQtu+?uYMh5k%>}Dkfrpb*t;BD;63gnH5guW>-eVQCET~#v&Iwl?krbR`hI6MogN?glC)h zO-B#poZTB#YW4?}wfngX!aNOiB87CVoX{*6kLbZxcyX_IO;0!0-QbnX8=qhWnq6|w zl#!Ptt<@$8f;XwF>Q06+pO#7m`c?v6(weD);5o0Re1h5sK}){bQ1QF+ui(?ze*CU{ z4u55Q&a1lmXzkO5zbgm#e}Q@&MSm22FlL#Q{cYrVV&<(xr z+5gY`*mksYG_n0<4P^w=1Yye;8URM(+?~P#NX5o0z zL|-FW$6OEZPP-zj4~pVSyZQx*soS6J-S5c<(^%WWCrOX;U1&$LgSDbN z>+qgO>@t#tEaH13b*EQ^*GTDoe7@7|deX6|6zyxKO}xr9tk> zQq+ki)N;4Dw+p3q#X-P1$W^EbNBli|vqE_pBLg>xTMu4>*<@cW++0nY~__c;@C|={euh%|-oW+q|Vdr9*(p z(!*#)ebhl39!F_?ZwFI$05fB9w{>g~nlC#(lcas&>M8Ff~X}X-c^Q3yHSSK&QS&A!f7 z_BrDk84Vl4?%16&J&(5~A-~m^kNP(I#kK_MPnqIW0(JjG5hEHhs1T{^gQP}ZA(Ac= z=0qAvKZ?1DG@#PpIoW=88<^Ah+@!!yPy&u;%=OG(dUhMD?Ru3!;7I$drA3fFc$LP$ zR~W#~3Neum5n+QfRs51jJtBiXrjI_QQp9(q#L2h&tj!oOlTlt#!=xC-H2#>jMHyyW z8f=34`eN0@Ke)AR(Fl2!OTg_v33aG*;~@|;IPZXib&w~YxW6mi*!OShBJgKT7@gFX zLO^S9z6SAsCi3)zt8|0&WuN$|E9KBEq3uR}Ziw;ea6=N|b8dKT*Pw|8=c&MVf8f#| zMPYp?L?NdE+g z!hJKhutLNoVVPij;c}DzShEby3tn+!61eEkirGmtqIi^t`zZ*KF*|?vDoNO{w){ae zLOYe;6|W~6oVN2gT>h>EJ>t70%8OkJlM0Qw>Z+#3;N0=Ch)Sk0n&$#yYBKeVs=9g* z%B@c2h)1kSrW@&b@o6&MM14eR3S~!GFE37r#M}Ek!j^(<k#eEcU6Pv*jl|oyZYBlgfr!B-f!(YH3;J`= z3>o`DgY)VxaUhM7G`&9(L(^zVTGiF()o+h=+vgd;dtiC0$%>hC{Uz(<^4AQ{QolI}*--497>T)n;rHm5}ECnaNU)-KZ|_yl33iGiiYsgDoF-whK_ge z@#FRK4mU0qa31k@ZPT3_CF#!{h%jY;cZNt~iEy3`Mh}|sb$!PK$>1C%e(p}G8q~(q zol0oE7$8$Y>^X?~S-~d4`Ru->tHpeo%4nc?SEgL*EsijV6K*6-vtHhjpx^kr(ib;O zb)9@s@%amJs^S`}s3j(vfj!^u5)L!vXg>9eXU$ZSyVQMA+3FwGd{Oxal9xgm;oshi z%A5YBdfhRMeYqAR-zd(RQLlr35n&-aHHy0|R7VpU4^7MzKju-kp;nDc5QZMuU0w5tzC9?%SfNIq@rW6C(j4}P`X0Ef zL{?)Ddc>9<)R$frCwh>AdEc5(MHD5p1yrC3x<%gt>YsVa{at&g(m^OK@r^Vu;j%Pv zlW|5&6b~0r@|c(12{31r8Z~dzmVCI>h;rWHGgN3^Bs(0jndqg1*D`9$&XT#*4g)x+ z6K*ns4WqP?R#5YDO(lDsu9(9|na|dVp9-j_1~958HthF_K0PTlXA!1lsN>j(+l>C0 zXzo&RLHXWab@gA>vh4zV<%sz`DT_0%>PZ@&z2pV%i__6bZC+3Iqe=+T!3(m%xQeJM41$}V0( zqbbsg`Tl5M>Kl7a8M+I{TeCsFrrfYgeB76c`ycm5*xHssv)HNCWw2~Mf?y-GzXOreL1cw?MFc&_ouG9NbJN#Nq-z-eiPICQ@`ZH8u()IG~Jmql-*%hT`ibp*?3VoAYScH z%c9=>fTaESp&Kj%Xi5e+vcbRhUs1UKB5@~`SUrH?S|2@>?GbwhP*!IL{xpD661)1F z;AMx|@7LQU9C-rD5fNET12jYP#PDKDOAYaFVr(&x0LoT*0qX{EvR6fIG4;^AzD~SU zOof^}k2nlpbNMEZ>}XhFzFJppFKVba?PGon3kR+!m0-h}c32l4cqr1D84y_msb@DX z9MYfyO{=ufx~yim7Ak~C#O(tqyC=Ug!U4O^(Yx6`KLwV@LB;P*!DVDDx@LDIkGl#b z(>~O5%Rs6JCiEIa@86oEW2_xB4s?bTNRdTyY>qUEYq}B4e^dI!pYq z>rpegn<@wGvfgU!(pXr3UO61-^5RzSrOV_^kgOT`^`yE_2pK-=Y`M((aLYg|;K7d8To{fO(}_pQ>Eo6^YWP zJH(bDK-CiQ3Qbrh#7qd?TS?fd;ygEY-;Oio&7rk8)CsA4cgkNURx3Bj}&v z$WUPSQe=tRLTZ+xKeB8Wsl#XhW*+B={SxCu&Dcl)&F&wDFMcS*Fj~mS88Mtj zVMQ4`97~eo6^n+`9rUJX9Zo~&iijBj4%vFqZv<7+O=8&y%;TA2;|LmfBjbum745v+;uB3<#^0Cf4a; z0~Ia#A*yGz@+(ilrG?Jf6C8MyTrjV zGDkn_8U?N$F4V+5RN`V8W%PJ(7vlrlIVDuGg5gKL9CLiddF4~LQI?!$%#j3H=X_Wc zjii22HKlM=h2+I~V*W@<>pvb&=bA9P&$&jUjx3gLGM`sgs!GVZM`cY&K|${<*hTR0 zQ?m~P{^3XnUrzhj4>(_R%ICCfuNX9nY~75`rvuWZb%wU(ptQ8vAwfI0Sv)_Ay5rTN z|Lc_ypN=APvE(*kvNC@Po*~*bZ~@gRJLkdDsn5EWMi=xuAyY?pl>^VxM$@=%U;D@w z1rxMf^w0U=v}RUa{7ft#O{smjk(`vb^q~{7Ay2|_Q0Lr&Op(ZxhfJTr`oXR25C=z7 zGSkfej;6lJ`8Z_M>~rog*q+;(g$+CdXKo&ZbSags}5^DAknF`&xN(cbqe!H?S@KCh&zJg8_b-MEyEv1)4DmTs+O znd>B2V_e1wu2UNnS%#0nuC!9rj-hh%cDH?@6$0D*qczYXi9iK)EnVBrDLef3$EE-_ zixWtO?WTDw%`-)#m;4MGvEMy+|LA-S97>bUbZH&2!r^8(E;XGI+=}u|5^UU|)Dn zDHh6jDoT0GSH1AFCGe>)kzv%)10(AVr7h=_fLB;2P*(f|WSLSgFO;#2@^tx0+&h8R zP?FGAQ8qm-dQ?&O45K?FjI~34t8*ShbG)aS1_E846SJz&FFVBxRWu$ak>9H5F4H@p zI&b~8!80aOZyGM1nn*X$$726Pnv_t9G%l=~%#00}WSK-m>02>#63vcwLa=$Xv%kKc zL_JfV2rLC_C=PuM5u_>@A5Mi(aQa-tPo@Fgt^}Iq9@swELH6A%8tQj1Yp6Y^ToThK z)69ZzU9aOFRzvQ_KRy+*aZ?p`!>(ERnxc5|%VbJUTNu#7I-|grEfcOD;VBWFjm-#Z zDH3j?DT&8D(_B5ILks#Zt<7MXdrny_mfb|%Rn0ggdgUg{!_a?v6OHWU4Q9ifugKON zW&H~+24hJbSDu|&;J>pry#b~;P?!<}rqI9y9&{G}G{EmKPh)iOgHy244+t@ZiefVT zGVI%mY(=uxSs;#0p=_3cd8SZV+;6^7+yAW6DlztEx;?HFhgh)%7X^u(H&an+F{lfl zg_)72w;j6sMO=x;cK|gAY(t*YfJCmI3W{tN2dC1pfup=om&QV{%>%8LnuIo{&`X>B z$`;Sl#dgP>j%tQNerc^+IR#I*W(bNKNz>aB_Pi1X7>o2w#yI`z}}6|+lBm<~SHXJYYm zGDnRDu(?n3gAZn-mzXldqSu+ks^j<5bV}pJ+B2P+=vVRb3@pp7 zV&4oJkU29T&mLbzc`UUK)V%4E8iN+L=q{GL%9|qQR_do&92CQEr4$N^TW+PXhGO7` z4x{katu(?g#Lt}WXT|TgQuhIie5?Re*j#niDC^*%!3m;y2fXFqrXnPq7M6ccsDbq|Z*UJ7!t$qX*O=>s8q8NhV zT1^i-Y8V@yB3wtVTTp_>MAWadzKl<;ABsorpzjj9`|b0X;n#Ns>`Y|a$jvJci@Rph zz4U?j&rBK-b2#^zj$$cgY=3mjMUic%=@F$bl62n=@u;1w8i!9DveOt^C*rCp6Heca zE>T!b1$muFX?C4~V!Y=xFJOLG3=)k#tCfA3X>!*_vKxv+EaJknE!SDEJu9e9Sq8{phv;daiOkGvGzIb%LW zlj(S%LyhD~=1~?0#Qh6sOTu!Tl^$y0#QZ@xgA0iMcheI3LA-f4?KXYyFHtjvUf%ED zS+fvF4r&oE-vd_CcCq^&+8%SvSF#=3SZo%~E9qj{y%2`Z7BAjQr!-HyM12iedoJ-c z-7SG_u{?}be?3w#l6Puzyxl0y*3hGMswfiiOt_P5nIPOcn?}Q4D|&;p&j=tLOLzH=%a^X5ovJ<2_5s?L?A0V$2s z4vWS2Q@`Hh)GzU?61cfK z?#x^UHXs>A)r0hY+y-~yZuXjLXv59M&UGSYIVDH1Le%SxqUUlT*&=cCa-^Rwo?1?Q zI^XPBPWQ($#yk!EhYn@%zN3v|_(PP}?UNhlz_1ku`3q%c8Dfd=%-xmU7s`RFFQ;W#0|bToVml+v4~F zJMIXeD7C`3iH3(Mc~GdryffpCM5h``O*w0}=_|?dsP%c5Ek0hAM}QTHEe7vM#Mcjl ztC&(OE* z(udE9j~~GbtU#}9PR8rojJ+=&sk$Bn8ao?sSVG6A2oZRMQj#}#>Y-kLUCF>1jkU1u zhT@OpY!`j%C_Um<*!LmfggUN}5cky4qr-c+OqdT)b+VGP;SZZLvILa}_p=*`BCcLos)nbl&k(9daz#vc2e=Y%UEB5E}Sf8K1$~P-}p6sj4h_NLbyV@ z7YwNCdDoQpgIC+-rN(BmNMP9vhT1?-=@r@=J%#FQdlY?Z6jvUFNc0(T!((8L>=F+= z1_pmOp*%)C;&*CRrNE`u0B|iw+fklN^n092Q`oTd_Af{R2i6g5>ut+|BDY&9^NAIY z(<|wJcPVmPEy+!_9qFHL8$K$iIzftq5?q}qeS#9Z9}5h%eda2uk@|cGSN6`Q4sK(I zdPZD)SA}kKWjVxC5V!4;Ge0w{3@xc{f0^xwO zg2prM#;&AoI0+nF3C1K);p|E(2FJepDr_|F7FDaLPf`!|R47NZWmE*SXFy%zK$he@ z=NGG2(Zv48eg8d^U^;|5d*qe&hBq4WZ65=DjN$s0;0n@RIr{YpsVe<^-mP?Xi>`m8 zDRo9LHoHQlkLRQbx+{FKWryN|5eqLUCYWe{w?DVfpvAI;(snHRu#Xyn}zEvDP_$6FqC9Q8)hWdYpJoK#c3PcAlK~y$j zKrn!6MuWN?gO|bkATiTH494Bt0i`7!PW7)@$?^P1$V^Zj#O=BbQjn)9ZOmLB8>ugC zHrmcAZ+rX9RU!G(bz%=blFSJTKWM@o8rtT6*bm{J*usxsdL+(0O}*kC za#dZ9lN|N^R!BJ=$}o}p4A^(Ki0Wr3F@3x%@|-QA2F_Rs?hU0jw()y;QU8r+6svgd z87x(O#ExgMJaiT9&)`_06_L-<=(*eWGny@2ym;oqxgn)ht^geU?&qC^lzVua!FCWz z42ItHZK%{WmXwVh%AsItg#;Idqa4v-xAWHo?D0C3UBR}MTg&J~C~mza2669+{m;@c z4O$p@7DvT;k^UT|j$e$F5c-5uS}zYt&?2oP*yOO@&Wty%Q>Pz=rKpo>M>`x%8X(g= z?aC{%)uJP#c(0CF8}P6n2~c4hhA+tgz8l^P7x zSE>u~-XO&7$~}-7_h}`GKSMC1k(?jzZfzC6K1XAEya;D=npU^M78)j03#1%3&+DX4 zK4-Q?gKD1?H#Jfpkky7p8W8cs$NXKfr;*m@^bSP8ouIKqvYb_%u6Bq$`RnQKvtZi6 zAu_%=WWTuodCI$aL;&VXdIuc%ll;0xhf)Ux9FF?(Uy+h)&K**-=-%15%~{nhu0e-f z@Ml+?ReplHYrAsE52s_0#U}^rog{r`$wUd=#HHuK#EBAy)s$PO_}i6ze!ih*8hkFY zKr01TVX@;wV67Y}f}ruQBaPGiu2F_t&9-R?K)U((L#3p4Yp%&0z&asK#YX z(QTXu2Y2VhUA$V3ceP@5 zJnJSucNSMA1zj~&y-R|-t5h9GVOaxK&OCAR8sP6_@xU6evN1PbSwne)dikSww<}IK z;3vx#%-?v-UyixtJA+PwC-w_c+y8bT@_N=l;1=|WthG>QbNV`Q*?Kt@%?sv@yrNr*c|J81qtk8&b@}m20>Yrx zN|awTz5tn7s@VMkxa-5jFE3z=+*br&pt0SIzN5I+#%Px@F4a)VHMX@YEn?<6%1zkk zCHbO-XU1s|$kXlUsdejUXnMO61)Tx@7EJ%gf!h~hIF@^lRX&5caA6%K*UcIK%+|8Y z(bK+QGvoBT7usya)`vli&L|N2%UlIOkHeqHI~t!r-6 zcRhN~!iclRh(fe#b)f9B4j1DTkF;Lykw9%j+w^UgjfbxA%8}uHq}{I99OD5x?r+og zIHrgZ>#3mb4%;;B2F`ix5z%TVRIqCgcx{S?mOH<>=;8XwhPrE`-X~<<>>tq{vlYD# zW7m)&8?XIymSDTZQxat6qB3#sA*?OHP=v>*Vcax;@F+E`Rl~#8unsl@cu}H0=+$t4 zH5{Rad#hoC8qQP0Ml~#};Yc-{riP=`a94zdB3VM5qV0A{cV!}DhSL>@w&pu`*dri4vjH${I-)sd5qBa@-O^DQ1GXJh=PYvm; zd=ErXTxj{{yRPBC1piBs3is#Y-7ft2PL{%+8foP=4E4ui>Pwh8Jw@G1l&q`SGb%^C z^b*v+N2}yP>pTc*s~tPiRcO+lJ0O**1wDizV7=I=%9yE9m8GsiE2;1DK_|yTMJ)qz zQKoRW?+wB6SOJRhL3QXVS=lDEMd-X*!o))wzGfl?VMFDkv`yUhGPv}wh~+P1|M{SI zPR2WBuJ5@#T~oWVNNj(Zin>kT+oeh07Tu(6i)@Z=lGN*OjD*ISmFPlLz4;qN$XFL8^H{!S_5Hb9AyuPs{t82T7)t81X} z0KIo9t!3j%uGxIJ1F}mwcj+;qu6ZoB#L9ex^1S7j3n#;|b}2s@(0yl=?;yR{K*cGg zFNPc~r;Lk(e$;7)4B3*_2@Qd}H&9O5fxWV0;HVvCqwQt~U4l1-Z<`jVl+yX~UbZ`5 z?`@j@1a8sYG>a*jBuzn+?0rI93_URBU9b3d1AKDNg`?%TzSoarSHR-kYp&>8sCC}z z?Ou@&c#Ai)VkqEE-t>xzfK^_R{|XgH%y1{+jPgcRwAs5B%GJiPP^=pwHEJ)7(?px2z|Ni-PU^}gK zF7Y@WpE~l<&Hr&@vy|0jx8uLvu5~^I2{0U;1nm&iooy{~P`>-b=Ws=_|4P+!`>)*l z9IK#@Llk98lDm^>SiSI+83Dxv#4{+p5@aWi+QYe&lX+_nRbLyicCoC&YfLGygswxWD3csy2U z(KO8~9JRG9;zUlh-EPk8aA=&Tf-%^)YuR+Uu|K+02SaBWT~u8gf%d;IHg2NC{#^8u zc?;(*3T-+iLxt60&Cs@dVdg~ZJhEJWC4NO`zqc91XdHIHVK!Fxn9%NJQ{#7Lo5*ca zTZ1c(PR`TdR4Lwgllp6JKPmqECQU8k)j(5G`e0>7=^|b=o>s}K4lLMB*tpukA-Rz8 zwt7uAuM8c^UQxXnIvcaa3!CAXYC*7Rx4zA=!U6plFl7DW>&-NannlrD)Gg|PeGPb_ zao*z>6W^joaB%tVy;fT?a8eJv1J(%6f@q&3AS1+f1A>~Sc0@|(q>IY^0pWXxQu4UJ3qR0~rJNrY|94K| zM`x5Dc8A7*-S5YMe4SD<{Nl!U=?%@(x#HJ%X&oeM%ig0~BRHA#toZMHG^5Mod)V=d z1Bow-5%1I9u4}#L+sSt9Oe}78d~XrEbVTmhtu&~c^BGBw!!_PxRyCICzb9J^+I?9} z-wFvFlC0WFW0JUJZACpUl)y|aC;ZgxXSYJU7Y9yFGuaZBx;L?}>vD2d?7}70@@u)` zj%FIfWvpwaF}?q61dPJrIp>tJA1gAOe6_>NUr*2mMyObGyV7;Ph~7pS1D6K*!oqgt z!C<+A#kvyG?keY)+psYRU0C>MsV22+R*BoUQLm`~LK%@?$pggdZS*g&lBaKnoC(9Z zoqFj`<3d5vvYp07pH|{r1dBv9=sMKBY{evNLwzn{N<5kJ zFYWVGs`-N}7EGXaCI62+=}6Hdl&4?AiZRx*`V_=uc|^xfvZ}by@{H)ai<;tI_lCan zFO!TE{}4a!f{f%t>b>sg zlxSZBe8OK)R$))Igbaw~@iIcSgob!mk@F9DRb9qxu z;UhR(v_O})=Dd>Y)vVw8cwiq((Vx!UIp!nEA}H$5+ehi#Jx}h#0*(#md;7?tN%V@8 zkEt;JpMGnz^_jxv58OGXN6?1LJEwn44WudZh#&St2#I`s56~NR+}(WGI0;A<(nFmT zoOdS?;0zVH!N}{aTcU62P`*?-MjgtVxD(IxECedZ69GCf6CD|n|AEYwy@dkcEBO|v5$aVrLe-aI!Plr!yYVCn8ncW)L(rM*~VAJvydxy7eshCrE zL8}Ct_J30U;-22;)m&L% zbAQ(QtQt=7njoVHC|`T4oY`G4Ngm+(jCXBR>v^wB{Og~f1ta0*F@Hq_)Z01&>kg4! zv(qDH9iqI{@$U8TJuNk^cWDaOy9fpfIi^`nCzY?o#zQo^=i9-)@;mT41AiFU_exN8 zFOgqwzw5R6NU|Z=v}zYGG@H*VTY|#$DRoUw48rKd)m6gP4!Gvwa!bMTc}UqHhI~pz znxcTX=To|;lMej)DJZe4zexKRb!eb-tot|hPJc2W&zH>7wa05tE4A3?%ky>Nr}<*+ zzv%|e>Y#Z1-!S){85AG?n}%wvLE-y1Ez!U%?_Zz6>UHgB(ENQ>efZT{7pOZa&o{ia zrqHka5`4lHy|rM4Vapw0=Pe2>I=SA3%bW9)TIBg#U7wkzqoV!&@3bFx$97|OQlD;hNXOZeH7 z=bwhHQ%{?*l0z;}_?&3wrxPA|K2yBY${TyQ_}plqeT9TK@8MYlzJi_86*2hh(6TxI zYup}b`$z|!4pW|Z*4WYRIWe==?aZr|+dxUP97*!c{PuW#za@3ts_gJnTuxPH; zTcYly1?=LFW=rsR@U)4GgqXm}_A;F}P>;hNu?`l3UBg8Oc< zf|tN40{@fZ*9=_nC!bVC!lvUWrA3TW(}@X3DMfcu$#skQ96K!(yXq)TFCXQJ_l{B) z-d@HUe3azAbHZgaUndqk9iQ@|&ze=g?TIquw=y6@CGa;WQB~N61 zN1xTzd+Tk*?t#*8FkCOSom377>uo#T5qMtgeGDNTLic#5+}8hwkyvWK5%Q0<~ES058M($w|EPXdb66EJyTZTDisZ^UnU}FftPXzV@CkRW5j~N zKANJ=jh6Z&A_IjQ`#8TJY%}7iFKlVF>oxfat)b^UJV)b>D9$Q}vi^}1CVgA}LvzMG z9*o_pso=AGA?}&AgQ>ziCp|Wjy2{^_``i|2pzsus%%>FJJ{f5s@4`DN^Ec&HRk9XB zXE2j{iy6m3ISRdE?QyJU8D8TMa?0~^Y*TD$hr6v=3>mzk;7Sb#}s zfj)qIR++g^IS)%ysQV<)AVuD4gFzDnA7T{|8Dbm4fsJM_$NpTdmjKMUlu^?~X*yLN({^Ky)+CzXLm+l=_q-q5R!drqG`s zE^leNn@{BplPoA=rdwEkBn#Bh#<@kskI*x`AQt{e1LxfSF^|n(zt0S>!W~a-m2$Le z^;>jrX*cWELJ$%7@r;(FweaF-lCryPOs>$s1WA4%X}px*F{^tEIghy5i;guT6<6ND zTou;>7h2=+=?l9=#7|^NTCj`n29>1BQR7B4T`c;Uz_=6l`~JQUdyL+cZse))2OaKa6>n^K-$Mi zP8qKaV5W(?f2NGOCc6&0*5K~PC!jV%T}=*@g){v6TE^pIm;9iF+mdlZn4Q+=Lji@Q z!FD1$pwnJT_Mq}#5G1?(SLHbL9pS(2q|{b(@1iA)#jm55GB{%DSYt;q-QRS#ad*=K zEIB#UwrLLK1PhdVA*AO{Rwud295`l?gtTjYbsLh(@>W#zvVe5G0Mjc|^GPT&k& zQxJu1Fudz|(5j-Q;!au~Xl#v(b zL)BQ;@)R=w`R3N3a>`fbBx6t^AM9TJLFGrUXlkdlTYvZJ-eSJnH@Go|%YdI9xMyb# z?Vxhd8)7FW!XWT_oW)F%4!+9|ffMe7VL2rBaLV7{SCgNBs^MAL87Ro^ENR4$0!ztKS12R$lBhAzyKWHY8F90}#-Qnh8j zxkc?B;XzN+ zf?ds(sMsloR~a8XWw+0-z>PUDHgQ^fa`T@Z0J@`ADpej4b(+$qS9?MuQVPxvJm0rBv!~kYdm%CX09gHHyHDBS zTA_ZF$7G<|>$8w939hvN@s}~#(9Yv=Gu}jshfk9^dzWv}ZXBeVtFE4_jz{aZ`p~7j zt(T|Q#^C8KRAinwc$&Iv_65YRr>VEC-uG7w)=e6YWcLG09G=46dKFtECk;m2-M}yv zS8w^*^+P=_b9ZlA@M-fTbdy(kJRqjDliYi^yAw0@=#DJ4JKlGz-J$%=LwS%Bx`Wum zpyS*j{9NbOtN3|8#NnadcpGcbOthEjg_OTt?F}z(O>b0tLyz8=4@%)v1k#Pgk?OV9 z&sY%Vh5Pn zns#Hpy2Wj0a3udwEI&i(=|l0=H(Yn9)Adm|cgCwQrk@M+ST0^|r}Wv+xI&n*5Lm$e zYkkUVP}!J@)_Rq8aMa&vxo>+Ai-3LpwC(Z&$#LLP9Obupl@o!sX4z4)8~0s<^t19A z+tl6(|E*y5qra-K?e!@Sp{zpD?<{re=2LJnmeb;Ss9oO%9a3|X11Ci>{VXK;pL@h3 zXQ?dF3#yy5+j{+l(gd`%$rDh{iX%uc#-+MJb~dai)1R=W$*TSE*RD&@M3wF5+yA=C zg4a6pF{qNpKJ_A;c&xHDNpT@FfvULe3pOsOo{dqO5AF0>OoxTzJPozY3v7mYs2&2GfHFJKF`vwq zc@0>M&DGMmdNQ7CkP0#bxS+LTzS;5l{1s(i9iblVn}EO5*>EiAXU|hwKIVkGi6`Fm zZ);Of`-kxa%$PIl?qB9VUzXis+AE{1ynyI^frcin4p1K3`u|T!kKi5sB=%mQfprrC znznq$f%$E-n7vhfcTdN+D9Ck$mtD@rdm5H1u$Y4fuAnptpS=nsNRbS%vi*m@>-hWy zl;>zpgeQGze?Z9%w9PM28R5RLr&Ak{Axn84Y0sES1*|} zaoLu94lV9%Eq}PA&mSKz?=?=!?Q4@4aJ!$N0#tx~RR+ZS7va2TvOgcCSNX+H7b(U3 zmA|tae?4*trq(~V$25Ck`?zV|=;m^u?~@|=ck0pqJ2*AqmG1xSW&WlPo02|feB}+e zYJlB&<;zhUyinT_HNR7e2J+EWzf)G-22hfR_ElZoRI5R4`nnXZ{a=JOp=}`S0X^~K z^Br4(LE1)LV`x(tP-H*0gl60ck0Y#<9l5a!wuD$W{SG_SF>`cnkch?e9!BFbY?W=i z^<&}Al!c4ro9>@2tvpGhhm(5U(H2ZV;q}chYjtQuL|@Z?gUT21T?gW!#l@r+=;LDs z!bTLtl>LQIwq0xITPNqCAC|bU{7;qn6KC+LWB3tvnLD>SsZmq6izU~Tn${y0B-~Q z5%6}vp8&}xNoN5iX;6W56Yi5rN09&S1>JfIKh62dSMFo@@_fCh9{H$ZMcQWz!! zMj<{0kpEI;Ns7U98ek$|Iv}T)<+@No7DOcBMK&P+Ekw(B)Cy%u@&FbAegoJaFb(Mj z0&;~00m^v30k9CTBn$@wa{e0u`EQ7<0%<5<2jYi?;c!NSLC81)un5o!$Qerk`GaME zLl8d_&o=8VX7opPv zS4b*&Ly|Ie8V$#Bn4*nFD8NX!i-jIauH>kqXd*2~eM{1SXoFFQaKmOv8W`=j=n;M% z;n~PW;WW#mH5zC%s_7q!*6H*d7GHU&JVyP3Y&3S^q{8f_>=-UJLXJ}r@OClDOUc7H zDpHnZ4eHF{D48n|3U`qWhUD;vqGgQ+iUVqz7&$c+4MM4#ywtCfvn3!Y+M>Qrlw)Hf z!cFWd>-CZ0_--h|5ROkm*cc8ceE2|h}ydmitz zWNjQzw>J^)E(4tr=06#qjtS>8%UWG*IBbz4BBI0LY*~`J;dA_#151RYaI5+uzH2zX z5Z}aYcIqg>AX1waPSamD%rL}Q!DfY!UNG4F^JDZco4cOHXOb| z4hG}G;Sz*-7&y&f*x5fQjCO^qKZ4;`9}H0f_jm>jXOc^oee`YAbe13ps@^vDV)tw6ZD`udWe zhSYJXRdSr#Kn_ntn0uVVljN9~lyEI3qZX;*@J;xF20GbX^c18?2zS)Ya&&ZJI6PHt zO{iyYLCyi`z+>Ke}r3jgyy^z9(U}P9Z0fO>*ab;@g1+?VVgz;gR5Qbet zP}^NjejDjEgVg5$dSm<+P(~?6F4}|-;`#fxLU3RhF2j3{FAu|i19n!>OBB7bPW@m} zbm+qa!f;>+Mv|%E9b_ognAG=?+7LAAP2D)&5E**b-WaN&W=OcAW5ds5LQp?Wgkm??w85qRYMdbsrVYoO9U*>#x|9QAVW=1|dU&1rzdo!Hw-7vff z&{|gtt~7qVu!QJfnGpvpP8~=R6Z2;VkrWMBi{}`?7Xf1dcOV`YWJvP>nV!P5SxNxB zP)r~uT4^xinZSLH^h^NtcxK|a@dl86z=wxnbpRYToTNGf0w)l`i_x`_geqvINW9?n zYVast!L-ssKc4RVzKwlO$fGngJsjB0sMmbMXOQJGucfl{z&5{^tR60eO0I zMbiN<^&{M|C#Un9|_zmybYknlYGahg*AiEe|R-6OshrkIWfJ{pI zrG#6ok!lC?e~t7NTJqTtVbf~z>Y^o$E&{3eFBp`h+IJz8!|KmDAMTK(8xe|*4uyvx z%xgZ!59JcE>~eS*!pR`i93GBv4DgP_BM>GO#9`}S!lej@^VUgac!-P)B^vpc@Tk9J z82y*94dDpXmM!Am2zO?l^q25tg!TGR-kbgsKLz2=%H51`XHQH;I6FI({+7DGB$^fu^N@|!BLm>W zfIMX5!8+$nSo{V454$=j&hsFhh+*U??FCCLf(Hg074=x`OiV7!SQas*cMd)5#SZF zn}^qWlAZzV3h2JZ`xBBjT*s~(u-YYI76B&|ST6z&#CQ0X``R;%ahkgSXG{6&(%hdV z=?1{LfF*#N@EeTZ=nRs20~W-Qiky?mNn*sjU?UX~uT_wWgv%;PMZkBbkcxaUH)ErL zbQ=H}=MLiiNU08UcnnF5Y<(u9aKN_!8OiRON-BcgjPn&Eml*{yVm)6)DpGwlkt9Ya z_{P9ABx&U&o`$FhAmh*lRE+WG7%IfLQ#&4e55UnANMf8h19%e`cxo)<7=ZAJA~B-8 z1;|J;a2!du04_uY88_fM1r^mwMd;!pbl#5`>;8bt>Onb2i1!SdtXuL&;5>miePY*c zX$3RY$f-^LB=4!1B^pD=@cOESLPy~aWC@|ey@?tfQ)+^4-$NM zYf|g#LDCIKvJ0>UKdX9@Fshj%;lY5D4+G>(mtNq)faPmA9&}|je?*e}fFK*v^tDX> zfy^tI{7cf@r}-2sNgG!3G9XC@pXFr$4fz`{1CrGI6y_>#Dr27HbpXoW&+|Hf-OzKq z4oDIVpwI?MTJQvuaqLS0K~|&_r~q#w%}?P>0(k9lo*6jY0&-)T0l5i9s8|$W3@Y9Q za4xtpi=eP5$E#W6^zQW~8Pc)hxkz zt}sWEW%R}U<0R=2o+qL^VS*yLCZk)Hrfnf|qy^dVNLM<~7@1rgpJ44eag-)4S(m2K zrB&%>OfVJbW=ztJ^^D9Y$SH_UBV&QCASZP+WhUl7tGP`sI63=p;f!%cO~1PT4# ARM Linker, 5.03 [Build 76]: Last Updated: Thu Oct 17 00:00:00 2019 -0x00006259 T att_dispatch_client_can_send_now -0x00006261 T att_dispatch_client_request_can_send_now_event -0x00006279 T att_dispatch_register_client -0x0000628d T att_dispatch_register_server -0x000062a1 T att_dispatch_server_can_send_now -0x000062a9 T att_dispatch_server_request_can_send_now_event -0x00006379 T att_emit_general_event -0x00006abd T att_server_can_send_packet_now -0x00006ac1 T att_server_get_mtu -0x00006b35 T att_server_indicate -0x00006bb9 T att_server_init -0x00006bf5 T att_server_notify -0x00006cdd T att_server_register_packet_handler -0x00006ce9 T att_server_request_can_send_now_event -0x00006d05 T att_set_db -0x00006d19 T att_set_read_callback -0x00006d25 T att_set_write_callback -0x00006e69 T bd_addr_cmp -0x00006e6f T bd_addr_copy -0x00006e79 T bd_addr_to_str -0x00006eb1 T big_endian_read_16 -0x00006eb9 T big_endian_read_32 -0x00006ecd T big_endian_store_16 -0x00006ed9 T big_endian_store_32 -0x00007185 T btstack_push_user_msg -0x000073dd T char_for_nibble -0x00007f4d T gap_add_dev_to_periodic_list -0x00007f65 T gap_add_whitelist -0x00007f79 T gap_aes_encrypt -0x00007fa1 T gap_clear_white_lists -0x00007fb1 T gap_clr_adv_set -0x00007fc1 T gap_clr_periodic_adv_list -0x00007fed T gap_create_connection_cancel -0x00007ffd T gap_default_periodic_adv_sync_transfer_param -0x00008015 T gap_disconnect -0x00008041 T gap_disconnect_all -0x000080e9 T gap_ext_create_connection -0x000081ad T gap_get_connection_parameter_range -0x000081e9 T gap_le_read_channel_map -0x0000825d T gap_periodic_adv_create_sync -0x00008281 T gap_periodic_adv_create_sync_cancel -0x00008291 T gap_periodic_adv_set_info_transfer -0x000082a9 T gap_periodic_adv_sync_transfer -0x000082c1 T gap_periodic_adv_sync_transfer_param -0x000082dd T gap_periodic_adv_term_sync -0x00008371 T gap_read_antenna_info -0x00008381 T gap_read_periodic_adv_list_size -0x00008391 T gap_read_phy -0x000083a5 T gap_read_remote_info -0x000083b9 T gap_read_remote_used_features -0x000083cd T gap_read_rssi -0x000083e1 T gap_remove_whitelist -0x0000846d T gap_rmv_adv_set -0x00008481 T gap_rmv_dev_from_periodic_list -0x000084c1 T gap_set_adv_set_random_addr -0x0000850d T gap_set_connection_cte_request_enable -0x00008529 T gap_set_connection_cte_response_enable -0x0000853d T gap_set_connection_cte_rx_param -0x00008599 T gap_set_connection_cte_tx_param -0x000085ed T gap_set_connection_parameter_range -0x00008605 T gap_set_connectionless_cte_tx_enable -0x00008619 T gap_set_connectionless_cte_tx_param -0x0000867d T gap_set_connectionless_iq_sampling_enable -0x000086e1 T gap_set_def_phy -0x000086f9 T gap_set_ext_adv_data -0x00008711 T gap_set_ext_adv_enable -0x0000878d T gap_set_ext_adv_para -0x0000886d T gap_set_ext_scan_enable -0x00008885 T gap_set_ext_scan_para -0x0000892d T gap_set_ext_scan_response_data -0x00008945 T gap_set_host_channel_classification -0x00008959 T gap_set_periodic_adv_data -0x000089cd T gap_set_periodic_adv_enable -0x000089e1 T gap_set_periodic_adv_para -0x000089f9 T gap_set_periodic_adv_rx_enable -0x00008a0d T gap_set_phy -0x00008a29 T gap_set_random_device_address -0x00008a8d T gap_start_ccm -0x00008ac1 T gap_update_connection_parameters -0x00008fa9 T gatt_client_cancel_write -0x00008fcf T gatt_client_discover_characteristic_descriptors -0x00009011 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 -0x00009061 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 -0x000090b1 T gatt_client_discover_characteristics_for_service -0x000090e7 T gatt_client_discover_primary_services -0x00009119 T gatt_client_discover_primary_services_by_uuid128 -0x0000915d T gatt_client_discover_primary_services_by_uuid16 -0x00009199 T gatt_client_execute_write -0x000091bf T gatt_client_find_included_services_for_service -0x000091ed T gatt_client_get_mtu -0x00009295 T gatt_client_is_ready -0x000092ab T gatt_client_listen_for_characteristic_value_updates -0x000092cf T gatt_client_prepare_write -0x0000930d T gatt_client_pts_suppress_mtu_exchange -0x00009319 T gatt_client_read_characteristic_descriptor_using_descriptor_handle -0x00009343 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle -0x00009349 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00009377 T gatt_client_read_long_value_of_characteristic_using_value_handle -0x0000937d T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset -0x000093ab T gatt_client_read_multiple_characteristic_values -0x000093db T gatt_client_read_value_of_characteristic_using_value_handle -0x00009409 T gatt_client_read_value_of_characteristics_by_uuid128 -0x00009455 T gatt_client_read_value_of_characteristics_by_uuid16 -0x000094a1 T gatt_client_register_handler -0x000094ad T gatt_client_reliable_write_long_value_of_characteristic -0x000098d9 T gatt_client_signed_write_without_response -0x0000999d T gatt_client_write_characteristic_descriptor_using_descriptor_handle -0x000099d7 T gatt_client_write_client_characteristic_configuration -0x00009a29 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle -0x00009a39 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset -0x00009a75 T gatt_client_write_long_value_of_characteristic -0x00009a85 T gatt_client_write_long_value_of_characteristic_with_offset -0x00009ac1 T gatt_client_write_value_of_characteristic -0x00009af7 T gatt_client_write_value_of_characteristic_without_response -0x0000b055 T hci_add_event_handler -0x0000b79d T hci_power_control -0x0000b951 T hci_register_acl_packet_handler -0x0000bfd1 T kv_get -0x0000bfe9 T kv_init -0x0000c039 T kv_put -0x0000c0b1 T kv_remove -0x0000c121 T kv_value_modified -0x0000c125 T kv_visit -0x0000c1e5 T l2cap_can_send_fixed_channel_packet_now -0x0000c1e9 T l2cap_can_send_packet_now -0x0000c3a1 T l2cap_create_channel -0x0000c4d9 T l2cap_disconnect -0x0000c77d T l2cap_get_remote_mtu_for_local_cid -0x0000cbfd T l2cap_init -0x0000cc45 T l2cap_le_send_flow_control_credit -0x0000cea9 T l2cap_max_le_mtu -0x0000cead T l2cap_max_mtu -0x0000ceb1 T l2cap_next_local_cid -0x0000cec1 T l2cap_next_sig_id -0x0000cf59 T l2cap_register_fixed_channel -0x0000cf75 T l2cap_register_packet_handler -0x0000cf81 T l2cap_register_service -0x0000d069 T l2cap_request_can_send_fix_channel_now_event -0x0000d08d T l2cap_request_can_send_now_event -0x0000d0a7 T l2cap_request_connection_parameter_update -0x0000d0d9 T l2cap_require_security_level_2_for_outgoing_sdp -0x0000d49d T l2cap_send -0x0000d515 T l2cap_send_connectionless -0x0000d5a5 T l2cap_send_connectionless3 -0x0000d63d T l2cap_send_echo_request -0x0000d6a1 T l2cap_send_signaling_le -0x0000d6f9 T l2cap_unregister_service -0x0000d8dd T ll_hint_on_ce_len -0x0000dbc1 T ll_set_adv_coded_scheme -0x0000dbf1 T ll_set_def_antenna -0x0000dc0d T ll_set_initiating_coded_scheme -0x0001d851 T nibble_for_char -0x0001d8f5 T platform_config -0x0001d941 T platform_get_heap_status -0x0001d959 T platform_get_version -0x0001d961 T platform_hrng -0x0001d969 T platform_patch_rf_init_data -0x0001d985 T platform_printf -0x0001d999 T platform_raise_assertion -0x0001d9ad T platform_read_persistent_reg -0x0001d9bd T platform_reset -0x0001d9f1 T platform_set_evt_callback -0x0001da05 T platform_set_irq_callback -0x0001da3d T platform_set_rf_clk_source -0x0001da49 T platform_set_rf_init_data -0x0001da55 T platform_set_rf_power_mapping -0x0001da61 T platform_switch_app -0x0001da85 T platform_write_persistent_reg -0x0001da95 T printf_hexdump -0x0001e525 T pvPortMalloc -0x0001e60d T pvTaskIncrementMutexHeldCount -0x0001e625 T pvTimerGetTimerID -0x0001e651 T pxPortInitialiseStack -0x0001e811 T reverse_128 -0x0001e817 T reverse_24 -0x0001e81d T reverse_48 -0x0001e823 T reverse_56 -0x0001e829 T reverse_64 -0x0001e82f T reverse_bd_addr -0x0001e835 T reverse_bytes -0x0001e9d9 T sm_add_event_handler -0x0001eb05 T sm_address_resolution_lookup -0x0001ebdf T sm_authenticated -0x0001ebed T sm_authorization_decline -0x0001ec0d T sm_authorization_grant -0x0001ec2d T sm_authorization_state -0x0001ec49 T sm_bonding_decline -0x0001f021 T sm_config -0x0001f12d T sm_encryption_key_size -0x0001f8fd T sm_just_works_confirm -0x0001fb4d T sm_le_device_key -0x0001fbe5 T sm_passkey_input -0x0001ff71 T sm_private_random_address_generation_get -0x0001ff79 T sm_private_random_address_generation_get_mode -0x0001ff85 T sm_private_random_address_generation_set_mode -0x0001ffad T sm_private_random_address_generation_set_update_period -0x0001ffe5 T sm_register_oob_data_callback -0x0001fff1 T sm_request_pairing -0x00020a2b T sm_send_security_request -0x00020a51 T sm_set_accepted_stk_generation_methods -0x00020a5d T sm_set_authentication_requirements -0x00020a69 T sm_set_encryption_key_size_range -0x00020d3d T sscanf_bd_addr -0x00020dc9 T sysSetPublicDeviceAddr -0x0002126d T uuid128_to_str -0x000212c5 T uuid_add_bluetooth_prefix -0x000212e5 T uuid_has_bluetooth_prefix -0x00021329 T uxQueueMessagesWaiting -0x00021351 T uxQueueMessagesWaitingFromISR -0x0002136d T uxQueueSpacesAvailable -0x0002149d T vPortFree -0x00021571 T vQueueDelete -0x0002159d T vQueueWaitForMessageRestricted -0x000215e5 T vTaskDelay -0x00021631 T vTaskInternalSetTimeOutState -0x00021641 T vTaskMissedYield -0x0002164d T vTaskPlaceOnEventList -0x00021685 T vTaskPlaceOnEventListRestricted -0x000216c5 T vTaskPriorityDisinheritAfterTimeout -0x00021771 T vTaskStartScheduler -0x00021801 T vTaskSuspendAll -0x00021811 T vTaskSwitchContext -0x000218b9 T xPortStartScheduler -0x00021975 T xQueueAddToSet -0x00021999 T xQueueCreateCountingSemaphore -0x000219d5 T xQueueCreateCountingSemaphoreStatic -0x00021a19 T xQueueCreateMutex -0x00021a2f T xQueueCreateMutexStatic -0x00021a49 T xQueueCreateSet -0x00021a51 T xQueueGenericCreate -0x00021a9d T xQueueGenericCreateStatic -0x00021b05 T xQueueGenericReset -0x00021b91 T xQueueGenericSend -0x00021cfd T xQueueGenericSendFromISR -0x00021dbd T xQueueGiveFromISR -0x00021e61 T xQueueGiveMutexRecursive -0x00021ea1 T xQueueIsQueueEmptyFromISR -0x00021ec5 T xQueueIsQueueFullFromISR -0x00021eed T xQueuePeek -0x00022015 T xQueuePeekFromISR -0x00022081 T xQueueReceive -0x000221ad T xQueueReceiveFromISR -0x00022241 T xQueueRemoveFromSet -0x00022263 T xQueueSelectFromSet -0x00022275 T xQueueSelectFromSetFromISR -0x00022289 T xQueueSemaphoreTake -0x000223f5 T xQueueTakeMutexRecursive -0x00022439 T xTaskCheckForTimeOut -0x000224a9 T xTaskCreate -0x00022505 T xTaskCreateStatic -0x00022575 T xTaskGetCurrentTaskHandle -0x00022581 T xTaskGetSchedulerState -0x0002259d T xTaskGetTickCount -0x000225a9 T xTaskIncrementTick -0x00022675 T xTaskPriorityDisinherit -0x00022709 T xTaskPriorityInherit -0x0002279d T xTaskRemoveFromEventList -0x00022819 T xTaskResumeAll -0x000228e1 T xTimerCreate -0x00022915 T xTimerCreateStatic -0x0002294d T xTimerCreateTimerTask -0x000229b9 T xTimerGenericCommand +0x00006329 T att_dispatch_client_can_send_now +0x0000632f T att_dispatch_client_request_can_send_now_event +0x00006335 T att_dispatch_register_client +0x00006349 T att_dispatch_register_server +0x0000635d T att_dispatch_server_can_send_now +0x00006363 T att_dispatch_server_request_can_send_now_event +0x00006421 T att_emit_general_event +0x00006b59 T att_server_can_send_packet_now +0x00006b5d T att_server_get_mtu +0x00006bd1 T att_server_indicate +0x00006c55 T att_server_init +0x00006c91 T att_server_notify +0x00006d79 T att_server_register_packet_handler +0x00006d85 T att_server_request_can_send_now_event +0x00006da1 T att_set_db +0x00006db5 T att_set_read_callback +0x00006dc1 T att_set_write_callback +0x00006f05 T bd_addr_cmp +0x00006f0b T bd_addr_copy +0x00006f15 T bd_addr_to_str +0x00006f4d T big_endian_read_16 +0x00006f55 T big_endian_read_32 +0x00006f69 T big_endian_store_16 +0x00006f75 T big_endian_store_32 +0x000072f9 T btstack_push_user_msg +0x00007565 T char_for_nibble +0x000077f5 T eTaskConfirmSleepModeStatus +0x00007e99 T gap_add_dev_to_periodic_list +0x00007eb1 T gap_add_whitelist +0x00007ec5 T gap_aes_encrypt +0x00007eed T gap_clear_white_lists +0x00007efd T gap_clr_adv_set +0x00007f0d T gap_clr_periodic_adv_list +0x00007f39 T gap_create_connection_cancel +0x00007f49 T gap_default_periodic_adv_sync_transfer_param +0x00007f61 T gap_disconnect +0x00007f8d T gap_disconnect_all +0x00008035 T gap_ext_create_connection +0x000080f9 T gap_get_connection_parameter_range +0x00008135 T gap_le_read_channel_map +0x000081a9 T gap_periodic_adv_create_sync +0x000081cd T gap_periodic_adv_create_sync_cancel +0x000081dd T gap_periodic_adv_set_info_transfer +0x000081f5 T gap_periodic_adv_sync_transfer +0x0000820d T gap_periodic_adv_sync_transfer_param +0x00008229 T gap_periodic_adv_term_sync +0x000082bd T gap_read_antenna_info +0x000082cd T gap_read_periodic_adv_list_size +0x000082dd T gap_read_phy +0x000082f1 T gap_read_remote_info +0x00008305 T gap_read_remote_used_features +0x00008319 T gap_read_rssi +0x0000832d T gap_remove_whitelist +0x000083b9 T gap_rmv_adv_set +0x000083cd T gap_rmv_dev_from_periodic_list +0x0000840d T gap_set_adv_set_random_addr +0x00008459 T gap_set_connection_cte_request_enable +0x00008475 T gap_set_connection_cte_response_enable +0x00008489 T gap_set_connection_cte_rx_param +0x000084e5 T gap_set_connection_cte_tx_param +0x00008539 T gap_set_connection_parameter_range +0x00008551 T gap_set_connectionless_cte_tx_enable +0x00008565 T gap_set_connectionless_cte_tx_param +0x000085c5 T gap_set_connectionless_iq_sampling_enable +0x00008629 T gap_set_def_phy +0x00008641 T gap_set_ext_adv_data +0x00008659 T gap_set_ext_adv_enable +0x000086d5 T gap_set_ext_adv_para +0x000087b5 T gap_set_ext_scan_enable +0x000087cd T gap_set_ext_scan_para +0x00008875 T gap_set_ext_scan_response_data +0x0000888d T gap_set_host_channel_classification +0x000088a1 T gap_set_periodic_adv_data +0x00008915 T gap_set_periodic_adv_enable +0x00008929 T gap_set_periodic_adv_para +0x00008941 T gap_set_periodic_adv_rx_enable +0x00008955 T gap_set_phy +0x00008971 T gap_set_random_device_address +0x000089d5 T gap_start_ccm +0x00008a09 T gap_update_connection_parameters +0x00008ef1 T gatt_client_cancel_write +0x00008f17 T gatt_client_discover_characteristic_descriptors +0x00008f59 T gatt_client_discover_characteristics_for_handle_range_by_uuid128 +0x00008fa9 T gatt_client_discover_characteristics_for_handle_range_by_uuid16 +0x00008ff9 T gatt_client_discover_characteristics_for_service +0x0000902f T gatt_client_discover_primary_services +0x00009061 T gatt_client_discover_primary_services_by_uuid128 +0x000090a5 T gatt_client_discover_primary_services_by_uuid16 +0x000090e1 T gatt_client_execute_write +0x00009107 T gatt_client_find_included_services_for_service +0x00009135 T gatt_client_get_mtu +0x000091dd T gatt_client_is_ready +0x000091f3 T gatt_client_listen_for_characteristic_value_updates +0x00009217 T gatt_client_prepare_write +0x00009255 T gatt_client_pts_suppress_mtu_exchange +0x00009261 T gatt_client_read_characteristic_descriptor_using_descriptor_handle +0x0000928b T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle +0x00009291 T gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x000092bf T gatt_client_read_long_value_of_characteristic_using_value_handle +0x000092c5 T gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset +0x000092f3 T gatt_client_read_multiple_characteristic_values +0x00009323 T gatt_client_read_value_of_characteristic_using_value_handle +0x00009351 T gatt_client_read_value_of_characteristics_by_uuid128 +0x0000939d T gatt_client_read_value_of_characteristics_by_uuid16 +0x000093e9 T gatt_client_register_handler +0x000093f5 T gatt_client_reliable_write_long_value_of_characteristic +0x00009821 T gatt_client_signed_write_without_response +0x000098e5 T gatt_client_write_characteristic_descriptor_using_descriptor_handle +0x0000991f T gatt_client_write_client_characteristic_configuration +0x00009971 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle +0x00009981 T gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset +0x000099bd T gatt_client_write_long_value_of_characteristic +0x000099cd T gatt_client_write_long_value_of_characteristic_with_offset +0x00009a09 T gatt_client_write_value_of_characteristic +0x00009a3f T gatt_client_write_value_of_characteristic_without_response +0x0000af19 T hci_add_event_handler +0x0000b6c9 T hci_power_control +0x0000b87d T hci_register_acl_packet_handler +0x0000bec1 T kv_commit +0x0000bef9 T kv_get +0x0000bf11 T kv_init +0x0000bf61 T kv_put +0x0000bfd9 T kv_remove +0x0000c015 T kv_remove_all +0x0000c059 T kv_value_modified +0x0000c05d T kv_visit +0x0000c11d T l2cap_can_send_fixed_channel_packet_now +0x0000c121 T l2cap_can_send_packet_now +0x0000c2d9 T l2cap_create_channel +0x0000c411 T l2cap_disconnect +0x0000c6b5 T l2cap_get_remote_mtu_for_local_cid +0x0000cb35 T l2cap_init +0x0000cb7d T l2cap_le_send_flow_control_credit +0x0000cde1 T l2cap_max_le_mtu +0x0000cde5 T l2cap_max_mtu +0x0000cde9 T l2cap_next_local_cid +0x0000cdf9 T l2cap_next_sig_id +0x0000ce91 T l2cap_register_fixed_channel +0x0000cead T l2cap_register_packet_handler +0x0000ceb9 T l2cap_register_service +0x0000cfa1 T l2cap_request_can_send_fix_channel_now_event +0x0000cfc5 T l2cap_request_can_send_now_event +0x0000cfdf T l2cap_request_connection_parameter_update +0x0000d011 T l2cap_require_security_level_2_for_outgoing_sdp +0x0000d3d5 T l2cap_send +0x0000d44d T l2cap_send_connectionless +0x0000d4dd T l2cap_send_connectionless3 +0x0000d575 T l2cap_send_echo_request +0x0000d5d9 T l2cap_send_signaling_le +0x0000d631 T l2cap_unregister_service +0x0000d815 T ll_hint_on_ce_len +0x0000daf9 T ll_set_adv_coded_scheme +0x0000db29 T ll_set_def_antenna +0x0000db45 T ll_set_initiating_coded_scheme +0x0001d925 T nibble_for_char +0x0001d9c9 T platform_config +0x0001da31 T platform_get_heap_status +0x0001da49 T platform_get_version +0x0001da51 T platform_hrng +0x0001da59 T platform_patch_rf_init_data +0x0001da75 T platform_printf +0x0001da89 T platform_raise_assertion +0x0001da9d T platform_read_persistent_reg +0x0001daad T platform_reset +0x0001dae1 T platform_set_evt_callback +0x0001daf5 T platform_set_irq_callback +0x0001db2d T platform_set_rf_clk_source +0x0001db39 T platform_set_rf_init_data +0x0001db45 T platform_set_rf_power_mapping +0x0001db51 T platform_shutdown +0x0001db55 T platform_switch_app +0x0001db81 T platform_write_persistent_reg +0x0001db91 T printf_hexdump +0x0001e68d T pvPortMalloc +0x0001e775 T pvTaskIncrementMutexHeldCount +0x0001e78d T pvTimerGetTimerID +0x0001e7b9 T pxPortInitialiseStack +0x0001e979 T reverse_128 +0x0001e97f T reverse_24 +0x0001e985 T reverse_48 +0x0001e98b T reverse_56 +0x0001e991 T reverse_64 +0x0001e997 T reverse_bd_addr +0x0001e99d T reverse_bytes +0x0001eb41 T sm_add_event_handler +0x0001ec6d T sm_address_resolution_lookup +0x0001ed47 T sm_authenticated +0x0001ed55 T sm_authorization_decline +0x0001ed75 T sm_authorization_grant +0x0001ed95 T sm_authorization_state +0x0001edb1 T sm_bonding_decline +0x0001f189 T sm_config +0x0001f295 T sm_encryption_key_size +0x0001fa65 T sm_just_works_confirm +0x0001fcb5 T sm_le_device_key +0x0001fd4d T sm_passkey_input +0x000200d9 T sm_private_random_address_generation_get +0x000200e1 T sm_private_random_address_generation_get_mode +0x000200ed T sm_private_random_address_generation_set_mode +0x00020115 T sm_private_random_address_generation_set_update_period +0x0002014d T sm_register_oob_data_callback +0x00020159 T sm_request_pairing +0x00020b93 T sm_send_security_request +0x00020bb9 T sm_set_accepted_stk_generation_methods +0x00020bc5 T sm_set_authentication_requirements +0x00020bd1 T sm_set_encryption_key_size_range +0x00020ea5 T sscanf_bd_addr +0x000211f9 T sysSetPublicDeviceAddr +0x000217c9 T uuid128_to_str +0x00021821 T uuid_add_bluetooth_prefix +0x00021841 T uuid_has_bluetooth_prefix +0x00021885 T uxQueueMessagesWaiting +0x000218ad T uxQueueMessagesWaitingFromISR +0x000218c9 T uxQueueSpacesAvailable +0x000219f9 T vPortFree +0x00021bb9 T vQueueDelete +0x00021be5 T vQueueWaitForMessageRestricted +0x00021c2d T vTaskDelay +0x00021c79 T vTaskInternalSetTimeOutState +0x00021c89 T vTaskMissedYield +0x00021c95 T vTaskPlaceOnEventList +0x00021ccd T vTaskPlaceOnEventListRestricted +0x00021d0d T vTaskPriorityDisinheritAfterTimeout +0x00021db9 T vTaskStartScheduler +0x00021e49 T vTaskStepTick +0x00021e79 T vTaskSuspendAll +0x00021e89 T vTaskSwitchContext +0x00021f31 T xPortStartScheduler +0x00021fed T xQueueAddToSet +0x00022011 T xQueueCreateCountingSemaphore +0x0002204d T xQueueCreateCountingSemaphoreStatic +0x00022091 T xQueueCreateMutex +0x000220a7 T xQueueCreateMutexStatic +0x000220c1 T xQueueCreateSet +0x000220c9 T xQueueGenericCreate +0x00022115 T xQueueGenericCreateStatic +0x0002217d T xQueueGenericReset +0x00022209 T xQueueGenericSend +0x00022375 T xQueueGenericSendFromISR +0x00022435 T xQueueGiveFromISR +0x000224d9 T xQueueGiveMutexRecursive +0x00022519 T xQueueIsQueueEmptyFromISR +0x0002253d T xQueueIsQueueFullFromISR +0x00022565 T xQueuePeek +0x0002268d T xQueuePeekFromISR +0x000226f9 T xQueueReceive +0x00022825 T xQueueReceiveFromISR +0x000228b9 T xQueueRemoveFromSet +0x000228db T xQueueSelectFromSet +0x000228ed T xQueueSelectFromSetFromISR +0x00022901 T xQueueSemaphoreTake +0x00022a6d T xQueueTakeMutexRecursive +0x00022ab1 T xTaskCheckForTimeOut +0x00022b21 T xTaskCreate +0x00022b7d T xTaskCreateStatic +0x00022bed T xTaskGetCurrentTaskHandle +0x00022bf9 T xTaskGetSchedulerState +0x00022c15 T xTaskGetTickCount +0x00022c21 T xTaskIncrementTick +0x00022ced T xTaskPriorityDisinherit +0x00022d81 T xTaskPriorityInherit +0x00022e15 T xTaskRemoveFromEventList +0x00022e95 T xTaskResumeAll +0x00022f5d T xTimerCreate +0x00022f91 T xTimerCreateStatic +0x00022fc9 T xTimerCreateTimerTask +0x00023035 T xTimerGenericCommand diff --git a/bundles/typical/ING9188xx/symdefs.s b/bundles/typical/ING9188xx/symdefs.s index 5356aee90..384075cd2 100644 --- a/bundles/typical/ING9188xx/symdefs.s +++ b/bundles/typical/ING9188xx/symdefs.s @@ -1,262 +1,267 @@ ---defsym:att_dispatch_client_can_send_now=0x00006259 ---defsym:att_dispatch_client_request_can_send_now_event=0x00006261 ---defsym:att_dispatch_register_client=0x00006279 ---defsym:att_dispatch_register_server=0x0000628d ---defsym:att_dispatch_server_can_send_now=0x000062a1 ---defsym:att_dispatch_server_request_can_send_now_event=0x000062a9 ---defsym:att_emit_general_event=0x00006379 ---defsym:att_server_can_send_packet_now=0x00006abd ---defsym:att_server_get_mtu=0x00006ac1 ---defsym:att_server_indicate=0x00006b35 ---defsym:att_server_init=0x00006bb9 ---defsym:att_server_notify=0x00006bf5 ---defsym:att_server_register_packet_handler=0x00006cdd ---defsym:att_server_request_can_send_now_event=0x00006ce9 ---defsym:att_set_db=0x00006d05 ---defsym:att_set_read_callback=0x00006d19 ---defsym:att_set_write_callback=0x00006d25 ---defsym:bd_addr_cmp=0x00006e69 ---defsym:bd_addr_copy=0x00006e6f ---defsym:bd_addr_to_str=0x00006e79 ---defsym:big_endian_read_16=0x00006eb1 ---defsym:big_endian_read_32=0x00006eb9 ---defsym:big_endian_store_16=0x00006ecd ---defsym:big_endian_store_32=0x00006ed9 ---defsym:btstack_push_user_msg=0x00007185 ---defsym:char_for_nibble=0x000073dd ---defsym:gap_add_dev_to_periodic_list=0x00007f4d ---defsym:gap_add_whitelist=0x00007f65 ---defsym:gap_aes_encrypt=0x00007f79 ---defsym:gap_clear_white_lists=0x00007fa1 ---defsym:gap_clr_adv_set=0x00007fb1 ---defsym:gap_clr_periodic_adv_list=0x00007fc1 ---defsym:gap_create_connection_cancel=0x00007fed ---defsym:gap_default_periodic_adv_sync_transfer_param=0x00007ffd ---defsym:gap_disconnect=0x00008015 ---defsym:gap_disconnect_all=0x00008041 ---defsym:gap_ext_create_connection=0x000080e9 ---defsym:gap_get_connection_parameter_range=0x000081ad ---defsym:gap_le_read_channel_map=0x000081e9 ---defsym:gap_periodic_adv_create_sync=0x0000825d ---defsym:gap_periodic_adv_create_sync_cancel=0x00008281 ---defsym:gap_periodic_adv_set_info_transfer=0x00008291 ---defsym:gap_periodic_adv_sync_transfer=0x000082a9 ---defsym:gap_periodic_adv_sync_transfer_param=0x000082c1 ---defsym:gap_periodic_adv_term_sync=0x000082dd ---defsym:gap_read_antenna_info=0x00008371 ---defsym:gap_read_periodic_adv_list_size=0x00008381 ---defsym:gap_read_phy=0x00008391 ---defsym:gap_read_remote_info=0x000083a5 ---defsym:gap_read_remote_used_features=0x000083b9 ---defsym:gap_read_rssi=0x000083cd ---defsym:gap_remove_whitelist=0x000083e1 ---defsym:gap_rmv_adv_set=0x0000846d ---defsym:gap_rmv_dev_from_periodic_list=0x00008481 ---defsym:gap_set_adv_set_random_addr=0x000084c1 ---defsym:gap_set_connection_cte_request_enable=0x0000850d ---defsym:gap_set_connection_cte_response_enable=0x00008529 ---defsym:gap_set_connection_cte_rx_param=0x0000853d ---defsym:gap_set_connection_cte_tx_param=0x00008599 ---defsym:gap_set_connection_parameter_range=0x000085ed ---defsym:gap_set_connectionless_cte_tx_enable=0x00008605 ---defsym:gap_set_connectionless_cte_tx_param=0x00008619 ---defsym:gap_set_connectionless_iq_sampling_enable=0x0000867d ---defsym:gap_set_def_phy=0x000086e1 ---defsym:gap_set_ext_adv_data=0x000086f9 ---defsym:gap_set_ext_adv_enable=0x00008711 ---defsym:gap_set_ext_adv_para=0x0000878d ---defsym:gap_set_ext_scan_enable=0x0000886d ---defsym:gap_set_ext_scan_para=0x00008885 ---defsym:gap_set_ext_scan_response_data=0x0000892d ---defsym:gap_set_host_channel_classification=0x00008945 ---defsym:gap_set_periodic_adv_data=0x00008959 ---defsym:gap_set_periodic_adv_enable=0x000089cd ---defsym:gap_set_periodic_adv_para=0x000089e1 ---defsym:gap_set_periodic_adv_rx_enable=0x000089f9 ---defsym:gap_set_phy=0x00008a0d ---defsym:gap_set_random_device_address=0x00008a29 ---defsym:gap_start_ccm=0x00008a8d ---defsym:gap_update_connection_parameters=0x00008ac1 ---defsym:gatt_client_cancel_write=0x00008fa9 ---defsym:gatt_client_discover_characteristic_descriptors=0x00008fcf ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00009011 ---defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00009061 ---defsym:gatt_client_discover_characteristics_for_service=0x000090b1 ---defsym:gatt_client_discover_primary_services=0x000090e7 ---defsym:gatt_client_discover_primary_services_by_uuid128=0x00009119 ---defsym:gatt_client_discover_primary_services_by_uuid16=0x0000915d ---defsym:gatt_client_execute_write=0x00009199 ---defsym:gatt_client_find_included_services_for_service=0x000091bf ---defsym:gatt_client_get_mtu=0x000091ed ---defsym:gatt_client_is_ready=0x00009295 ---defsym:gatt_client_listen_for_characteristic_value_updates=0x000092ab ---defsym:gatt_client_prepare_write=0x000092cf ---defsym:gatt_client_pts_suppress_mtu_exchange=0x0000930d ---defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00009319 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x00009343 ---defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009349 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x00009377 ---defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x0000937d ---defsym:gatt_client_read_multiple_characteristic_values=0x000093ab ---defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x000093db ---defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00009409 ---defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x00009455 ---defsym:gatt_client_register_handler=0x000094a1 ---defsym:gatt_client_reliable_write_long_value_of_characteristic=0x000094ad ---defsym:gatt_client_signed_write_without_response=0x000098d9 ---defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x0000999d ---defsym:gatt_client_write_client_characteristic_configuration=0x000099d7 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009a29 ---defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009a39 ---defsym:gatt_client_write_long_value_of_characteristic=0x00009a75 ---defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x00009a85 ---defsym:gatt_client_write_value_of_characteristic=0x00009ac1 ---defsym:gatt_client_write_value_of_characteristic_without_response=0x00009af7 ---defsym:hci_add_event_handler=0x0000b055 ---defsym:hci_power_control=0x0000b79d ---defsym:hci_register_acl_packet_handler=0x0000b951 ---defsym:kv_get=0x0000bfd1 ---defsym:kv_init=0x0000bfe9 ---defsym:kv_put=0x0000c039 ---defsym:kv_remove=0x0000c0b1 ---defsym:kv_value_modified=0x0000c121 ---defsym:kv_visit=0x0000c125 ---defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c1e5 ---defsym:l2cap_can_send_packet_now=0x0000c1e9 ---defsym:l2cap_create_channel=0x0000c3a1 ---defsym:l2cap_disconnect=0x0000c4d9 ---defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c77d ---defsym:l2cap_init=0x0000cbfd ---defsym:l2cap_le_send_flow_control_credit=0x0000cc45 ---defsym:l2cap_max_le_mtu=0x0000cea9 ---defsym:l2cap_max_mtu=0x0000cead ---defsym:l2cap_next_local_cid=0x0000ceb1 ---defsym:l2cap_next_sig_id=0x0000cec1 ---defsym:l2cap_register_fixed_channel=0x0000cf59 ---defsym:l2cap_register_packet_handler=0x0000cf75 ---defsym:l2cap_register_service=0x0000cf81 ---defsym:l2cap_request_can_send_fix_channel_now_event=0x0000d069 ---defsym:l2cap_request_can_send_now_event=0x0000d08d ---defsym:l2cap_request_connection_parameter_update=0x0000d0a7 ---defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d0d9 ---defsym:l2cap_send=0x0000d49d ---defsym:l2cap_send_connectionless=0x0000d515 ---defsym:l2cap_send_connectionless3=0x0000d5a5 ---defsym:l2cap_send_echo_request=0x0000d63d ---defsym:l2cap_send_signaling_le=0x0000d6a1 ---defsym:l2cap_unregister_service=0x0000d6f9 ---defsym:ll_hint_on_ce_len=0x0000d8dd ---defsym:ll_set_adv_coded_scheme=0x0000dbc1 ---defsym:ll_set_def_antenna=0x0000dbf1 ---defsym:ll_set_initiating_coded_scheme=0x0000dc0d ---defsym:nibble_for_char=0x0001d851 ---defsym:platform_config=0x0001d8f5 ---defsym:platform_get_heap_status=0x0001d941 ---defsym:platform_get_version=0x0001d959 ---defsym:platform_hrng=0x0001d961 ---defsym:platform_patch_rf_init_data=0x0001d969 ---defsym:platform_printf=0x0001d985 ---defsym:platform_raise_assertion=0x0001d999 ---defsym:platform_read_persistent_reg=0x0001d9ad ---defsym:platform_reset=0x0001d9bd ---defsym:platform_set_evt_callback=0x0001d9f1 ---defsym:platform_set_irq_callback=0x0001da05 ---defsym:platform_set_rf_clk_source=0x0001da3d ---defsym:platform_set_rf_init_data=0x0001da49 ---defsym:platform_set_rf_power_mapping=0x0001da55 ---defsym:platform_switch_app=0x0001da61 ---defsym:platform_write_persistent_reg=0x0001da85 ---defsym:printf_hexdump=0x0001da95 ---defsym:pvPortMalloc=0x0001e525 ---defsym:pvTaskIncrementMutexHeldCount=0x0001e60d ---defsym:pvTimerGetTimerID=0x0001e625 ---defsym:pxPortInitialiseStack=0x0001e651 ---defsym:reverse_128=0x0001e811 ---defsym:reverse_24=0x0001e817 ---defsym:reverse_48=0x0001e81d ---defsym:reverse_56=0x0001e823 ---defsym:reverse_64=0x0001e829 ---defsym:reverse_bd_addr=0x0001e82f ---defsym:reverse_bytes=0x0001e835 ---defsym:sm_add_event_handler=0x0001e9d9 ---defsym:sm_address_resolution_lookup=0x0001eb05 ---defsym:sm_authenticated=0x0001ebdf ---defsym:sm_authorization_decline=0x0001ebed ---defsym:sm_authorization_grant=0x0001ec0d ---defsym:sm_authorization_state=0x0001ec2d ---defsym:sm_bonding_decline=0x0001ec49 ---defsym:sm_config=0x0001f021 ---defsym:sm_encryption_key_size=0x0001f12d ---defsym:sm_just_works_confirm=0x0001f8fd ---defsym:sm_le_device_key=0x0001fb4d ---defsym:sm_passkey_input=0x0001fbe5 ---defsym:sm_private_random_address_generation_get=0x0001ff71 ---defsym:sm_private_random_address_generation_get_mode=0x0001ff79 ---defsym:sm_private_random_address_generation_set_mode=0x0001ff85 ---defsym:sm_private_random_address_generation_set_update_period=0x0001ffad ---defsym:sm_register_oob_data_callback=0x0001ffe5 ---defsym:sm_request_pairing=0x0001fff1 ---defsym:sm_send_security_request=0x00020a2b ---defsym:sm_set_accepted_stk_generation_methods=0x00020a51 ---defsym:sm_set_authentication_requirements=0x00020a5d ---defsym:sm_set_encryption_key_size_range=0x00020a69 ---defsym:sscanf_bd_addr=0x00020d3d ---defsym:sysSetPublicDeviceAddr=0x00020dc9 ---defsym:uuid128_to_str=0x0002126d ---defsym:uuid_add_bluetooth_prefix=0x000212c5 ---defsym:uuid_has_bluetooth_prefix=0x000212e5 ---defsym:uxQueueMessagesWaiting=0x00021329 ---defsym:uxQueueMessagesWaitingFromISR=0x00021351 ---defsym:uxQueueSpacesAvailable=0x0002136d ---defsym:vPortFree=0x0002149d ---defsym:vQueueDelete=0x00021571 ---defsym:vQueueWaitForMessageRestricted=0x0002159d ---defsym:vTaskDelay=0x000215e5 ---defsym:vTaskInternalSetTimeOutState=0x00021631 ---defsym:vTaskMissedYield=0x00021641 ---defsym:vTaskPlaceOnEventList=0x0002164d ---defsym:vTaskPlaceOnEventListRestricted=0x00021685 ---defsym:vTaskPriorityDisinheritAfterTimeout=0x000216c5 ---defsym:vTaskStartScheduler=0x00021771 ---defsym:vTaskSuspendAll=0x00021801 ---defsym:vTaskSwitchContext=0x00021811 ---defsym:xPortStartScheduler=0x000218b9 ---defsym:xQueueAddToSet=0x00021975 ---defsym:xQueueCreateCountingSemaphore=0x00021999 ---defsym:xQueueCreateCountingSemaphoreStatic=0x000219d5 ---defsym:xQueueCreateMutex=0x00021a19 ---defsym:xQueueCreateMutexStatic=0x00021a2f ---defsym:xQueueCreateSet=0x00021a49 ---defsym:xQueueGenericCreate=0x00021a51 ---defsym:xQueueGenericCreateStatic=0x00021a9d ---defsym:xQueueGenericReset=0x00021b05 ---defsym:xQueueGenericSend=0x00021b91 ---defsym:xQueueGenericSendFromISR=0x00021cfd ---defsym:xQueueGiveFromISR=0x00021dbd ---defsym:xQueueGiveMutexRecursive=0x00021e61 ---defsym:xQueueIsQueueEmptyFromISR=0x00021ea1 ---defsym:xQueueIsQueueFullFromISR=0x00021ec5 ---defsym:xQueuePeek=0x00021eed ---defsym:xQueuePeekFromISR=0x00022015 ---defsym:xQueueReceive=0x00022081 ---defsym:xQueueReceiveFromISR=0x000221ad ---defsym:xQueueRemoveFromSet=0x00022241 ---defsym:xQueueSelectFromSet=0x00022263 ---defsym:xQueueSelectFromSetFromISR=0x00022275 ---defsym:xQueueSemaphoreTake=0x00022289 ---defsym:xQueueTakeMutexRecursive=0x000223f5 ---defsym:xTaskCheckForTimeOut=0x00022439 ---defsym:xTaskCreate=0x000224a9 ---defsym:xTaskCreateStatic=0x00022505 ---defsym:xTaskGetCurrentTaskHandle=0x00022575 ---defsym:xTaskGetSchedulerState=0x00022581 ---defsym:xTaskGetTickCount=0x0002259d ---defsym:xTaskIncrementTick=0x000225a9 ---defsym:xTaskPriorityDisinherit=0x00022675 ---defsym:xTaskPriorityInherit=0x00022709 ---defsym:xTaskRemoveFromEventList=0x0002279d ---defsym:xTaskResumeAll=0x00022819 ---defsym:xTimerCreate=0x000228e1 ---defsym:xTimerCreateStatic=0x00022915 ---defsym:xTimerCreateTimerTask=0x0002294d ---defsym:xTimerGenericCommand=0x000229b9 +--defsym:att_dispatch_client_can_send_now=0x00006329 +--defsym:att_dispatch_client_request_can_send_now_event=0x0000632f +--defsym:att_dispatch_register_client=0x00006335 +--defsym:att_dispatch_register_server=0x00006349 +--defsym:att_dispatch_server_can_send_now=0x0000635d +--defsym:att_dispatch_server_request_can_send_now_event=0x00006363 +--defsym:att_emit_general_event=0x00006421 +--defsym:att_server_can_send_packet_now=0x00006b59 +--defsym:att_server_get_mtu=0x00006b5d +--defsym:att_server_indicate=0x00006bd1 +--defsym:att_server_init=0x00006c55 +--defsym:att_server_notify=0x00006c91 +--defsym:att_server_register_packet_handler=0x00006d79 +--defsym:att_server_request_can_send_now_event=0x00006d85 +--defsym:att_set_db=0x00006da1 +--defsym:att_set_read_callback=0x00006db5 +--defsym:att_set_write_callback=0x00006dc1 +--defsym:bd_addr_cmp=0x00006f05 +--defsym:bd_addr_copy=0x00006f0b +--defsym:bd_addr_to_str=0x00006f15 +--defsym:big_endian_read_16=0x00006f4d +--defsym:big_endian_read_32=0x00006f55 +--defsym:big_endian_store_16=0x00006f69 +--defsym:big_endian_store_32=0x00006f75 +--defsym:btstack_push_user_msg=0x000072f9 +--defsym:char_for_nibble=0x00007565 +--defsym:eTaskConfirmSleepModeStatus=0x000077f5 +--defsym:gap_add_dev_to_periodic_list=0x00007e99 +--defsym:gap_add_whitelist=0x00007eb1 +--defsym:gap_aes_encrypt=0x00007ec5 +--defsym:gap_clear_white_lists=0x00007eed +--defsym:gap_clr_adv_set=0x00007efd +--defsym:gap_clr_periodic_adv_list=0x00007f0d +--defsym:gap_create_connection_cancel=0x00007f39 +--defsym:gap_default_periodic_adv_sync_transfer_param=0x00007f49 +--defsym:gap_disconnect=0x00007f61 +--defsym:gap_disconnect_all=0x00007f8d +--defsym:gap_ext_create_connection=0x00008035 +--defsym:gap_get_connection_parameter_range=0x000080f9 +--defsym:gap_le_read_channel_map=0x00008135 +--defsym:gap_periodic_adv_create_sync=0x000081a9 +--defsym:gap_periodic_adv_create_sync_cancel=0x000081cd +--defsym:gap_periodic_adv_set_info_transfer=0x000081dd +--defsym:gap_periodic_adv_sync_transfer=0x000081f5 +--defsym:gap_periodic_adv_sync_transfer_param=0x0000820d +--defsym:gap_periodic_adv_term_sync=0x00008229 +--defsym:gap_read_antenna_info=0x000082bd +--defsym:gap_read_periodic_adv_list_size=0x000082cd +--defsym:gap_read_phy=0x000082dd +--defsym:gap_read_remote_info=0x000082f1 +--defsym:gap_read_remote_used_features=0x00008305 +--defsym:gap_read_rssi=0x00008319 +--defsym:gap_remove_whitelist=0x0000832d +--defsym:gap_rmv_adv_set=0x000083b9 +--defsym:gap_rmv_dev_from_periodic_list=0x000083cd +--defsym:gap_set_adv_set_random_addr=0x0000840d +--defsym:gap_set_connection_cte_request_enable=0x00008459 +--defsym:gap_set_connection_cte_response_enable=0x00008475 +--defsym:gap_set_connection_cte_rx_param=0x00008489 +--defsym:gap_set_connection_cte_tx_param=0x000084e5 +--defsym:gap_set_connection_parameter_range=0x00008539 +--defsym:gap_set_connectionless_cte_tx_enable=0x00008551 +--defsym:gap_set_connectionless_cte_tx_param=0x00008565 +--defsym:gap_set_connectionless_iq_sampling_enable=0x000085c5 +--defsym:gap_set_def_phy=0x00008629 +--defsym:gap_set_ext_adv_data=0x00008641 +--defsym:gap_set_ext_adv_enable=0x00008659 +--defsym:gap_set_ext_adv_para=0x000086d5 +--defsym:gap_set_ext_scan_enable=0x000087b5 +--defsym:gap_set_ext_scan_para=0x000087cd +--defsym:gap_set_ext_scan_response_data=0x00008875 +--defsym:gap_set_host_channel_classification=0x0000888d +--defsym:gap_set_periodic_adv_data=0x000088a1 +--defsym:gap_set_periodic_adv_enable=0x00008915 +--defsym:gap_set_periodic_adv_para=0x00008929 +--defsym:gap_set_periodic_adv_rx_enable=0x00008941 +--defsym:gap_set_phy=0x00008955 +--defsym:gap_set_random_device_address=0x00008971 +--defsym:gap_start_ccm=0x000089d5 +--defsym:gap_update_connection_parameters=0x00008a09 +--defsym:gatt_client_cancel_write=0x00008ef1 +--defsym:gatt_client_discover_characteristic_descriptors=0x00008f17 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid128=0x00008f59 +--defsym:gatt_client_discover_characteristics_for_handle_range_by_uuid16=0x00008fa9 +--defsym:gatt_client_discover_characteristics_for_service=0x00008ff9 +--defsym:gatt_client_discover_primary_services=0x0000902f +--defsym:gatt_client_discover_primary_services_by_uuid128=0x00009061 +--defsym:gatt_client_discover_primary_services_by_uuid16=0x000090a5 +--defsym:gatt_client_execute_write=0x000090e1 +--defsym:gatt_client_find_included_services_for_service=0x00009107 +--defsym:gatt_client_get_mtu=0x00009135 +--defsym:gatt_client_is_ready=0x000091dd +--defsym:gatt_client_listen_for_characteristic_value_updates=0x000091f3 +--defsym:gatt_client_prepare_write=0x00009217 +--defsym:gatt_client_pts_suppress_mtu_exchange=0x00009255 +--defsym:gatt_client_read_characteristic_descriptor_using_descriptor_handle=0x00009261 +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle=0x0000928b +--defsym:gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009291 +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle=0x000092bf +--defsym:gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset=0x000092c5 +--defsym:gatt_client_read_multiple_characteristic_values=0x000092f3 +--defsym:gatt_client_read_value_of_characteristic_using_value_handle=0x00009323 +--defsym:gatt_client_read_value_of_characteristics_by_uuid128=0x00009351 +--defsym:gatt_client_read_value_of_characteristics_by_uuid16=0x0000939d +--defsym:gatt_client_register_handler=0x000093e9 +--defsym:gatt_client_reliable_write_long_value_of_characteristic=0x000093f5 +--defsym:gatt_client_signed_write_without_response=0x00009821 +--defsym:gatt_client_write_characteristic_descriptor_using_descriptor_handle=0x000098e5 +--defsym:gatt_client_write_client_characteristic_configuration=0x0000991f +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle=0x00009971 +--defsym:gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset=0x00009981 +--defsym:gatt_client_write_long_value_of_characteristic=0x000099bd +--defsym:gatt_client_write_long_value_of_characteristic_with_offset=0x000099cd +--defsym:gatt_client_write_value_of_characteristic=0x00009a09 +--defsym:gatt_client_write_value_of_characteristic_without_response=0x00009a3f +--defsym:hci_add_event_handler=0x0000af19 +--defsym:hci_power_control=0x0000b6c9 +--defsym:hci_register_acl_packet_handler=0x0000b87d +--defsym:kv_commit=0x0000bec1 +--defsym:kv_get=0x0000bef9 +--defsym:kv_init=0x0000bf11 +--defsym:kv_put=0x0000bf61 +--defsym:kv_remove=0x0000bfd9 +--defsym:kv_remove_all=0x0000c015 +--defsym:kv_value_modified=0x0000c059 +--defsym:kv_visit=0x0000c05d +--defsym:l2cap_can_send_fixed_channel_packet_now=0x0000c11d +--defsym:l2cap_can_send_packet_now=0x0000c121 +--defsym:l2cap_create_channel=0x0000c2d9 +--defsym:l2cap_disconnect=0x0000c411 +--defsym:l2cap_get_remote_mtu_for_local_cid=0x0000c6b5 +--defsym:l2cap_init=0x0000cb35 +--defsym:l2cap_le_send_flow_control_credit=0x0000cb7d +--defsym:l2cap_max_le_mtu=0x0000cde1 +--defsym:l2cap_max_mtu=0x0000cde5 +--defsym:l2cap_next_local_cid=0x0000cde9 +--defsym:l2cap_next_sig_id=0x0000cdf9 +--defsym:l2cap_register_fixed_channel=0x0000ce91 +--defsym:l2cap_register_packet_handler=0x0000cead +--defsym:l2cap_register_service=0x0000ceb9 +--defsym:l2cap_request_can_send_fix_channel_now_event=0x0000cfa1 +--defsym:l2cap_request_can_send_now_event=0x0000cfc5 +--defsym:l2cap_request_connection_parameter_update=0x0000cfdf +--defsym:l2cap_require_security_level_2_for_outgoing_sdp=0x0000d011 +--defsym:l2cap_send=0x0000d3d5 +--defsym:l2cap_send_connectionless=0x0000d44d +--defsym:l2cap_send_connectionless3=0x0000d4dd +--defsym:l2cap_send_echo_request=0x0000d575 +--defsym:l2cap_send_signaling_le=0x0000d5d9 +--defsym:l2cap_unregister_service=0x0000d631 +--defsym:ll_hint_on_ce_len=0x0000d815 +--defsym:ll_set_adv_coded_scheme=0x0000daf9 +--defsym:ll_set_def_antenna=0x0000db29 +--defsym:ll_set_initiating_coded_scheme=0x0000db45 +--defsym:nibble_for_char=0x0001d925 +--defsym:platform_config=0x0001d9c9 +--defsym:platform_get_heap_status=0x0001da31 +--defsym:platform_get_version=0x0001da49 +--defsym:platform_hrng=0x0001da51 +--defsym:platform_patch_rf_init_data=0x0001da59 +--defsym:platform_printf=0x0001da75 +--defsym:platform_raise_assertion=0x0001da89 +--defsym:platform_read_persistent_reg=0x0001da9d +--defsym:platform_reset=0x0001daad +--defsym:platform_set_evt_callback=0x0001dae1 +--defsym:platform_set_irq_callback=0x0001daf5 +--defsym:platform_set_rf_clk_source=0x0001db2d +--defsym:platform_set_rf_init_data=0x0001db39 +--defsym:platform_set_rf_power_mapping=0x0001db45 +--defsym:platform_shutdown=0x0001db51 +--defsym:platform_switch_app=0x0001db55 +--defsym:platform_write_persistent_reg=0x0001db81 +--defsym:printf_hexdump=0x0001db91 +--defsym:pvPortMalloc=0x0001e68d +--defsym:pvTaskIncrementMutexHeldCount=0x0001e775 +--defsym:pvTimerGetTimerID=0x0001e78d +--defsym:pxPortInitialiseStack=0x0001e7b9 +--defsym:reverse_128=0x0001e979 +--defsym:reverse_24=0x0001e97f +--defsym:reverse_48=0x0001e985 +--defsym:reverse_56=0x0001e98b +--defsym:reverse_64=0x0001e991 +--defsym:reverse_bd_addr=0x0001e997 +--defsym:reverse_bytes=0x0001e99d +--defsym:sm_add_event_handler=0x0001eb41 +--defsym:sm_address_resolution_lookup=0x0001ec6d +--defsym:sm_authenticated=0x0001ed47 +--defsym:sm_authorization_decline=0x0001ed55 +--defsym:sm_authorization_grant=0x0001ed75 +--defsym:sm_authorization_state=0x0001ed95 +--defsym:sm_bonding_decline=0x0001edb1 +--defsym:sm_config=0x0001f189 +--defsym:sm_encryption_key_size=0x0001f295 +--defsym:sm_just_works_confirm=0x0001fa65 +--defsym:sm_le_device_key=0x0001fcb5 +--defsym:sm_passkey_input=0x0001fd4d +--defsym:sm_private_random_address_generation_get=0x000200d9 +--defsym:sm_private_random_address_generation_get_mode=0x000200e1 +--defsym:sm_private_random_address_generation_set_mode=0x000200ed +--defsym:sm_private_random_address_generation_set_update_period=0x00020115 +--defsym:sm_register_oob_data_callback=0x0002014d +--defsym:sm_request_pairing=0x00020159 +--defsym:sm_send_security_request=0x00020b93 +--defsym:sm_set_accepted_stk_generation_methods=0x00020bb9 +--defsym:sm_set_authentication_requirements=0x00020bc5 +--defsym:sm_set_encryption_key_size_range=0x00020bd1 +--defsym:sscanf_bd_addr=0x00020ea5 +--defsym:sysSetPublicDeviceAddr=0x000211f9 +--defsym:uuid128_to_str=0x000217c9 +--defsym:uuid_add_bluetooth_prefix=0x00021821 +--defsym:uuid_has_bluetooth_prefix=0x00021841 +--defsym:uxQueueMessagesWaiting=0x00021885 +--defsym:uxQueueMessagesWaitingFromISR=0x000218ad +--defsym:uxQueueSpacesAvailable=0x000218c9 +--defsym:vPortFree=0x000219f9 +--defsym:vQueueDelete=0x00021bb9 +--defsym:vQueueWaitForMessageRestricted=0x00021be5 +--defsym:vTaskDelay=0x00021c2d +--defsym:vTaskInternalSetTimeOutState=0x00021c79 +--defsym:vTaskMissedYield=0x00021c89 +--defsym:vTaskPlaceOnEventList=0x00021c95 +--defsym:vTaskPlaceOnEventListRestricted=0x00021ccd +--defsym:vTaskPriorityDisinheritAfterTimeout=0x00021d0d +--defsym:vTaskStartScheduler=0x00021db9 +--defsym:vTaskStepTick=0x00021e49 +--defsym:vTaskSuspendAll=0x00021e79 +--defsym:vTaskSwitchContext=0x00021e89 +--defsym:xPortStartScheduler=0x00021f31 +--defsym:xQueueAddToSet=0x00021fed +--defsym:xQueueCreateCountingSemaphore=0x00022011 +--defsym:xQueueCreateCountingSemaphoreStatic=0x0002204d +--defsym:xQueueCreateMutex=0x00022091 +--defsym:xQueueCreateMutexStatic=0x000220a7 +--defsym:xQueueCreateSet=0x000220c1 +--defsym:xQueueGenericCreate=0x000220c9 +--defsym:xQueueGenericCreateStatic=0x00022115 +--defsym:xQueueGenericReset=0x0002217d +--defsym:xQueueGenericSend=0x00022209 +--defsym:xQueueGenericSendFromISR=0x00022375 +--defsym:xQueueGiveFromISR=0x00022435 +--defsym:xQueueGiveMutexRecursive=0x000224d9 +--defsym:xQueueIsQueueEmptyFromISR=0x00022519 +--defsym:xQueueIsQueueFullFromISR=0x0002253d +--defsym:xQueuePeek=0x00022565 +--defsym:xQueuePeekFromISR=0x0002268d +--defsym:xQueueReceive=0x000226f9 +--defsym:xQueueReceiveFromISR=0x00022825 +--defsym:xQueueRemoveFromSet=0x000228b9 +--defsym:xQueueSelectFromSet=0x000228db +--defsym:xQueueSelectFromSetFromISR=0x000228ed +--defsym:xQueueSemaphoreTake=0x00022901 +--defsym:xQueueTakeMutexRecursive=0x00022a6d +--defsym:xTaskCheckForTimeOut=0x00022ab1 +--defsym:xTaskCreate=0x00022b21 +--defsym:xTaskCreateStatic=0x00022b7d +--defsym:xTaskGetCurrentTaskHandle=0x00022bed +--defsym:xTaskGetSchedulerState=0x00022bf9 +--defsym:xTaskGetTickCount=0x00022c15 +--defsym:xTaskIncrementTick=0x00022c21 +--defsym:xTaskPriorityDisinherit=0x00022ced +--defsym:xTaskPriorityInherit=0x00022d81 +--defsym:xTaskRemoveFromEventList=0x00022e15 +--defsym:xTaskResumeAll=0x00022e95 +--defsym:xTimerCreate=0x00022f5d +--defsym:xTimerCreateStatic=0x00022f91 +--defsym:xTimerCreateTimerTask=0x00022fc9 +--defsym:xTimerGenericCommand=0x00023035 diff --git a/bundles/typical/inc/kv_storage.h b/bundles/typical/inc/kv_storage.h index 22b34aae6..83c62ed53 100644 --- a/bundles/typical/inc/kv_storage.h +++ b/bundles/typical/inc/kv_storage.h @@ -97,9 +97,7 @@ void kv_init(f_kv_write_to_nvm f_write, /** * @brief remove all k-v parirs */ -// void kv_remove_all(void); -// WARNING: ^^^ this API is not available in this release - +void kv_remove_all(void); /** * @brief remove a k-v pair @@ -136,9 +134,7 @@ void kv_value_modified(void); /** * @brief commited whole db to nvm immediately */ -// void kv_commit(void); -// WARNING: ^^^ this API is not available in this release - +void kv_commit(void); /** * @brief traverse each k-v pair diff --git a/bundles/typical/inc/os/portable/GCC/ARM_CM3/port.c b/bundles/typical/inc/os/portable/GCC/ARM_CM3/port.c deleted file mode 100644 index 3c0c8e063..000000000 --- a/bundles/typical/inc/os/portable/GCC/ARM_CM3/port.c +++ /dev/null @@ -1,717 +0,0 @@ -/* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the ARM CM3 port. - *----------------------------------------------------------*/ - -/* Scheduler includes. */ -#include "FreeRTOS.h" -#include "task.h" - -/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is -defined. The value should also ensure backward compatibility. -FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ -#ifndef configKERNEL_INTERRUPT_PRIORITY - #define configKERNEL_INTERRUPT_PRIORITY 255 -#endif - -#ifndef configSYSTICK_CLOCK_HZ - #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ - /* Ensure the SysTick is clocked at the same frequency as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) -#else - /* The way the SysTick is clocked is not modified in case it is not the same - as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 0 ) -#endif - -/* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) -/* ...then bits in the registers. */ -#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) -#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) -#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) -#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) - -#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) - -/* Constants required to check the validity of an interrupt priority. */ -#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) -#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) -#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) -#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) -#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) -#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) -#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) -#define portPRIGROUP_SHIFT ( 8UL ) - -/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ -#define portVECTACTIVE_MASK ( 0xFFUL ) - -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000UL ) - -/* The systick is a 24-bit counter. */ -#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) - -/* A fiddle factor to estimate the number of SysTick counts that would have -occurred while the SysTick counter is stopped during tickless idle -calculations. */ -#define portMISSED_COUNTS_FACTOR ( 45UL ) - -/* For strict compliance with the Cortex-M spec the task start address should -have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ -#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) - -/* Let the user override the pre-loading of the initial LR with the address of -prvTaskExitError() in case it messes up unwinding of the stack in the -debugger. */ -#ifdef configTASK_RETURN_ADDRESS - #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS -#else - #define portTASK_RETURN_ADDRESS prvTaskExitError -#endif - -/* - * Setup the timer to generate the tick interrupts. The implementation in this - * file is weak to allow application writers to change the timer used to - * generate the tick interrupt. - */ -void vPortSetupTimerInterrupt( void ); - -/* - * Exception handlers. - */ -void xPortPendSVHandler( void ) __attribute__ (( naked )); -void xPortSysTickHandler( void ); -void vPortSVCHandler( void ) __attribute__ (( naked )); - -/* - * Start first task is a separate function so it can be tested in isolation. - */ -static void prvPortStartFirstTask( void ) __attribute__ (( naked )); - -/* - * Used to catch tasks that attempt to return from their implementing function. - */ -static void prvTaskExitError( void ); - -/*-----------------------------------------------------------*/ - -/* Each task maintains its own interrupt status in the critical nesting -variable. */ -static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; - -/* - * The number of SysTick increments that make up one tick period. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulTimerCountsForOneTick = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * The maximum number of tick periods that can be suppressed is limited by the - * 24 bit resolution of the SysTick timer. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t xMaximumPossibleSuppressedTicks = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Compensate for the CPU cycles that pass while the SysTick is stopped (low - * power functionality only. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulStoppedTimerCompensation = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure - * FreeRTOS API functions are not called from interrupts that have been assigned - * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. - */ -#if( configASSERT_DEFINED == 1 ) - static uint8_t ucMaxSysCallPriority = 0; - static uint32_t ulMaxPRIGROUPValue = 0; - static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; -#endif /* configASSERT_DEFINED */ - -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) -{ - /* Simulate the stack frame as it would be created by a context switch - interrupt. */ - pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ - *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - pxTopOfStack--; - *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - pxTopOfStack--; - *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ - pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -static void prvTaskExitError( void ) -{ -volatile uint32_t ulDummy = 0UL; - - /* A function that implements a task must not exit or attempt to return to - its caller as there is nothing to return to. If a task wants to exit it - should instead call vTaskDelete( NULL ). - - Artificially force an assert() to be triggered if configASSERT() is - defined, then stop here so application writers can catch the error. */ - configASSERT( uxCriticalNesting == ~0UL ); - portDISABLE_INTERRUPTS(); - while( ulDummy == 0 ) - { - /* This file calls prvTaskExitError() after the scheduler has been - started to remove a compiler warning about the function being defined - but never called. ulDummy is used purely to quieten other warnings - about code appearing after this function is called - making ulDummy - volatile makes the compiler think the function could return and - therefore not output an 'unreachable code' warning for code that appears - after it. */ - } -} -/*-----------------------------------------------------------*/ - -void vPortSVCHandler( void ) -{ - __asm volatile ( - " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ - " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ - " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ - " ldmia r0!, {r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ - " msr psp, r0 \n" /* Restore the task stack pointer. */ - " isb \n" - " mov r0, #0 \n" - " msr basepri, r0 \n" - " orr r14, #0xd \n" - " bx r14 \n" - " \n" - " .align 4 \n" - "pxCurrentTCBConst2: .word pxCurrentTCB \n" - ); -} -/*-----------------------------------------------------------*/ - -static void prvPortStartFirstTask( void ) -{ - __asm volatile( - " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ - " ldr r0, [r0] \n" - " ldr r0, [r0] \n" - " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ - " cpsie i \n" /* Globally enable interrupts. */ - " cpsie f \n" - " dsb \n" - " isb \n" - " svc 0 \n" /* System call to start first task. */ - " nop \n" - ); -} -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -BaseType_t xPortStartScheduler( void ) -{ - /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. - See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ - configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); - - #if( configASSERT_DEFINED == 1 ) - { - volatile uint32_t ulOriginalPriority; - volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - volatile uint8_t ucMaxPriorityValue; - - /* Determine the maximum priority from which ISR safe FreeRTOS API - functions can be called. ISR safe functions are those that end in - "FromISR". FreeRTOS maintains separate thread and ISR API functions to - ensure interrupt entry is as fast and simple as possible. - - Save the interrupt priority value that is about to be clobbered. */ - ulOriginalPriority = *pucFirstUserPriorityRegister; - - /* Determine the number of priority bits available. First write to all - possible bits. */ - *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - - /* Read the value back to see how many bits stuck. */ - ucMaxPriorityValue = *pucFirstUserPriorityRegister; - - /* Use the same mask on the maximum system call priority. */ - ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - - /* Calculate the maximum acceptable priority group value for the number - of bits read back. */ - ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - { - ulMaxPRIGROUPValue--; - ucMaxPriorityValue <<= ( uint8_t ) 0x01; - } - - #ifdef __NVIC_PRIO_BITS - { - /* Check the CMSIS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); - } - #endif - - #ifdef configPRIO_BITS - { - /* Check the FreeRTOS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - } - #endif - - /* Shift the priority group value back to its position within the AIRCR - register. */ - ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - - /* Restore the clobbered interrupt priority register to its original - value. */ - *pucFirstUserPriorityRegister = ulOriginalPriority; - } - #endif /* conifgASSERT_DEFINED */ - - /* Make PendSV and SysTick the lowest priority interrupts. */ - portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - - /* Start the timer that generates the tick ISR. Interrupts are disabled - here already. */ - vPortSetupTimerInterrupt(); - - /* Initialise the critical nesting count ready for the first task. */ - uxCriticalNesting = 0; - - /* Start the first task. */ - prvPortStartFirstTask(); - - /* Should never get here as the tasks will now be executing! Call the task - exit error function to prevent compiler warnings about a static function - not being called in the case that the application writer overrides this - functionality by defining configTASK_RETURN_ADDRESS. Call - vTaskSwitchContext() so link time optimisation does not remove the - symbol. */ - vTaskSwitchContext(); - prvTaskExitError(); - - /* Should not get here! */ - return 0; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* Not implemented in ports where there is nothing to return to. - Artificially force an assert. */ - configASSERT( uxCriticalNesting == 1000UL ); -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; - - /* This is not the interrupt safe version of the enter critical function so - assert() if it is being called from an interrupt context. Only API - functions that end in "FromISR" can be used in an interrupt. Only assert if - the critical nesting count is 1 to protect against recursive calls if the - assert function also uses a critical section. */ - if( uxCriticalNesting == 1 ) - { - configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - } -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - configASSERT( uxCriticalNesting ); - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -void xPortPendSVHandler( void ) -{ - /* This is a naked function. */ - - __asm volatile - ( - " mrs r0, psp \n" - " isb \n" - " \n" - " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ - " ldr r2, [r3] \n" - " \n" - " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ - " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ - " \n" - " stmdb sp!, {r3, r14} \n" - " mov r0, %0 \n" - " msr basepri, r0 \n" - " bl vTaskSwitchContext \n" - " mov r0, #0 \n" - " msr basepri, r0 \n" - " ldmia sp!, {r3, r14} \n" - " \n" /* Restore the context, including the critical nesting count. */ - " ldr r1, [r3] \n" - " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ - " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ - " msr psp, r0 \n" - " isb \n" - " bx r14 \n" - " \n" - " .align 4 \n" - "pxCurrentTCBConst: .word pxCurrentTCB \n" - ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) - ); -} -/*-----------------------------------------------------------*/ - -void xPortSysTickHandler( void ) -{ - /* The SysTick runs at the lowest interrupt priority, so when this interrupt - executes all interrupts must be unmasked. There is therefore no need to - save and then restore the interrupt mask value as its value is already - known. */ - portDISABLE_INTERRUPTS(); - { - /* Increment the RTOS tick. */ - if( xTaskIncrementTick() != pdFALSE ) - { - /* A context switch is required. Context switching is performed in - the PendSV interrupt. Pend the PendSV interrupt. */ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - } - } - portENABLE_INTERRUPTS(); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE == 1 ) - - __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) - { - uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; - TickType_t xModifiableIdleTime; - - /* Make sure the SysTick reload value does not overflow the counter. */ - if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) - { - xExpectedIdleTime = xMaximumPossibleSuppressedTicks; - } - - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; - - /* Calculate the reload value required to wait xExpectedIdleTime - tick periods. -1 is used because this code will execute part way - through one of the tick periods. */ - ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); - if( ulReloadValue > ulStoppedTimerCompensation ) - { - ulReloadValue -= ulStoppedTimerCompensation; - } - - /* Enter a critical section but don't use the taskENTER_CRITICAL() - method as that will mask interrupts that should exit sleep mode. */ - __asm volatile( "cpsid i" ::: "memory" ); - __asm volatile( "dsb" ); - __asm volatile( "isb" ); - - /* If a context switch is pending or a task is waiting for the scheduler - to be unsuspended then abandon the low power entry. */ - if( eTaskConfirmSleepModeStatus() == eAbortSleep ) - { - /* Restart from whatever is left in the count register to complete - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Reset the reload register to the value required for normal tick - periods. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Re-enable interrupts - see comments above the cpsid instruction() - above. */ - __asm volatile( "cpsie i" ::: "memory" ); - } - else - { - /* Set the new reload value. */ - portNVIC_SYSTICK_LOAD_REG = ulReloadValue; - - /* Clear the SysTick count flag and set the count value back to - zero. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can - set its parameter to 0 to indicate that its implementation contains - its own wait for interrupt or wait for event instruction, and so wfi - should not be executed again. However, the original expected idle - time variable must remain unmodified, so a copy is taken. */ - xModifiableIdleTime = xExpectedIdleTime; - configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); - if( xModifiableIdleTime > 0 ) - { - __asm volatile( "dsb" ::: "memory" ); - __asm volatile( "wfi" ); - __asm volatile( "isb" ); - } - configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); - - /* Re-enable interrupts to allow the interrupt that brought the MCU - out of sleep mode to execute immediately. see comments above - __disable_interrupt() call above. */ - __asm volatile( "cpsie i" ::: "memory" ); - __asm volatile( "dsb" ); - __asm volatile( "isb" ); - - /* Disable interrupts again because the clock is about to be stopped - and interrupts that execute while the clock is stopped will increase - any slippage between the time maintained by the RTOS and calendar - time. */ - __asm volatile( "cpsid i" ::: "memory" ); - __asm volatile( "dsb" ); - __asm volatile( "isb" ); - - /* Disable the SysTick clock without reading the - portNVIC_SYSTICK_CTRL_REG register to ensure the - portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, - the time the SysTick is stopped for is accounted for as best it can - be, but using the tickless mode will inevitably result in some tiny - drift of the time maintained by the kernel with respect to calendar - time*/ - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); - - /* Determine if the SysTick clock has already counted to zero and - been set back to the current reload value (the reload back being - correct for the entire expected idle time) or if the SysTick is yet - to count to zero (in which case an interrupt other than the SysTick - must have brought the system out of sleep mode). */ - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) - { - uint32_t ulCalculatedLoadValue; - - /* The tick interrupt is already pending, and the SysTick count - reloaded with ulReloadValue. Reset the - portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick - period. */ - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); - - /* Don't allow a tiny value, or values that have somehow - underflowed because the post sleep hook did something - that took too long. */ - if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) - { - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); - } - - portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; - - /* As the pending tick will be processed as soon as this - function exits, the tick value maintained by the tick is stepped - forward by one less than the time spent waiting. */ - ulCompleteTickPeriods = xExpectedIdleTime - 1UL; - } - else - { - /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted rounded to complete tick - periods (not the ulReload value which accounted for part - ticks). */ - ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* How many complete tick periods passed while the processor - was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; - - /* The reload value is set to whatever fraction of a single tick - period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; - } - - /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG - again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - vTaskStepTick( ulCompleteTickPeriods ); - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Exit with interrpts enabled. */ - __asm volatile( "cpsie i" ::: "memory" ); - } - } - -#endif /* configUSE_TICKLESS_IDLE */ -/*-----------------------------------------------------------*/ - -/* - * Setup the systick timer to generate the tick interrupts at the required - * frequency. - */ -__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) -{ - /* Calculate the constants required to configure the tick interrupt. */ - #if( configUSE_TICKLESS_IDLE == 1 ) - { - ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); - xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; - ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); - } - #endif /* configUSE_TICKLESS_IDLE */ - - /* Stop and clear the SysTick. */ - portNVIC_SYSTICK_CTRL_REG = 0UL; - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); -} -/*-----------------------------------------------------------*/ - -#if( configASSERT_DEFINED == 1 ) - - void vPortValidateInterruptPriority( void ) - { - uint32_t ulCurrentInterrupt; - uint8_t ucCurrentPriority; - - /* Obtain the number of the currently executing interrupt. */ - __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" ); - - /* Is the interrupt number a user defined interrupt? */ - if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) - { - /* Look up the interrupt's priority. */ - ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; - - /* The following assertion will fail if a service routine (ISR) for - an interrupt that has been assigned a priority above - configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API - function. ISR safe FreeRTOS API functions must *only* be called - from interrupts that have been assigned a priority at or below - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Numerically low interrupt priority numbers represent logically high - interrupt priorities, therefore the priority of the interrupt must - be set to a value equal to or numerically *higher* than - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Interrupts that use the FreeRTOS API must not be left at their - default priority of zero as that is the highest possible priority, - which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, - and therefore also guaranteed to be invalid. - - FreeRTOS maintains separate thread and ISR API functions to ensure - interrupt entry is as fast and simple as possible. - - The following links provide detailed information: - http://www.freertos.org/RTOS-Cortex-M3-M4.html - http://www.freertos.org/FAQHelp.html */ - configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); - } - - /* Priority grouping: The interrupt controller (NVIC) allows the bits - that define each interrupt's priority to be split between bits that - define the interrupt's pre-emption priority bits and bits that define - the interrupt's sub-priority. For simplicity all bits must be defined - to be pre-emption priority bits. The following assertion will fail if - this is not the case (if some bits represent a sub-priority). - - If the application only uses CMSIS libraries for interrupt - configuration then the correct setting can be achieved on all Cortex-M - devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the - scheduler. Note however that some vendor specific peripheral libraries - assume a non-zero priority group setting, in which cases using a value - of zero will result in unpredictable behaviour. */ - configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); - } - -#endif /* configASSERT_DEFINED */ - - - - - - - - - - - - - - - - - - - - - diff --git a/bundles/typical/inc/os/portable/IAR/ARM_CM3/port.c b/bundles/typical/inc/os/portable/IAR/ARM_CM3/port.c deleted file mode 100644 index bdbfdb7cc..000000000 --- a/bundles/typical/inc/os/portable/IAR/ARM_CM3/port.c +++ /dev/null @@ -1,619 +0,0 @@ -/* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the ARM CM3 port. - *----------------------------------------------------------*/ - -/* IAR includes. */ -#include - -/* Scheduler includes. */ -#include "FreeRTOS.h" -#include "task.h" - -#if( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) - #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html -#endif - -#ifndef configSYSTICK_CLOCK_HZ - #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ - /* Ensure the SysTick is clocked at the same frequency as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) -#else - /* The way the SysTick is clocked is not modified in case it is not the same - as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 0 ) -#endif - -/* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) -/* ...then bits in the registers. */ -#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) -#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) -#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) -#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) - -#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) - -/* Constants required to check the validity of an interrupt priority. */ -#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) -#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) -#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) -#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) -#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) -#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) -#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) -#define portPRIGROUP_SHIFT ( 8UL ) - -/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ -#define portVECTACTIVE_MASK ( 0xFFUL ) - -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000 ) - -/* The systick is a 24-bit counter. */ -#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) - -/* A fiddle factor to estimate the number of SysTick counts that would have -occurred while the SysTick counter is stopped during tickless idle -calculations. */ -#define portMISSED_COUNTS_FACTOR ( 45UL ) - -/* For strict compliance with the Cortex-M spec the task start address should -have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ -#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) - -/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is -defined. The value 255 should also ensure backward compatibility. -FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ -#ifndef configKERNEL_INTERRUPT_PRIORITY - #define configKERNEL_INTERRUPT_PRIORITY 255 -#endif - -/* - * Setup the timer to generate the tick interrupts. The implementation in this - * file is weak to allow application writers to change the timer used to - * generate the tick interrupt. - */ -void vPortSetupTimerInterrupt( void ); - -/* - * Exception handlers. - */ -void xPortSysTickHandler( void ); - -/* - * Start first task is a separate function so it can be tested in isolation. - */ -extern void vPortStartFirstTask( void ); - -/* - * Used to catch tasks that attempt to return from their implementing function. - */ -static void prvTaskExitError( void ); - -/*-----------------------------------------------------------*/ - -/* Each task maintains its own interrupt status in the critical nesting -variable. */ -static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; - -/* - * The number of SysTick increments that make up one tick period. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulTimerCountsForOneTick = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * The maximum number of tick periods that can be suppressed is limited by the - * 24 bit resolution of the SysTick timer. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t xMaximumPossibleSuppressedTicks = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Compensate for the CPU cycles that pass while the SysTick is stopped (low - * power functionality only. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulStoppedTimerCompensation = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure - * FreeRTOS API functions are not called from interrupts that have been assigned - * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. - */ -#if( configASSERT_DEFINED == 1 ) - static uint8_t ucMaxSysCallPriority = 0; - static uint32_t ulMaxPRIGROUPValue = 0; - static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; -#endif /* configASSERT_DEFINED */ - -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) -{ - /* Simulate the stack frame as it would be created by a context switch - interrupt. */ - pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ - *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - pxTopOfStack--; - *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - pxTopOfStack--; - *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ - pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -static void prvTaskExitError( void ) -{ - /* A function that implements a task must not exit or attempt to return to - its caller as there is nothing to return to. If a task wants to exit it - should instead call vTaskDelete( NULL ). - - Artificially force an assert() to be triggered if configASSERT() is - defined, then stop here so application writers can catch the error. */ - configASSERT( uxCriticalNesting == ~0UL ); - portDISABLE_INTERRUPTS(); - for( ;; ); -} -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -BaseType_t xPortStartScheduler( void ) -{ - /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. - See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ - configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); - - #if( configASSERT_DEFINED == 1 ) - { - volatile uint32_t ulOriginalPriority; - volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - volatile uint8_t ucMaxPriorityValue; - - /* Determine the maximum priority from which ISR safe FreeRTOS API - functions can be called. ISR safe functions are those that end in - "FromISR". FreeRTOS maintains separate thread and ISR API functions to - ensure interrupt entry is as fast and simple as possible. - - Save the interrupt priority value that is about to be clobbered. */ - ulOriginalPriority = *pucFirstUserPriorityRegister; - - /* Determine the number of priority bits available. First write to all - possible bits. */ - *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - - /* Read the value back to see how many bits stuck. */ - ucMaxPriorityValue = *pucFirstUserPriorityRegister; - - /* Use the same mask on the maximum system call priority. */ - ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - - /* Calculate the maximum acceptable priority group value for the number - of bits read back. */ - ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - { - ulMaxPRIGROUPValue--; - ucMaxPriorityValue <<= ( uint8_t ) 0x01; - } - - #ifdef __NVIC_PRIO_BITS - { - /* Check the CMSIS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); - } - #endif - - #ifdef configPRIO_BITS - { - /* Check the FreeRTOS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - } - #endif - - /* Shift the priority group value back to its position within the AIRCR - register. */ - ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - - /* Restore the clobbered interrupt priority register to its original - value. */ - *pucFirstUserPriorityRegister = ulOriginalPriority; - } - #endif /* conifgASSERT_DEFINED */ - - /* Make PendSV and SysTick the lowest priority interrupts. */ - portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - - /* Start the timer that generates the tick ISR. Interrupts are disabled - here already. */ - vPortSetupTimerInterrupt(); - - /* Initialise the critical nesting count ready for the first task. */ - uxCriticalNesting = 0; - - /* Start the first task. */ - vPortStartFirstTask(); - - /* Should not get here! */ - return 0; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* Not implemented in ports where there is nothing to return to. - Artificially force an assert. */ - configASSERT( uxCriticalNesting == 1000UL ); -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; - - /* This is not the interrupt safe version of the enter critical function so - assert() if it is being called from an interrupt context. Only API - functions that end in "FromISR" can be used in an interrupt. Only assert if - the critical nesting count is 1 to protect against recursive calls if the - assert function also uses a critical section. */ - if( uxCriticalNesting == 1 ) - { - configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - } -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - configASSERT( uxCriticalNesting ); - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -void xPortSysTickHandler( void ) -{ - /* The SysTick runs at the lowest interrupt priority, so when this interrupt - executes all interrupts must be unmasked. There is therefore no need to - save and then restore the interrupt mask value as its value is already - known. */ - portDISABLE_INTERRUPTS(); - { - /* Increment the RTOS tick. */ - if( xTaskIncrementTick() != pdFALSE ) - { - /* A context switch is required. Context switching is performed in - the PendSV interrupt. Pend the PendSV interrupt. */ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - } - } - portENABLE_INTERRUPTS(); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE == 1 ) - - __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) - { - uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; - TickType_t xModifiableIdleTime; - - /* Make sure the SysTick reload value does not overflow the counter. */ - if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) - { - xExpectedIdleTime = xMaximumPossibleSuppressedTicks; - } - - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; - - /* Calculate the reload value required to wait xExpectedIdleTime - tick periods. -1 is used because this code will execute part way - through one of the tick periods. */ - ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); - if( ulReloadValue > ulStoppedTimerCompensation ) - { - ulReloadValue -= ulStoppedTimerCompensation; - } - - /* Enter a critical section but don't use the taskENTER_CRITICAL() - method as that will mask interrupts that should exit sleep mode. */ - __disable_interrupt(); - __DSB(); - __ISB(); - - /* If a context switch is pending or a task is waiting for the scheduler - to be unsuspended then abandon the low power entry. */ - if( eTaskConfirmSleepModeStatus() == eAbortSleep ) - { - /* Restart from whatever is left in the count register to complete - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Reset the reload register to the value required for normal tick - periods. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Re-enable interrupts - see comments above __disable_interrupt() - call above. */ - __enable_interrupt(); - } - else - { - /* Set the new reload value. */ - portNVIC_SYSTICK_LOAD_REG = ulReloadValue; - - /* Clear the SysTick count flag and set the count value back to - zero. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can - set its parameter to 0 to indicate that its implementation contains - its own wait for interrupt or wait for event instruction, and so wfi - should not be executed again. However, the original expected idle - time variable must remain unmodified, so a copy is taken. */ - xModifiableIdleTime = xExpectedIdleTime; - configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); - if( xModifiableIdleTime > 0 ) - { - __DSB(); - __WFI(); - __ISB(); - } - configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); - - /* Re-enable interrupts to allow the interrupt that brought the MCU - out of sleep mode to execute immediately. see comments above - __disable_interrupt() call above. */ - __enable_interrupt(); - __DSB(); - __ISB(); - - /* Disable interrupts again because the clock is about to be stopped - and interrupts that execute while the clock is stopped will increase - any slippage between the time maintained by the RTOS and calendar - time. */ - __disable_interrupt(); - __DSB(); - __ISB(); - - /* Disable the SysTick clock without reading the - portNVIC_SYSTICK_CTRL_REG register to ensure the - portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, - the time the SysTick is stopped for is accounted for as best it can - be, but using the tickless mode will inevitably result in some tiny - drift of the time maintained by the kernel with respect to calendar - time*/ - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); - - /* Determine if the SysTick clock has already counted to zero and - been set back to the current reload value (the reload back being - correct for the entire expected idle time) or if the SysTick is yet - to count to zero (in which case an interrupt other than the SysTick - must have brought the system out of sleep mode). */ - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) - { - uint32_t ulCalculatedLoadValue; - - /* The tick interrupt is already pending, and the SysTick count - reloaded with ulReloadValue. Reset the - portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick - period. */ - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); - - /* Don't allow a tiny value, or values that have somehow - underflowed because the post sleep hook did something - that took too long. */ - if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) - { - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); - } - - portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; - - /* As the pending tick will be processed as soon as this - function exits, the tick value maintained by the tick is stepped - forward by one less than the time spent waiting. */ - ulCompleteTickPeriods = xExpectedIdleTime - 1UL; - } - else - { - /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted rounded to complete tick - periods (not the ulReload value which accounted for part - ticks). */ - ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* How many complete tick periods passed while the processor - was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; - - /* The reload value is set to whatever fraction of a single tick - period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; - } - - /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG - again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - vTaskStepTick( ulCompleteTickPeriods ); - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Exit with interrpts enabled. */ - __enable_interrupt(); - } - } - -#endif /* configUSE_TICKLESS_IDLE */ -/*-----------------------------------------------------------*/ - -/* - * Setup the systick timer to generate the tick interrupts at the required - * frequency. - */ -__weak void vPortSetupTimerInterrupt( void ) -{ - /* Calculate the constants required to configure the tick interrupt. */ - #if( configUSE_TICKLESS_IDLE == 1 ) - { - ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); - xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; - ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); - } - #endif /* configUSE_TICKLESS_IDLE */ - - /* Stop and clear the SysTick. */ - portNVIC_SYSTICK_CTRL_REG = 0UL; - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); -} -/*-----------------------------------------------------------*/ - -#if( configASSERT_DEFINED == 1 ) - - void vPortValidateInterruptPriority( void ) - { - uint32_t ulCurrentInterrupt; - uint8_t ucCurrentPriority; - - /* Obtain the number of the currently executing interrupt. */ - __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" ); - - /* Is the interrupt number a user defined interrupt? */ - if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) - { - /* Look up the interrupt's priority. */ - ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; - - /* The following assertion will fail if a service routine (ISR) for - an interrupt that has been assigned a priority above - configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API - function. ISR safe FreeRTOS API functions must *only* be called - from interrupts that have been assigned a priority at or below - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Numerically low interrupt priority numbers represent logically high - interrupt priorities, therefore the priority of the interrupt must - be set to a value equal to or numerically *higher* than - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Interrupts that use the FreeRTOS API must not be left at their - default priority of zero as that is the highest possible priority, - which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, - and therefore also guaranteed to be invalid. - - FreeRTOS maintains separate thread and ISR API functions to ensure - interrupt entry is as fast and simple as possible. - - The following links provide detailed information: - http://www.freertos.org/RTOS-Cortex-M3-M4.html - http://www.freertos.org/FAQHelp.html */ - configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); - } - - /* Priority grouping: The interrupt controller (NVIC) allows the bits - that define each interrupt's priority to be split between bits that - define the interrupt's pre-emption priority bits and bits that define - the interrupt's sub-priority. For simplicity all bits must be defined - to be pre-emption priority bits. The following assertion will fail if - this is not the case (if some bits represent a sub-priority). - - If the application only uses CMSIS libraries for interrupt - configuration then the correct setting can be achieved on all Cortex-M - devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the - scheduler. Note however that some vendor specific peripheral libraries - assume a non-zero priority group setting, in which cases using a value - of zero will result in unpredictable behaviour. */ - configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); - } - -#endif /* configASSERT_DEFINED */ - - - - - - - - - - - - - - - - - - - - - diff --git a/bundles/typical/inc/os/portable/IAR/ARM_CM3/portasm.s b/bundles/typical/inc/os/portable/IAR/ARM_CM3/portasm.s deleted file mode 100644 index fbc278a65..000000000 --- a/bundles/typical/inc/os/portable/IAR/ARM_CM3/portasm.s +++ /dev/null @@ -1,103 +0,0 @@ -/* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -#include - - RSEG CODE:CODE(2) - thumb - - EXTERN pxCurrentTCB - EXTERN vTaskSwitchContext - - PUBLIC xPortPendSVHandler - PUBLIC vPortSVCHandler - PUBLIC vPortStartFirstTask - - - -/*-----------------------------------------------------------*/ - -xPortPendSVHandler: - mrs r0, psp - isb - ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ - ldr r2, [r3] - - stmdb r0!, {r4-r11} /* Save the remaining registers. */ - str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ - - stmdb sp!, {r3, r14} - mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY - msr basepri, r0 - dsb - isb - bl vTaskSwitchContext - mov r0, #0 - msr basepri, r0 - ldmia sp!, {r3, r14} - - ldr r1, [r3] - ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ - ldmia r0!, {r4-r11} /* Pop the registers. */ - msr psp, r0 - isb - bx r14 - - -/*-----------------------------------------------------------*/ - -vPortSVCHandler: - /* Get the location of the current TCB. */ - ldr r3, =pxCurrentTCB - ldr r1, [r3] - ldr r0, [r1] - /* Pop the core registers. */ - ldmia r0!, {r4-r11} - msr psp, r0 - isb - mov r0, #0 - msr basepri, r0 - orr r14, r14, #13 - bx r14 - -/*-----------------------------------------------------------*/ - -vPortStartFirstTask - /* Use the NVIC offset register to locate the stack. */ - ldr r0, =0xE000ED08 - ldr r0, [r0] - ldr r0, [r0] - /* Set the msp back to the start of the stack. */ - msr msp, r0 - /* Call SVC to start the first task, ensuring interrupts are enabled. */ - cpsie i - cpsie f - dsb - isb - svc 0 - - END diff --git a/bundles/typical/inc/os/portable/RVDS/ARM_CM3/port.c b/bundles/typical/inc/os/portable/RVDS/ARM_CM3/port.c deleted file mode 100644 index bb7f9cc4d..000000000 --- a/bundles/typical/inc/os/portable/RVDS/ARM_CM3/port.c +++ /dev/null @@ -1,698 +0,0 @@ -/* - * FreeRTOS Kernel V10.2.1 - * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://www.FreeRTOS.org - * http://aws.amazon.com/freertos - * - * 1 tab == 4 spaces! - */ - -/*----------------------------------------------------------- - * Implementation of functions defined in portable.h for the ARM CM3 port. - *----------------------------------------------------------*/ - -/* Scheduler includes. */ -#include "FreeRTOS.h" -#include "task.h" - -#ifndef configKERNEL_INTERRUPT_PRIORITY - #define configKERNEL_INTERRUPT_PRIORITY 255 -#endif - -#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 - #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html -#endif - -#ifndef configSYSTICK_CLOCK_HZ - #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ - /* Ensure the SysTick is clocked at the same frequency as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) -#else - /* The way the SysTick is clocked is not modified in case it is not the same - as the core. */ - #define portNVIC_SYSTICK_CLK_BIT ( 0 ) -#endif - -/* The __weak attribute does not work as you might expect with the Keil tools -so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if -the application writer wants to provide their own implementation of -vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION -is defined. */ -#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION - #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 -#endif - -/* Constants required to manipulate the core. Registers first... */ -#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) -#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) -#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) -#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) -/* ...then bits in the registers. */ -#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) -#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) -#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) -#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) -#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) - -#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) -#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) - -/* Constants required to check the validity of an interrupt priority. */ -#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) -#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) -#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) -#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) -#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) -#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) -#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) -#define portPRIGROUP_SHIFT ( 8UL ) - -/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ -#define portVECTACTIVE_MASK ( 0xFFUL ) - -/* Constants required to set up the initial stack. */ -#define portINITIAL_XPSR ( 0x01000000 ) - -/* The systick is a 24-bit counter. */ -#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) - -/* A fiddle factor to estimate the number of SysTick counts that would have -occurred while the SysTick counter is stopped during tickless idle -calculations. */ -#define portMISSED_COUNTS_FACTOR ( 45UL ) - -/* For strict compliance with the Cortex-M spec the task start address should -have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ -#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) - -/* - * Setup the timer to generate the tick interrupts. The implementation in this - * file is weak to allow application writers to change the timer used to - * generate the tick interrupt. - */ -void vPortSetupTimerInterrupt( void ); - -/* - * Exception handlers. - */ -void xPortPendSVHandler( void ); -void xPortSysTickHandler( void ); -void vPortSVCHandler( void ); - -/* - * Start first task is a separate function so it can be tested in isolation. - */ -static void prvStartFirstTask( void ); - -/* - * Used to catch tasks that attempt to return from their implementing function. - */ -static void prvTaskExitError( void ); - -/*-----------------------------------------------------------*/ - -/* Each task maintains its own interrupt status in the critical nesting -variable. */ -static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; - -/* - * The number of SysTick increments that make up one tick period. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulTimerCountsForOneTick = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * The maximum number of tick periods that can be suppressed is limited by the - * 24 bit resolution of the SysTick timer. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t xMaximumPossibleSuppressedTicks = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Compensate for the CPU cycles that pass while the SysTick is stopped (low - * power functionality only. - */ -#if( configUSE_TICKLESS_IDLE == 1 ) - static uint32_t ulStoppedTimerCompensation = 0; -#endif /* configUSE_TICKLESS_IDLE */ - -/* - * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure - * FreeRTOS API functions are not called from interrupts that have been assigned - * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. - */ -#if ( configASSERT_DEFINED == 1 ) - static uint8_t ucMaxSysCallPriority = 0; - static uint32_t ulMaxPRIGROUPValue = 0; - static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; -#endif /* configASSERT_DEFINED */ - -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) -{ - /* Simulate the stack frame as it would be created by a context switch - interrupt. */ - pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ - *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - pxTopOfStack--; - *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - pxTopOfStack--; - *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ - - pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - - return pxTopOfStack; -} -/*-----------------------------------------------------------*/ - -static void prvTaskExitError( void ) -{ - /* A function that implements a task must not exit or attempt to return to - its caller as there is nothing to return to. If a task wants to exit it - should instead call vTaskDelete( NULL ). - - Artificially force an assert() to be triggered if configASSERT() is - defined, then stop here so application writers can catch the error. */ - configASSERT( uxCriticalNesting == ~0UL ); - portDISABLE_INTERRUPTS(); - for( ;; ); -} -/*-----------------------------------------------------------*/ - -__asm void vPortSVCHandler( void ) -{ - PRESERVE8 - - ldr r3, =pxCurrentTCB /* Restore the context. */ - ldr r1, [r3] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ - ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ - ldmia r0!, {r4-r11} /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ - msr psp, r0 /* Restore the task stack pointer. */ - isb - mov r0, #0 - msr basepri, r0 - orr r14, #0xd - bx r14 -} -/*-----------------------------------------------------------*/ - -__asm void prvStartFirstTask( void ) -{ - PRESERVE8 - - /* Use the NVIC offset register to locate the stack. */ - ldr r0, =0xE000ED08 - ldr r0, [r0] - ldr r0, [r0] - - /* Set the msp back to the start of the stack. */ - msr msp, r0 - /* Globally enable interrupts. */ - cpsie i - cpsie f - dsb - isb - /* Call SVC to start the first task. */ - svc 0 - nop - nop -} -/*-----------------------------------------------------------*/ - -/* - * See header file for description. - */ -BaseType_t xPortStartScheduler( void ) -{ - #if( configASSERT_DEFINED == 1 ) - { - volatile uint32_t ulOriginalPriority; - volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - volatile uint8_t ucMaxPriorityValue; - - /* Determine the maximum priority from which ISR safe FreeRTOS API - functions can be called. ISR safe functions are those that end in - "FromISR". FreeRTOS maintains separate thread and ISR API functions to - ensure interrupt entry is as fast and simple as possible. - - Save the interrupt priority value that is about to be clobbered. */ - ulOriginalPriority = *pucFirstUserPriorityRegister; - - /* Determine the number of priority bits available. First write to all - possible bits. */ - *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - - /* Read the value back to see how many bits stuck. */ - ucMaxPriorityValue = *pucFirstUserPriorityRegister; - - /* The kernel interrupt priority should be set to the lowest - priority. */ - configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); - - /* Use the same mask on the maximum system call priority. */ - ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - - /* Calculate the maximum acceptable priority group value for the number - of bits read back. */ - ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - { - ulMaxPRIGROUPValue--; - ucMaxPriorityValue <<= ( uint8_t ) 0x01; - } - - #ifdef __NVIC_PRIO_BITS - { - /* Check the CMSIS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); - } - #endif - - #ifdef configPRIO_BITS - { - /* Check the FreeRTOS configuration that defines the number of - priority bits matches the number of priority bits actually queried - from the hardware. */ - configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - } - #endif - - /* Shift the priority group value back to its position within the AIRCR - register. */ - ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - - /* Restore the clobbered interrupt priority register to its original - value. */ - *pucFirstUserPriorityRegister = ulOriginalPriority; - } - #endif /* conifgASSERT_DEFINED */ - - /* Make PendSV and SysTick the lowest priority interrupts. */ - portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - - /* Start the timer that generates the tick ISR. Interrupts are disabled - here already. */ - vPortSetupTimerInterrupt(); - - /* Initialise the critical nesting count ready for the first task. */ - uxCriticalNesting = 0; - - /* Start the first task. */ - prvStartFirstTask(); - - /* Should not get here! */ - return 0; -} -/*-----------------------------------------------------------*/ - -void vPortEndScheduler( void ) -{ - /* Not implemented in ports where there is nothing to return to. - Artificially force an assert. */ - configASSERT( uxCriticalNesting == 1000UL ); -} -/*-----------------------------------------------------------*/ - -void vPortEnterCritical( void ) -{ - portDISABLE_INTERRUPTS(); - uxCriticalNesting++; - - /* This is not the interrupt safe version of the enter critical function so - assert() if it is being called from an interrupt context. Only API - functions that end in "FromISR" can be used in an interrupt. Only assert if - the critical nesting count is 1 to protect against recursive calls if the - assert function also uses a critical section. */ - if( uxCriticalNesting == 1 ) - { - configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - } -} -/*-----------------------------------------------------------*/ - -void vPortExitCritical( void ) -{ - configASSERT( uxCriticalNesting ); - uxCriticalNesting--; - if( uxCriticalNesting == 0 ) - { - portENABLE_INTERRUPTS(); - } -} -/*-----------------------------------------------------------*/ - -__asm void xPortPendSVHandler( void ) -{ - extern uxCriticalNesting; - extern pxCurrentTCB; - extern vTaskSwitchContext; - - PRESERVE8 - - mrs r0, psp - isb - - ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ - ldr r2, [r3] - - stmdb r0!, {r4-r11} /* Save the remaining registers. */ - str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ - - stmdb sp!, {r3, r14} - mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY - msr basepri, r0 - dsb - isb - bl vTaskSwitchContext - mov r0, #0 - msr basepri, r0 - ldmia sp!, {r3, r14} - - ldr r1, [r3] - ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ - ldmia r0!, {r4-r11} /* Pop the registers and the critical nesting count. */ - msr psp, r0 - isb - bx r14 - nop -} -/*-----------------------------------------------------------*/ - -void xPortSysTickHandler( void ) -{ - /* The SysTick runs at the lowest interrupt priority, so when this interrupt - executes all interrupts must be unmasked. There is therefore no need to - save and then restore the interrupt mask value as its value is already - known - therefore the slightly faster vPortRaiseBASEPRI() function is used - in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ - vPortRaiseBASEPRI(); - { - /* Increment the RTOS tick. */ - if( xTaskIncrementTick() != pdFALSE ) - { - /* A context switch is required. Context switching is performed in - the PendSV interrupt. Pend the PendSV interrupt. */ - portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - } - } - vPortClearBASEPRIFromISR(); -} -/*-----------------------------------------------------------*/ - -#if( configUSE_TICKLESS_IDLE == 1 ) - - __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) - { - uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; - TickType_t xModifiableIdleTime; - - /* Make sure the SysTick reload value does not overflow the counter. */ - if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) - { - xExpectedIdleTime = xMaximumPossibleSuppressedTicks; - } - - /* Stop the SysTick momentarily. The time the SysTick is stopped for - is accounted for as best it can be, but using the tickless mode will - inevitably result in some tiny drift of the time maintained by the - kernel with respect to calendar time. */ - portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; - - /* Calculate the reload value required to wait xExpectedIdleTime - tick periods. -1 is used because this code will execute part way - through one of the tick periods. */ - ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); - if( ulReloadValue > ulStoppedTimerCompensation ) - { - ulReloadValue -= ulStoppedTimerCompensation; - } - - /* Enter a critical section but don't use the taskENTER_CRITICAL() - method as that will mask interrupts that should exit sleep mode. */ - __disable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* If a context switch is pending or a task is waiting for the scheduler - to be unsuspended then abandon the low power entry. */ - if( eTaskConfirmSleepModeStatus() == eAbortSleep ) - { - /* Restart from whatever is left in the count register to complete - this tick period. */ - portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Reset the reload register to the value required for normal tick - periods. */ - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Re-enable interrupts - see comments above __disable_irq() call - above. */ - __enable_irq(); - } - else - { - /* Set the new reload value. */ - portNVIC_SYSTICK_LOAD_REG = ulReloadValue; - - /* Clear the SysTick count flag and set the count value back to - zero. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Restart SysTick. */ - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - - /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can - set its parameter to 0 to indicate that its implementation contains - its own wait for interrupt or wait for event instruction, and so wfi - should not be executed again. However, the original expected idle - time variable must remain unmodified, so a copy is taken. */ - xModifiableIdleTime = xExpectedIdleTime; - configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); - if( xModifiableIdleTime > 0 ) - { - __dsb( portSY_FULL_READ_WRITE ); - __wfi(); - __isb( portSY_FULL_READ_WRITE ); - } - configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); - - /* Re-enable interrupts to allow the interrupt that brought the MCU - out of sleep mode to execute immediately. see comments above - __disable_interrupt() call above. */ - __enable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* Disable interrupts again because the clock is about to be stopped - and interrupts that execute while the clock is stopped will increase - any slippage between the time maintained by the RTOS and calendar - time. */ - __disable_irq(); - __dsb( portSY_FULL_READ_WRITE ); - __isb( portSY_FULL_READ_WRITE ); - - /* Disable the SysTick clock without reading the - portNVIC_SYSTICK_CTRL_REG register to ensure the - portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, - the time the SysTick is stopped for is accounted for as best it can - be, but using the tickless mode will inevitably result in some tiny - drift of the time maintained by the kernel with respect to calendar - time*/ - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); - - /* Determine if the SysTick clock has already counted to zero and - been set back to the current reload value (the reload back being - correct for the entire expected idle time) or if the SysTick is yet - to count to zero (in which case an interrupt other than the SysTick - must have brought the system out of sleep mode). */ - if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) - { - uint32_t ulCalculatedLoadValue; - - /* The tick interrupt is already pending, and the SysTick count - reloaded with ulReloadValue. Reset the - portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick - period. */ - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); - - /* Don't allow a tiny value, or values that have somehow - underflowed because the post sleep hook did something - that took too long. */ - if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) - { - ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); - } - - portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; - - /* As the pending tick will be processed as soon as this - function exits, the tick value maintained by the tick is stepped - forward by one less than the time spent waiting. */ - ulCompleteTickPeriods = xExpectedIdleTime - 1UL; - } - else - { - /* Something other than the tick interrupt ended the sleep. - Work out how long the sleep lasted rounded to complete tick - periods (not the ulReload value which accounted for part - ticks). */ - ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; - - /* How many complete tick periods passed while the processor - was waiting? */ - ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; - - /* The reload value is set to whatever fraction of a single tick - period remains. */ - portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; - } - - /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG - again, then set portNVIC_SYSTICK_LOAD_REG back to its standard - value. */ - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; - vTaskStepTick( ulCompleteTickPeriods ); - portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; - - /* Exit with interrpts enabled. */ - __enable_irq(); - } - } - -#endif /* #if configUSE_TICKLESS_IDLE */ - -/*-----------------------------------------------------------*/ - -/* - * Setup the SysTick timer to generate the tick interrupts at the required - * frequency. - */ -#if( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) - - void vPortSetupTimerInterrupt( void ) - { - /* Calculate the constants required to configure the tick interrupt. */ - #if( configUSE_TICKLESS_IDLE == 1 ) - { - ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); - xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; - ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); - } - #endif /* configUSE_TICKLESS_IDLE */ - - /* Stop and clear the SysTick. */ - portNVIC_SYSTICK_CTRL_REG = 0UL; - portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - - /* Configure SysTick to interrupt at the requested rate. */ - portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); - } - -#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ -/*-----------------------------------------------------------*/ - -__asm uint32_t vPortGetIPSR( void ) -{ - PRESERVE8 - - mrs r0, ipsr - bx r14 -} -/*-----------------------------------------------------------*/ - -#if( configASSERT_DEFINED == 1 ) - - void vPortValidateInterruptPriority( void ) - { - uint32_t ulCurrentInterrupt; - uint8_t ucCurrentPriority; - - /* Obtain the number of the currently executing interrupt. */ - ulCurrentInterrupt = vPortGetIPSR(); - - /* Is the interrupt number a user defined interrupt? */ - if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) - { - /* Look up the interrupt's priority. */ - ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; - - /* The following assertion will fail if a service routine (ISR) for - an interrupt that has been assigned a priority above - configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API - function. ISR safe FreeRTOS API functions must *only* be called - from interrupts that have been assigned a priority at or below - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Numerically low interrupt priority numbers represent logically high - interrupt priorities, therefore the priority of the interrupt must - be set to a value equal to or numerically *higher* than - configMAX_SYSCALL_INTERRUPT_PRIORITY. - - Interrupts that use the FreeRTOS API must not be left at their - default priority of zero as that is the highest possible priority, - which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, - and therefore also guaranteed to be invalid. - - FreeRTOS maintains separate thread and ISR API functions to ensure - interrupt entry is as fast and simple as possible. - - The following links provide detailed information: - http://www.freertos.org/RTOS-Cortex-M3-M4.html - http://www.freertos.org/FAQHelp.html */ - configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); - } - - /* Priority grouping: The interrupt controller (NVIC) allows the bits - that define each interrupt's priority to be split between bits that - define the interrupt's pre-emption priority bits and bits that define - the interrupt's sub-priority. For simplicity all bits must be defined - to be pre-emption priority bits. The following assertion will fail if - this is not the case (if some bits represent a sub-priority). - - If the application only uses CMSIS libraries for interrupt - configuration then the correct setting can be achieved on all Cortex-M - devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the - scheduler. Note however that some vendor specific peripheral libraries - assume a non-zero priority group setting, in which cases using a value - of zero will result in unpredictable behaviour. */ - configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); - } - -#endif /* configASSERT_DEFINED */ - - diff --git a/bundles/typical/inc/os/task.h b/bundles/typical/inc/os/task.h index c026453c2..c1a941879 100644 --- a/bundles/typical/inc/os/task.h +++ b/bundles/typical/inc/os/task.h @@ -2455,9 +2455,7 @@ void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBas * to date with the actual execution time by being skipped forward by a time * equal to the idle period. */ -// void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; /* * Only available when configUSE_TICKLESS_IDLE is set to 1. @@ -2473,9 +2471,7 @@ void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBas * critical section between the timer being stopped and the sleep mode being * entered to ensure it is ok to proceed into the sleep mode. */ -// eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; -// WARNING: ^^^ this API is not available in this release - +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; /* * For internal use only. Increment the mutex held count when a mutex is diff --git a/bundles/typical/inc/platform_api.h b/bundles/typical/inc/platform_api.h index 1ff9f2b49..b300a5e72 100644 --- a/bundles/typical/inc/platform_api.h +++ b/bundles/typical/inc/platform_api.h @@ -227,7 +227,9 @@ typedef enum PLATFORM_CFG_LOG_HCI, // flag is ENABLE or DISABLE. default: DISABLE PLATFORM_CFG_POWER_SAVING, // flag is ENABLE or DISABLE. default: DISABLE PLATFORM_CFG_TRACE_MASK, // flag is bitmap of platform_trace_item_t. default: 0 - PLATFORM_CFG_32K_CLK // 32k clock selection. flag is platform_32k_clk_src_t. default: PLATFORM_32K_RC + PLATFORM_CFG_32K_CLK, // 32k clock selection. flag is platform_32k_clk_src_t. default: PLATFORM_32K_RC + PLATFORM_CFG_PS_DBG_0, // debugging parameter + PLATFORM_CFG_PS_DBG_1, // debugging parameter } platform_cfg_item_t; typedef enum @@ -261,9 +263,7 @@ void platform_config(const platform_cfg_item_t item, const uint32_t flag); * @param[in] data_size Size of the data to be retentioned **************************************************************************************** */ -// void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); -// WARNING: ^^^ this API is not available in this release - +void platform_shutdown(const uint32_t duration_cycles, const void *p_retention_data, const uint32_t data_size); /** **************************************************************************************** diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw index 0d2dd19e6..a66554ebf 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\/Program Files(2)\/gcc-arm-none-eabi-8-2018-q4-major-win32\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld index 3e1e34aeb..97127bbe5 100644 --- a/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld +++ b/examples-gcc/peripheral_ibeacon/peripheral_ibeacon.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910664, LENGTH = 25784 + RAM (rwx) : ORIGIN = 536901400, LENGTH = 35048 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-iar/peripheral_ibeacon/generic_cortex.icf b/examples-iar/peripheral_ibeacon/generic_cortex.icf index 2d0d2f978..d50ca7c00 100644 --- a/examples-iar/peripheral_ibeacon/generic_cortex.icf +++ b/examples-iar/peripheral_ibeacon/generic_cortex.icf @@ -2,9 +2,9 @@ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ /*-Specials-*/ -define symbol __ICFEDIT_intvec_start__ = 155648; +define symbol __ICFEDIT_intvec_start__ = 155648; /*-Memory Regions-*/ -define symbol __ICFEDIT_region_IROM1_start__ = 155648; +define symbol __ICFEDIT_region_IROM1_start__ = 155648; define symbol __ICFEDIT_region_IROM1_end__ = 0x00084000; define symbol __ICFEDIT_region_IROM2_start__ = 0x0; define symbol __ICFEDIT_region_IROM2_end__ = 0x0; @@ -14,7 +14,7 @@ define symbol __ICFEDIT_region_EROM2_start__ = 0x0; define symbol __ICFEDIT_region_EROM2_end__ = 0x0; define symbol __ICFEDIT_region_EROM3_start__ = 0x0; define symbol __ICFEDIT_region_EROM3_end__ = 0x0; -define symbol __ICFEDIT_region_IRAM1_start__ = 536910664; +define symbol __ICFEDIT_region_IRAM1_start__ = 536901400; define symbol __ICFEDIT_region_IRAM1_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; diff --git a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw index e1ae04aa5..b27de92e6 100644 --- a/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-iar/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\/Program Files (x86)\/IAR Systems\/Embedded Workbench 8.2\/common\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/peripheral_battery/peripheral_battery.ingw b/examples-nim/peripheral_battery/peripheral_battery.ingw index 545f26fc9..3b3ecfbae 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ingw +++ b/examples-nim/peripheral_battery/peripheral_battery.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\projects\\nim-1.0.0\\bin", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/peripheral_battery/peripheral_battery.ld b/examples-nim/peripheral_battery/peripheral_battery.ld index 3e1e34aeb..97127bbe5 100644 --- a/examples-nim/peripheral_battery/peripheral_battery.ld +++ b/examples-nim/peripheral_battery/peripheral_battery.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910664, LENGTH = 25784 + RAM (rwx) : ORIGIN = 536901400, LENGTH = 35048 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-nim/smart_home_hub/smart_home_hub.ingw b/examples-nim/smart_home_hub/smart_home_hub.ingw index c6bddac56..8735e0c5e 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ingw +++ b/examples-nim/smart_home_hub/smart_home_hub.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\projects\\nim-1.0.0\\bin", "eflash_addr": "0x42000", @@ -60,8 +60,8 @@ "proxy": true }, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples-nim/smart_home_hub/smart_home_hub.ld b/examples-nim/smart_home_hub/smart_home_hub.ld index 3e1e34aeb..97127bbe5 100644 --- a/examples-nim/smart_home_hub/smart_home_hub.ld +++ b/examples-nim/smart_home_hub/smart_home_hub.ld @@ -8,7 +8,7 @@ MEMORY { FLASH (rx) : ORIGIN = 155648, LENGTH = 385024 - RAM (rwx) : ORIGIN = 536910664, LENGTH = 25784 + RAM (rwx) : ORIGIN = 536901400, LENGTH = 35048 } /* Linker script to place sections and symbol values. Should be used together diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp index abca7fd50..a730d1083 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.hzp @@ -2,7 +2,7 @@ - + diff --git a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw index a163c4999..b18132668 100644 --- a/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-rowley/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\/Program Files(2)\/Crossworks\/bin", "ide_ver": "", @@ -50,8 +50,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "rowley": true, "uart_log": true, "ota_ver_patch": "0", diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject index 4c8a78e08..dfa7c5af3 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.emProject @@ -2,7 +2,7 @@ - + diff --git a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw index b1771a913..4d68d2ff2 100644 --- a/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw +++ b/examples-segger/peripheral_ibeacon/peripheral_ibeacon.ingw @@ -1,20 +1,20 @@ { "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\/Program Files (x86)\/SEGGER\/SEGGER Embedded Studio for ARM 4.50\/bin", "ide_ver": "", @@ -51,8 +51,8 @@ "proxy": true }, "cmsis": "C:\/projects\/ingWizard\/CMSIS", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_mas/anti_lost_mas.ingw b/examples/anti_lost_mas/anti_lost_mas.ingw index ef516db4d..c8f8807be 100644 --- a/examples/anti_lost_mas/anti_lost_mas.ingw +++ b/examples/anti_lost_mas/anti_lost_mas.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_mas/anti_lost_mas.uvproj b/examples/anti_lost_mas/anti_lost_mas.uvproj index 674bc2317..c96bbba0d 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvproj +++ b/examples/anti_lost_mas/anti_lost_mas.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/anti_lost_mas/anti_lost_mas.uvprojx b/examples/anti_lost_mas/anti_lost_mas.uvprojx index 3e934c0ba..731f076e6 100644 --- a/examples/anti_lost_mas/anti_lost_mas.uvprojx +++ b/examples/anti_lost_mas/anti_lost_mas.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/anti_lost_sla/anti_lost_sla.ingw b/examples/anti_lost_sla/anti_lost_sla.ingw index 693226f71..ec087bcec 100644 --- a/examples/anti_lost_sla/anti_lost_sla.ingw +++ b/examples/anti_lost_sla/anti_lost_sla.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/anti_lost_sla/anti_lost_sla.uvproj b/examples/anti_lost_sla/anti_lost_sla.uvproj index 38bee3215..053a9b7ba 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvproj +++ b/examples/anti_lost_sla/anti_lost_sla.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/anti_lost_sla/anti_lost_sla.uvprojx b/examples/anti_lost_sla/anti_lost_sla.uvprojx index 3afdcfd5d..b9bbbb282 100644 --- a/examples/anti_lost_sla/anti_lost_sla.uvprojx +++ b/examples/anti_lost_sla/anti_lost_sla.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/central_throughput/central_throughput.ingw b/examples/central_throughput/central_throughput.ingw index f0086d293..dd6172d1d 100644 --- a/examples/central_throughput/central_throughput.ingw +++ b/examples/central_throughput/central_throughput.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -59,8 +59,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/central_throughput/central_throughput.uvproj b/examples/central_throughput/central_throughput.uvproj index e88b40277..9a44fc985 100644 --- a/examples/central_throughput/central_throughput.uvproj +++ b/examples/central_throughput/central_throughput.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/central_throughput/central_throughput.uvprojx b/examples/central_throughput/central_throughput.uvprojx index 4af4f00ff..a9b06e27c 100644 --- a/examples/central_throughput/central_throughput.uvprojx +++ b/examples/central_throughput/central_throughput.uvprojx @@ -294,8 +294,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/central_throughput/flash_download.ini b/examples/central_throughput/flash_download.ini index fb7d0582a..7c5700620 100644 --- a/examples/central_throughput/flash_download.ini +++ b/examples/central_throughput/flash_download.ini @@ -15,7 +15,7 @@ script= [bin-0] Name=Burn Bin #1 -Checked=0 +Checked=1 FileName=../../bundles/typical/ING9188xx/platform.bin Address=16384 @@ -27,7 +27,7 @@ FileName=central_throughput.bin [uart] Port=COM3 -Baud=115200 +Baud=921600 Parity= DataBits=8 StopBits=1 diff --git a/examples/hid_keyboard/hid_keyboard.ingw b/examples/hid_keyboard/hid_keyboard.ingw index 814a4742f..dbc7bdfe1 100644 --- a/examples/hid_keyboard/hid_keyboard.ingw +++ b/examples/hid_keyboard/hid_keyboard.ingw @@ -2,20 +2,20 @@ "watchdog": false, "bundle_meta": { "rom": { - "size": 132756, + "size": 134316, "base": 16384 }, "ram": { "size": 30488, - "base": 536880176 + "base": 536870912 }, "app": { "base": 155648 }, "api": [ - "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove","kv_put","kv_get","kv_value_modified","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], + "att_server_init","att_server_register_packet_handler","att_server_can_send_packet_now","att_server_request_can_send_now_event","att_server_notify","att_server_indicate","att_server_get_mtu","att_emit_general_event","att_set_db","att_set_read_callback","att_set_write_callback","att_dispatch_register_client","att_dispatch_register_server","att_dispatch_client_can_send_now","att_dispatch_server_can_send_now","att_dispatch_client_request_can_send_now_event","att_dispatch_server_request_can_send_now_event","gatt_client_discover_primary_services","gatt_client_discover_primary_services_by_uuid16","gatt_client_discover_primary_services_by_uuid128","gatt_client_find_included_services_for_service","gatt_client_discover_characteristics_for_service","gatt_client_discover_characteristics_for_handle_range_by_uuid16","gatt_client_discover_characteristics_for_handle_range_by_uuid128","gatt_client_discover_characteristic_descriptors","gatt_client_read_value_of_characteristic_using_value_handle","gatt_client_read_value_of_characteristics_by_uuid16","gatt_client_read_value_of_characteristics_by_uuid128","gatt_client_read_long_value_of_characteristic_using_value_handle","gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset","gatt_client_read_multiple_characteristic_values","gatt_client_write_value_of_characteristic_without_response","gatt_client_signed_write_without_response","gatt_client_write_value_of_characteristic","gatt_client_write_long_value_of_characteristic","gatt_client_write_long_value_of_characteristic_with_offset","gatt_client_reliable_write_long_value_of_characteristic","gatt_client_read_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle","gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle","gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset","gatt_client_write_client_characteristic_configuration","gatt_client_prepare_write","gatt_client_execute_write","gatt_client_cancel_write","gatt_client_get_mtu","gatt_client_is_ready","gatt_client_listen_for_characteristic_value_updates","gatt_client_register_handler","gatt_client_pts_suppress_mtu_exchange","gap_set_random_device_address","gap_disconnect","gap_disconnect_all","gap_add_whitelist","gap_remove_whitelist","gap_clear_white_lists","gap_read_rssi","gap_read_remote_used_features","gap_read_remote_info","gap_le_read_channel_map","gap_read_phy","gap_set_def_phy","gap_set_phy","gap_set_adv_set_random_addr","gap_set_ext_scan_para","gap_set_ext_scan_response_data","gap_set_ext_scan_enable","gap_set_ext_adv_enable","gap_set_ext_adv_para","gap_set_ext_adv_data","gap_set_periodic_adv_data","gap_set_periodic_adv_enable","gap_set_periodic_adv_para","gap_clr_adv_set","gap_rmv_adv_set","gap_periodic_adv_create_sync","gap_periodic_adv_create_sync_cancel","gap_periodic_adv_term_sync","gap_add_dev_to_periodic_list","gap_rmv_dev_from_periodic_list","gap_clr_periodic_adv_list","gap_read_periodic_adv_list_size","gap_ext_create_connection","gap_create_connection_cancel","gap_set_connectionless_cte_tx_param","gap_set_connectionless_cte_tx_enable","gap_set_connectionless_iq_sampling_enable","gap_set_connection_cte_rx_param","gap_set_connection_cte_tx_param","gap_set_connection_cte_request_enable","gap_set_connection_cte_response_enable","gap_read_antenna_info","gap_set_periodic_adv_rx_enable","gap_periodic_adv_sync_transfer","gap_periodic_adv_set_info_transfer","gap_periodic_adv_sync_transfer_param","gap_default_periodic_adv_sync_transfer_param","gap_set_host_channel_classification","gap_update_connection_parameters","gap_get_connection_parameter_range","gap_set_connection_parameter_range","gap_aes_encrypt","gap_start_ccm","hci_add_event_handler","hci_register_acl_packet_handler","hci_power_control","platform_set_evt_callback","platform_set_irq_callback","platform_get_version","platform_raise_assertion","platform_get_heap_status","platform_reset","platform_switch_app","platform_write_persistent_reg","platform_read_persistent_reg","platform_config","platform_shutdown","platform_hrng","platform_printf","sysSetPublicDeviceAddr","platform_set_rf_clk_source","platform_set_rf_init_data","platform_set_rf_power_mapping","platform_patch_rf_init_data","ll_set_adv_coded_scheme","ll_set_initiating_coded_scheme","ll_hint_on_ce_len","ll_set_def_antenna","big_endian_read_16","big_endian_read_32","big_endian_store_16","big_endian_store_32","reverse_bytes","reverse_24","reverse_48","reverse_56","reverse_64","reverse_128","reverse_bd_addr","char_for_nibble","nibble_for_char","bd_addr_cmp","bd_addr_copy","printf_hexdump","uuid128_to_str","bd_addr_to_str","sscanf_bd_addr","uuid_add_bluetooth_prefix","uuid_has_bluetooth_prefix","btstack_push_user_msg","l2cap_register_fixed_channel","l2cap_can_send_fixed_channel_packet_now","l2cap_request_can_send_fix_channel_now_event","l2cap_send_connectionless","l2cap_send_connectionless3","l2cap_le_send_flow_control_credit","l2cap_send_echo_request","l2cap_require_security_level_2_for_outgoing_sdp","l2cap_init","l2cap_register_packet_handler","l2cap_max_mtu","l2cap_max_le_mtu","l2cap_create_channel","l2cap_disconnect","l2cap_get_remote_mtu_for_local_cid","l2cap_send","l2cap_register_service","l2cap_unregister_service","l2cap_can_send_packet_now","l2cap_request_can_send_now_event","l2cap_request_connection_parameter_update","l2cap_send_signaling_le","l2cap_next_sig_id","l2cap_next_local_cid","sm_config","sm_add_event_handler","sm_private_random_address_generation_set_mode","sm_private_random_address_generation_get_mode","sm_private_random_address_generation_set_update_period","sm_private_random_address_generation_get","sm_register_oob_data_callback","sm_bonding_decline","sm_just_works_confirm","sm_passkey_input","sm_set_accepted_stk_generation_methods","sm_set_encryption_key_size_range","sm_set_authentication_requirements","sm_send_security_request","sm_encryption_key_size","sm_authenticated","sm_authorization_state","sm_request_pairing","sm_authorization_decline","sm_authorization_grant","sm_address_resolution_lookup","sm_le_device_key","kv_init","kv_remove_all","kv_remove","kv_put","kv_get","kv_value_modified","kv_commit","kv_visit","xQueueGenericSend","xQueuePeek","xQueuePeekFromISR","xQueueReceive","uxQueueMessagesWaiting","uxQueueSpacesAvailable","vQueueDelete","xQueueGenericSendFromISR","xQueueGiveFromISR","xQueueReceiveFromISR","xQueueIsQueueEmptyFromISR","xQueueIsQueueFullFromISR","uxQueueMessagesWaitingFromISR","xQueueCreateMutex","xQueueCreateMutexStatic","xQueueCreateCountingSemaphore","xQueueCreateCountingSemaphoreStatic","xQueueSemaphoreTake","xQueueTakeMutexRecursive","xQueueGiveMutexRecursive","xQueueGenericCreate","xQueueGenericCreateStatic","xQueueCreateSet","xQueueAddToSet","xQueueRemoveFromSet","xQueueSelectFromSet","xQueueSelectFromSetFromISR","vQueueWaitForMessageRestricted","xQueueGenericReset","xTaskCreate","xTaskCreateStatic","vTaskDelay","vTaskStartScheduler","vTaskSuspendAll","xTaskResumeAll","xTaskGetTickCount","xTaskIncrementTick","vTaskPlaceOnEventList","vTaskPlaceOnEventListRestricted","xTaskRemoveFromEventList","vTaskSwitchContext","xTaskGetCurrentTaskHandle","xTaskCheckForTimeOut","vTaskMissedYield","xTaskGetSchedulerState","xTaskPriorityInherit","xTaskPriorityDisinherit","vTaskPriorityDisinheritAfterTimeout","vTaskStepTick","eTaskConfirmSleepModeStatus","pvTaskIncrementMutexHeldCount","vTaskInternalSetTimeOutState","xTimerCreate","xTimerCreateStatic","pvTimerGetTimerID","xTimerCreateTimerTask","xTimerGenericCommand","pxPortInitialiseStack","pvPortMalloc","vPortFree","xPortStartScheduler"], "version": [ - 1,0,0] + 1,0,1] }, "tc_dir": "C:\\Keil_v5\\UV4", "eflash_addr": "0x42000", @@ -58,8 +58,8 @@ }, "keil": true, "cmsis": "", - "app_ram_size": 25784, - "app_ram_addr": 536910664, + "app_ram_size": 35048, + "app_ram_addr": 536901400, "uart_log": true, "ota_ver_patch": "0", "profile_data": "0, 0\r\n", diff --git a/examples/hid_keyboard/hid_keyboard.uvproj b/examples/hid_keyboard/hid_keyboard.uvproj index bd95ed3a4..ae782915a 100644 --- a/examples/hid_keyboard/hid_keyboard.uvproj +++ b/examples/hid_keyboard/hid_keyboard.uvproj @@ -319,8 +319,8 @@ 0 - 536910664 - 25784 + 536901400 + 35048 0 diff --git a/examples/hid_keyboard/hid_keyboard.uvprojx b/examples/hid_keyboard/hid_keyboard.uvprojx index c7c1deb8a..f3ed2e30d 100644 --- a/examples/hid_keyboard/hid_keyboard.uvprojx +++ b/examples/hid_keyboard/hid_keyboard.uvprojx @@ -1,10 +1,7 @@ - + - 2.1 -