From 859b70c3d104e524e6be38e588fc137974629abf Mon Sep 17 00:00:00 2001 From: zjli-2019 Date: Tue, 8 Sep 2020 18:20:44 +0800 Subject: [PATCH] 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 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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 zW%^RRoq2+Y3d;duywOPS^BEBYqm_1K-sguMT z%1N}>M$ob&R{-%iaGG&Iq%V&kRUP{zQL0QtcD-nn>;MmS@smUu%1OL8Me&;9ev(K{ zHe$RrhVdYu&nss&MsuRwa$@~HJgkWPl~Lqiw>rbt$Nrr3#W(?@D|YrDIzNvY2?WRI zv4qfJ_gz7`%EqBW)jHp`#R<9CSk=jki94DeCXqFIZGag^S885g1~&<|eJe%|Fuozc z2(=`a12HwDGU*;k!blY3#79E-3AC0EsaEd2YoR*pQr?J#RC$26tKQ`Cu%uW^*K>n;2 zQsIg~ZUf{m1d?Kq#--+Cr2H~SiP7<^AVrs-Q;Pz*_Uj-~7pW6j+J6O!P@h8yC>Fnz zp=fIN61vQL34W3P!+Sk){x--7W1M24Q%PR5_!ALq>!maw;fv2~Y^jeb9`?=W14;wo z(KZNca=l~(R?Yx#Ta;z-u?YUblP_SY5~OXfYp|4|1{~(O?vt#mJf-GtSX*Y zyk>@vOe!-tr_K9`D~1p5lb!UH)oZBmgFeo?slmq1Ou*w!1)jH{9Q-dNuJs-W5=X{o z@Cv6+Jqzkc-)VWbc!@BRaz%+bFdm86i8yI!dZ(tU6ULOI!MgQQ7Ia>Ec5ZImS^G^i z2Q3n3j$LB{D;S^(1pdPm@JgrU*2eHWTbUQ(3PywxGZGknjE&Jlkhl*gI)BL2` zR0!llP+x-d(`ysEdSvo-nx7m^qkT!CtSYwFCJhbhGiDNUhK+`pY8r`7P6j|n$|mB( zlFO}T7aoa(nfz0N)E-rD#^HAWmLR`BX_4cV^d(qQ5ICTky>n8Pp-GO z0@KRD5;_i!J)5`KB;eOvY>mWWh-ACb6`ba+Hl9S{Fcn2R%@^2MkTlfWo9oWuwi7q9 zPVg-0u3J^@s|2{zszaA z)TRz}cB_G}=IdwMgzkK2v4jrXe>qBfj?;XZO`#D(8`g=gfzCo@5F)hG+-Vazc9mAC zM@s6F6wItL)nWj{2!%bM+vdQ@veW!KXUp4CtI`xC%p&M`Z%8SLV1<*0{OP3DtZvxk zD$hqs^u3{v~k!-<_)2<|FTlt<49CrWWSj#IpI zAeyLlZh6*Qodyj<)XDoIEmh8;9*2n#;AyLp)_NTVVX3m=Kp$QU>qi%s!}>*f0zuI*KEd0${vgPfF;Ai<~&<+abQ2=Ivw|X znnj}SnwBoDTil0!2XDQY8Y~K}Qw&l<_)%+769$PgR)z|o2_}qMJ(!p(di z7nQbZ)`v+J>?EV9oZq=Fbar#yfSD5x<)aYTk>`33Rf-2;bp(6L#KbZZ!L#Q_6EPc< zaIVz_+bXc@1<}NT@{kz9imE!OOpY@I#H6!W?m&JIT*3Vnx6 zQ&`r}g6l{WjQw1=PIIo2Xd2AK4#G|rEE{EljHym6?$XJ84x6ft@4^g*RaewaVvBne znvPsIx+#_s^xLsf*nJ|k`*LUv&9Fpt6)uL@e9|$1fuJL>sq+^2g0a3n0;4)_j$!N> z@ehpZJb0th>HL6Moi`^jfKUvh&RFD>mBByt zlsP8IG&n;V;vYQCnX$?Fnv*&9G^o^YCYJ&8@HBc!2*U6|vJY5Eng#nt!$S@%Vrmb`sHh`zJF@n&fu&Zk{iN$O`x-dpL zWF4F)F&)Omv1Hh@nN$qy>tm@@O4_{@F<>IR(ZcA#A1mReczU#mTWs<^?14Z%CYv~s zw!XQ^HIkLu*Ed8{ zvBj?xu+1+D05!1pL;->>k};hxM9{UI`J}r_q#`61sR@Y1+JaH!!>bJzHL|*U_f<;8 z{h7Jh<8pCH=GS0+T0#^wrAn2d)ju+iJHB(rDsZ&`uLH*`(=+B7A&U#c=rmItP8|A0 zF@qZbG8w~FMrCXm{^~I$asa}(Qg457@e|j@@ymo@K>M35vj0omo50sql>Or~_uMSa z(%zh=EA8z~+CtK%B}q$LXbVk~v<*#@kfkjUxMXcZ(6EN5oU%rnm-Yol1I z>LUz1oO0;m1Vv)){VaY1VCB?1yxnU9*g#!#a5oBkItw<&T{~kW*rJ#Q3F18dTI+2M)ou`6K9b7;Y?yQ{WOvx8@1SXf@ELM6k81Fp$bFwFwZ1q zTUPvUAsR-bA%5)Z!-;LE1D4W|Qc4v~<{sq=lf02ZL_d(Hwa9g7oRG?PLHZj=&58;> zI!Z$fFPki#MPkqJZb*D(k}H#Xp~~9V0pYGp&5sU^40H|d?inH}HHlA2Yf~YoMiHyU zJCsh3?u0oWD$pUU+S@u1siBQHNm1?$w%{2j0!zNO;Sm_NUxZpf>P$_vs}_#Z#wC!L z9wqxg=C(#iZVMB`ZNu9&;~ci&V<#3JM6`i^sKWY;nR_+$3R`eC?9nYWTk!3~q=$r^ zVXE4(1+S&0C#yG0R_~B5S9LGpaijq{8GbXH<=x+L#`ub~c7F;-lV zAx&gRfl%8pH7YlS32)+da)2_ZY%oNQLmZ!HM(R`hZHT^ClHizC&7qp(;Q}~?D zo*@r>MuNNu`NK(I8_jeAz#EI2^kU3vWkNM(dL3^z|+<+Ez_u%`Y#{OWK-{?dp zpPz-x0=;*Gl(wb0fgESUakol@RH_c1ynU**)zuLF;x0iEY_3_`h=aPgH&98~e>Kof zudZd&+G7E3-x_u%Uuu+%tuu^<>^ zr&|G%l>4pnaBC~*DuIxG_j|~?b&x^gzCv|{pRV2*B;`Sr?kETvgD9N0*Vb>v_bo|D zaJnvWNlHV$h6)@2kuynw$O&V#7F<`PvE+r~WDneFfzIylZ-+DWZbZ6Zu9ME64m-u? zPS)?1UI$wf9T`E?9`|ajaWS0 z@4lV}#O3(J_4Mt)UKAb#+-rcGSO0)U-mQ@M$|Aas`v9;-^>60sMTgo67SCql8>QFa zH$hWUf1zvAc(wR6Guj6^1??mdg2~Op%P6hC$pw!CCgAHu*R$?IBrdK0xncm+stHkg zn_^c$Uwp5qb)Z~P|2I&oMs`n7pL~RMq6lKl9RSHHT!nuNe9oOve8=P+*yJGaM^~rt za0i=xa&*Tc_lZpnoGjduuSd}KcKGONXR#=4M9}+R2P+osgcAU7yV4|GG) zQxA*j(cxk5ihD-1yQ|I1IWyXafE+!Ydo-(AtoUbBjDqovV$-8tdj@(2@#PMQZ4_KW z40h-Y_~`l-pd|WLt*4$^i!0s-!W010v!`Afun)Gp`8c;rS=T81ET0E3QUtAUP_QK zJt{xBnldB04I8pJUiTg^H?#)^5g|(Pnh?dlosK|pqj$5S>Seii;3ee{L_O#(LJdn< z@nth~ON?_%2YR^f-f3cq%GuL1j0-1b>T;aO!OxGoeT%gR!QT#jL&H>zK=U^qOd(5Y!LG8VrrJ9-~ zaLnBZ;+*=orq9P)0I#+j+7R}|X;0b%RHXi_847i>MnNmYJqx&e_`9HqTl{j8ZXrKO z=G#RtxvwFU*eJ_Axta=@m{n(I7rHO!6u&+b8z{V89E?ymc&;)z5Xu=Vvp;d*+id%AjrUF3F|$DcpR>oqdc(416j{sDL#XMbn4iFFE`NSt0lFSr}^A zxe5PQp?nhfVxuCzx^!|@Kqz0{oGLJ!k86I7!#A$Ff^NC#1G=se@*D9S%dc&ylaFii zwQPZ9pO!B!g6jn)4SF2nQ%gD0Scm|~nj{p?$2E$2&dev-fJ~3%>+`~6 zBM^aSBChHlN+2;N4gz$!cY|u>RZ;$`6Oco|%gEih!;>-8#D}lVi?Js#yj3`TAtJWw zg(!bED_;lLmV<`jEvxNQeT z0=o#MdYK~>bx5Be{VIS6T2dk+nQ#EcRy{a}zoDzJO@tKlxv=6FV|pJ?-vRSd6l*LF z$;K{#(||P{(uAUIZA!mL?gzrr;kIqwP?suKbjHlVH?gk+pH~7Ra@^BnJ~5D~(`hR} z7GDyarCin&UtXY36>tY6bhzYJM<{Mdy)EK|z={x48>d>9CngZS{*lSQF5q&g)z{VH z+M9`yD|8>Qo2JVY>{M~;EePHUzf~Zos=gI|2?aqb>Xo_P2}zyQv{(VFy8lVSmz2&z z>Xf3UGsjHdhGV=uTnUF-dZwc{#Z~f(aA>ZrAC?sz-UA!i6Yz~zY_g+6*!3wO2b+f; zI1nNoGP!8v3IT_aFj1XaWe+K;Nyf1@67B36#KF{(faJ5{=jZ9R(uq{I6Q6AgglSb? zAB(L5xX~gU-3^U5eB(R;M2=OoOU=i(`GNVmU|&`fE>J3dw6i*sBp&coUeGo&ydBjM zM|wX!TF~B4!Ersp*##Iq$~mCSnlI?{;a~EukZ;2)wA_=N{mf+2vaNqsDR;;1s+2n z!0yHm<5Mj>t-3WDi#xt)7FG&=RbE^cPPec^qOFj)GMuTAbQ{t_em_XIE(_hy#NntS z5y&(vfWTc6l(IZ|E3u-J4WAvPlTIxpAJlA)#zXHG8AubT2(Js*X80>qhE=yIj;frK zPmYa(m;52EU8p(3;l(DhdHUY(Qzej+4A8N4mtXp!4{lesxLdNGnF}d&uXD&v+^6b*Q1_buTq2kijbf>J|-2Gl)BzU_U^q;E2@J z)y=rv^!g5}8I39Pc=ds{LDLx2fqsPkL33(qyFP8CV3MqhWQ%19UVYk0-y|9JT2jJn z#4W!bBUqibj7jP7#CotbDJ3l~LJ`qpiY4gC6r|KTj~)x?QDf8VT98)D(Md_+kP7k~ zti1k9Bn20EkdOOUWTa|E!1b$HBu-hTX`_Zk4c(GT$Q@l2R9f0vYEf!;F;?baiWR$+NQ zaV$E!Ram0GFb1{PDy+{ZjY3xoy=M7sSW=2*`Q$OksBBG3>+&h1)9R9GMZS*PbXc&< zirQgQMt{f+TLQWqn3DD~P{2t&2)zJ0NJEb66LTz~934HKB8$!g3wDG*D&5mT+cmH` zIaWj@;BaFi2XaRx%<5oLC){~q3wTq243|aq4KPpCMw$AABDbmi1F@rzp#d5R$7Dj{_a5*e3}ozI{+>xtcSPp8-jqm9_yqB^T%Lh)lU zHs`d%Jt=l{X$+n`Vns={y=YG_b-fnBE5I?xpc_IMbrd-ToKZ5d7P=UVw+;4>42*-j zsY@2*A3TInAzsU+pR((8S zWGl}biH*`Efi}mAbgK`H9fZo99@2y+uY`7KBF!yG0F(0MjK*y$y`U(kb$? z>^qGjp+O|wUoE(ehsD(&rmntyVo{R4Nr`8OH9gG3bLa~8n$R3fX57Ex;^EDZwM662 zfw{K{6`ihL$aBSQffUst4g>rm83}3Hs8be@9>pr4oZ&gwg+#HiB_UBL)PDAZQEHBJ zub(WZHFL{>z*Q~;*(cyBKk6-H5Ue9%I&M_%a`NC&JI}3g3f+GEKLmf@XS3p`99{Jx z#6+TK9GUgkI_jJDVl0UroOcl!WDy3|+d;_o{cRCJF`Y0^h|4r*~=sQ8*R&0L@&Qs$^$55$uF zxbM3LMynxtX`}eLHfD$#WnKFQ=!UtUMKS3`*hH&D1nrK>0RdeZ5s|7ym3(VF@05AZr~chJKp zVU&E;QTL`7f(o}{;$k5$La(II{Yj`WLNU>be>lM|j>c^XbtMx#sW>6v_L_?!tVcn* zd6P_*#Cq}8ZNvq+b@iN8AYmv#z? z-!Ptq;GA>1iW+Ur_KQd?R5ILm3%RWtTIfE&8k#FBx`sA(o!Hc|9U2l?zOI8){BZHd ze7FNXK!@TOl<^^fgTBcKH1%%d&YRr51d?P%niQQ_1YV+*oPO}C*%kQnUHo3D-aBkV z@V2ngg=J1%vwr)F@%EQeI@!|JYtwh~N_&u>N=97dwstv^j)IT;I0e8G;#z!Nr9Znb z%2N03dxm};CP&|}|F+v@WIKA@=@{FWsa>aC+{;=Npr_whaaUSqwNmS%Wy zS2J<}Y$g{v6lm~kqCH=dIrnYf!e>IS->=>*@|^aHE~Y-dRMZK7lK6ugYfk9`_I3YW zhkpG&ey>;k+b+jFS^1L8QT1^r`nVf*sXO2+ZYPa&!Z+aDC5Kz50F&DZ&r0*WRLiCVRZ5#y+9_X-%xiEXEs=5MwL~OWMaAOFA~&L&LvuGc z@B7?nzu+C-P5rNj=J%r{S2XZ;@Zv=c3e&N3a?}u}IeKGD@s-gBGKg5S) zDL!I^;4Sryu+gW$3lJ!_h$O`8z!7mP4s&#^N)azQHb8C)t9)&zyg~?dNOaoiGXWa0 zMj-6$veV*C8*0`e=mw=b#=WT_LVH_pw7RZT(|GWAS`L|d-# zc&qS_6uvK!_i|zZ&xN#n{J-1-b#-(k-vgbEMdI_U2a@6ctCc{R$28DRM(m8S6bLUw z{K!ZHy4g#6gQn9_c@6N$1g%w}ji?A)BMo9W5(`>Lur)e%s!ZxsX<}0H%VF%Fga zTw*In26tlX2-+a$ijk*=lw>n*JmF z-htmA^pN^$G<5L7V&skpOyk}6C-KZ=AxT8X%okbg4Bu~ zLNgCoA&u97Mo^+Ssl6Nj@VU8q>6gtKzHHuMc7FAMU5MlNT# zl7TI$^s<>0i_U!AD`s77#d^}xqKnrzywsMKnkqPDXhQHG!eQs}W)KJ6F+$;H^)D6* zUKn&XY;S}RT)0djmcXfO*s}c9%2rms!pnzlhl@?w?Qu~RAXP@ZD0tXZI1$jLX#>T2 zQc7;v+`MC>Jy#m2EN(&H^{~zG!z?VLfxwj~{BkO;@ZkZ6P0eM?(7rOX0X{hcnDP~b zLL1)qQJb;yVVKBVXaPKMs$AqK1Wq`rE8tV6lKPVzcYNrfRdGwo3DXVXxQ|gh1&W+{ zz*ncPi7rl5g&cc`+XC6sjijkX4sYP6Q_+iQjDas4(x7-a=`=AwH^HqPWkXl|!$wM9 z0ffVC@25V_)IFhsK|uoie-i~@kgb9&OGMbw&p6F^XjzOzt7pV)^U$&cotsKSCI3sH;nOfa+^>1Ywh#BKqTmPE zCJ@;qf#PtEARy+%0-V4%M&NM&c2UH+ih!J{7zAa@G{Jd-fNE?I5U2^x50M!hu0(}% zD{?LY2OaGrJ-rYJ#7FvIl-seL>`;r)po>G&Z3^^9;k{@BVoLh4c#G)~$A*x1BZhUd z2mk`7tEKpIy5$iQ1IzHb3b<*)_lF#k#LMW_ms0S??x+^(Lm_uE5)F^^ z!f%JTQuke?2-}0baFIec#^0wBMF^5HiWGJX$;%|vUKV*16)7T=j8UX8mq=bDq4u)K zTd7ELzmu#)4ARfl4MR%B)k`3>S5nb z{uzX_`YscN;9ns!PowC+Lp@~H2Mddy-ogIf@b$NzgL^R}rq7wjr2&aJX!y05}@Ig2Inuj;Iv;E{~;ZgUwmj$4X`V?qDuz zg=}@OE;zt@RiT{}+!uM7agzf_A3LRppg5+(HsgW|7k?@henmWbRmJgTd(z8B^dmx; zQ5@3^GFT}T<4>76n40I17w_O8t z$p^&>@~-87ABJr{GkOkZ z{5)O~jw=b|ut9^@-g<*tr66QwGGfc|q@Bw`G5(`qc6qMw^GF!$N)kePB^D(mU`0tF zrM(<2e%{UwYllHZy+=ZDk3=P4tuUxyNJmsnKABFz0-))1QZk~u$)D9&1plqMfX=I` zGLG^Y(#}*R;-u%mOhbJ==%fT^48^9OE|tXieL>!2SSS>-noN4H3w$)@(*42AbRZ;u zKvGvMnO`uA0xTW~vXG-Xend+(=~I&AHyN7*DzJKR6jqJZm7C)@K##>p(}2xGK{nLn z26(lNlMXb+rcG9%AQ2cn9AqRFy-jVmWSkPH!0M6YtbDb+(HVI(VDs}J8|ANS%$5ac zz~)ht4Yq)|Nlolrl@6bt@GnUc@L!m@XgNZtW_V6STw8eV#U*O8CfFok^2;ET#s+A} z3MON{odhbd`c;q>IeGMYD`|Bs3b1%A$O4`($*_0y;cpUv!LJh-q-=`SSg?3J$f9O* z3mnRAh8MQRq>V7}$o_;o51~gTRyP2f9eKa!vHketA zveEm^M6~ZJ4g`lkn4^tGD1vI$PSQL{N zS^eEbB125(AWg$(oJ5yl{6$APH-i_<0bH+RQ%nERMsEPdp7ex=cIYo5FN8&4^NHiR zM1zB6SXjeQ13p4G2ou2~+US++Zo}>vng=ztM+j$(z!o8`Bqp#i;@t=TLSXi(178$4 zH*TYtWNn=>TC~Lzj{D9~A52R7hIho&1EdDR_o4ofh_w?MjIw5=%P5`}lKZ>U!yeq>6j59= zM?^uz!`S!C;V%gfxOOs} zxfxE^;HJ&Hw?^|l)k&lWUB0OeFt~xx_Wy=7WT4}e=?G5VlBY9<_u^@b0Mz;igfXtV z0eaGWJj;85H886k?as_-^uCh*2d~N1<(Sm`^gPIY$f@bVGnF>?9%vhE+d0J2qo&6< zs0YD;SpNxHr!7=4fN@C%_evct498?_^1UIRPjVIduF3Bg1O&JYps*G!h^eTA@Ad?G zGFXRSCO874Q9pz^th~X{b=>h;e1+3MKE#saKg;4ZPQw81?vmr9IlS3vpyuMmlCLu1 z!wM@PG5-)&Do*hy4mw2IfJ>!;IIS)SRxZ<|zYD2w$D+gi!|-oFN`|T%IBQ6jo!I|` z^OHiw*QR-RR1u3wycr(Ouy{ZP4}MUnDEAXw~yf-RTN}J~y z2UU^5V&Xg7pd2gfmmckgR1Y>51O2@{zSqBug6%!qwj&Dj@QLw`6X8}x(?bU|gVnv1 z?p}a9#A9(e*$L&%$nP+@3UQq%{H=Mu)#BZ_LacXSACp`BL(kirST-<`(aCUjgqzVH z3JuYY_ITSMG$T7nK@`lkJLFsphvGrJQ@pdtT&O|v+e7)qXJ!UYxsn-NQK_gjF)X_D z*2GwlK!_FpG!y(t_JLyQyQy2G+$Wd=M>!4n6h3dDRs0cUgp#RH*%NBY&t%SbKP6`| zb%=~39Q|yD!X|=>($0f9p#lAp5+{>({-6s%dxUp~*9BjB zl`XkzHdMgXY5Y1AaOp&ERzXcZ8FTWg!6GikGBpO<5=;v*qhw>lI*F!~Ov;2eD6epPiM*t=p^;NSmYplwnB5KB>3W(Dk?3UZG0ele;P`MF2If+ zuL{$Be;krzhUvcpzOpO_mivjNT`n}#QSkhBH#+K%6Dc-?s5Hw++ELUVU2m+i9yu{7 z$>8^a$!(LUhp`w#lipjANqc;F21YRmzQMz%3(pDFEOO3b`NCmC&2CA2wb%fclBa21$?nY2@zcGGWqYrA?JmN zSU(Z(YnPT~;3klyh(lljq?Sh@qE;1gWPkf>KaaQpa)06MhSkM)dSuy>YpxNM8Os|D1RaXqr?%$!fXLD(PLQ zLe^Q=ZgQZbW*8j>hk%^V?BSSiAW`R09B0ivU7p0ib5H%qGbgcYz16Yzuv3x^$*D9Xalj9Z z)M>`oR*pn`O8sFv1B+@0ezD5prwXUZqca&BW#vB;s3eR1<&?vVSe|sL7u+#t*`4@v z7k=-?FX@OGKAzy*$;pMX`$QGx9m?d-#h?W6K=q$h&uP2O&HV zI_&g>gF4DEO$ofyKQ>SP2_JwVPB2X{(WcWxeeoxW-2qil6|}F;_EN6v<^16557@U;bY3a#)+> zI%@wb0nRuAu968O!pRJJo$c9hNSVfIqCEVu`%e~NWZst@h%RII;m`f}eE`4Ie-ZLW zCZh$(h*mUWr((oT!-$=Z5jz7Tc4m5*7j$AK!h@~+=E%cakqCD)T+&=3VN&$QbR8Ow zHH)~^=mS!Ffhd&1F49=6wXsc|B^SEO86l(SP<9&hTUX!{6r!l={X8* z3|Pq#83`DFlSqb0b&#b%kx5cfoQ>ZmQVFHW#-;{EMZq?nOr(PQ9cV|buc$=yV^Jm< z>^)`C2`#S5O|^(AM3o}@?cXI5Y^Z30G_nz%76coj`h6l*GeVS9Qq9XXtEUr*gtb7? z5>4?hL7_jwqBeN5%`FI!C@O`L{yi#*Q7zE@XH+`BVjz1rLyd~<9X)jL-`NG%hGK+x zLjz%%Mjtq_<`P)XLsie@BS)BWgO8(zbg=A=p|RK{&l*SMCVKbpCzb+_g`E_G7EbFw zM?pz)Q(5#%KTIfV{5^uY;!6n|D*QU^3jD=n{a;w4+J~_N$Gw5*rNo7*9kS%%{{CV0 z!7vsj6tDA=99L$A;7C3QyQg0lQ(fsNoMniy<@%;G>w@>yA}2+(h3=QgVY+Oquy7~a zYn%qpFXqdf1+T$$pH3p!A*pR`(g+zkc!ReYbXWt8a^-81#GkYS+NM`T@V^1R!JOjf zL&--W;xdn`SQSG<)eWU4XGaY}_{c}ooCWVXlM-0lr=0DVlFkBhD8QdebBf<2v8}%@#9@g|re?Gu_NE+j6Y6h=E3t!SIKDi_ zI!_>AwwB-MqePmN0+D}vbppta27<4^E9%HVFzCvpXh-i3gld2tg%MpPPspfKG=^Tx z^br3G+Ww71`cf)i{)TCyf&Bvdv@=~UT#hkt;|-kfPy z7VoJOXM>&ncw6Md9brWLO5>~;m_mU{JKxR}BbcmkRBo8(L?CO$h#r4IRKEut{!i5J zg$Z^xXlY?qQ;-uf&el%2;RD?|@G<9_30_516jg|{L|B2#P@9nRu);&~Y0PbMAmBp2 zHa9C+-K6DGJ=?J8Sw)d0yh@&4ucD~8n=g4y60 zfUg8QZV=*qjI$zC`3Y(KE2#YMa_l@L!lPRnh%MA|*GZQxfohXr6Nk(Gj$sH4^+dxO zBT}haIt^}3Ksp#CO(#;MnxqNUPf``C_|Mb$C8+rM6H#$}LdFqvH+oq_Lde7QlXglh zyG}ZsuvU&Fk{ij(Jj}|YFnkmzx|J@fSou}y>ce|Ywjv`W z)z}l<3S+caD>8H!FqR>t>hHz9*Vvd4V~l75k01IgEIji!^8zWFX@6l zIXFi~>ksO}>oWKQ=)zyQx(gvHOIXdZ6sPDnlERQrZYlDIh|q#@;W7q$s>WNH{8y;P zKk`ARNZ_;m)#B2Ndpu38|b7rr|8a9!(HBg>$PFV zsMGA(Dej3`)--zpr5V#K89yrc;w=6S3VvjoU9fa61JC(FqDpc}h`S*T>=}Z;5tg`p zvsYL+Rq~}1CS4V0eSxG)^G1ggg`bNMwHj(hQJlBRbc*e0A*we@c6CpY;};i{-zUmq_M5!^IX zPTDXYP6tAx7-cpG;(o+LeiK^x)@)q|vjituXJWrVrMnkT6qlXJ^0~K8Ck>d{q+8^63 zrjDta#D9*C`D3BkF-E84CVye}H#Ov`(pa6OZ|7tu$(x`+Cm{x9pp!C2>7>l$oirhN zC*h--q?2--#|s0URGk-^n`?KH-+JnxV>dtTQ?>@`J`i$$5k3Gbr9|qBXBj?yQ885LB-_gbp0M4y>ZkRFX!>M zGMtsS?9Yp52w{+z0cv`X399%iOSbdeC6mPrF|OA|dEC3}T{Jllm(}p|FnQ%^2k_Mk zld{wjEL?c6oScj)l5uJO*a5u3sFQwKR4M4g>8T2}w3M}5d07$fFjyI24jWdfOrc@In!_e=bIMr z)40JJqR^c<@_OQrICTK|A)#hzq#Ol9<6wXKLVgZ6xR$b-1lz=v)&qj%oFJ8GKU|_Lg_(AjRlLZ&eYJ zHyZK!#I6K}>MaT#5hmI?Rwq1B4hIl3KTi?*JS-%8sVDQDOZdP3rv*V-BXvQSFNKGM z&($I+Mu+pY)P%qdvFRYB25^zOo!f z=`+W}a#J(>Jc+Mr(y>qbdMp6E{EX88PMMWo#h#62Q-y0{hlTx-|W2lHQ=9WXBL z=2kZKZm^)!e0y(4((K`6334~O&lJ~b_~(R znj(en-I{aLO8$CiMk;pxwm9WSXw?TR`MaU14t-8Hc9pXrT{F<2=SRu2+HCY=<7 z!0PeA8h-Z}{b;-rZ=Ri=Vn_0e3YcGy-j4>$z3In`*22WrA2z|p2e^*ekFTxePbX=! z421r9M$TQ8(1A{DaRS4=Y47P({LLioP0Dl3);?9m-ygNLMz@Xo{a#ni|2b-F4TgKu z+V`sYnc>8@D_a}jIc95rzK(x2?5_*(@Q7HWFu#)bR%CmJE%D&6+R2W)%~!7HmxTQ{ zoPzCMwR}Accl?%*gY%f}e`Eu{VeIxx0o2|tjaSt0+sAIc!F6w1|9@)uJ!7{%zpxM1^|5Y1d@G|!6w;1nD7ksdhKRb38*p(*UWA?(cwfyC<|CvZO zqO8i|bl2G><$mq7VT8Ck^{(@VP5iG$S5s8q{=uFv2nqG)+fV&x6aUcY@Hf`2}hIm>QMg-Zb|o4gAtHe=!-8=a{X% z_y~U0xGEQT@6-(#JtVJ7y6aGayjPCkH>DLqQ&H{3VNEbHNXv9D1fqMnLH%(fzawqN zn7nNEHP5fsjPb?TRV0E0rRMS^PpZ(-QLSh!^Ev9UE@#9TeQsaq_MJy9>0VFSt z^)>o=Qk#hE{^(>wp$+K7>cq+=%PM-E%`G9i@>Ly3R?>2{2x$eX!b@sj9Q+ig81e=!E7Y8{l!#^Vm5% zh|<<3+Hq$zDFLVq|DAJ^(wJ^M!|Y_d8;8Lb5S!}Jb%KQf2s89>MS?ISF%p$^gABRV zxm#-UDnky~&d^XN^&F&=W^a0WI@t>VkwnkeNq2@0?7vseGYZ zK?dG*Qv(~o;>d!BIV|;thr4zTkY1X+>|w0wMIM?%%bgtYbB4NL?R*Pj6+P$0=Rz}J zc1-r}#|oDMuy+@iRj!yV1*UdwCJ&_-w2uryrAHP3E77#*o}DoDR0$Ih=IdchENF>! zb;mpUhFRVharcRnD3kk&7;IS+4we(U7NU#OTW0NRz`19we+(jBu9iu=?}hwLCkd z!hPj^aX$Ki$pBAkt#}l*{{?=3iC?`|G}mvcQQ;N%IiU&(){uAV9$1R>U`Ab_Q$?f% zJ#E{D`$=J$G#+6yLeT*j|C**Gn};Gedj|($KLPiI1R$87DnPIj(FBm~LY+;-d8cE61txtNAtxoRmb5Nr5{};7=V#3e9FIEFO**P!qAE-s$v7_D_L=HtWQGv<8MS@!XiY|tIT5G0G|KOO!>O-}tG+w&i;x+lOr4_#2`{*$l#X_#Ngbv|L*J>GtJH;iz%Iw#zQv_ZOV z=M9v(^0qX7x0jC74D5Tlv>C{u__Op7FC_D{oHcuX;Ig9UH9csD)!p z$+F)}hmUOC-oCwHfx>i}v%1K4{*^8iw^(Q6p2t>_WzR<`o2O#Z0N zMBFM<#~bX7`H+;|&bFZ)#IIGfi}*gD35l~+IpRx>8vIJ`HP=;No50`qxQfvs*;zAI z*05FAiLH8g0zb>qb@8e&W*#hqw3}g%;m@z}`#64|z_0p_kash&=j1v1gGEW?0YAR6 zF-HEW$xJXe0ST{j0!!9`-Zph(BmAN@ZmJMY%u5-M=xjhVzzD8dda1_tGcN%n{7%F1 zxtoAlLjI=VQ{Ve|dVWufx_jHUi4ZvAA%=Ld_!#U@^i;1Y9xDX#Yph<^2rq?R7MVlS zI@4g5IUQ!1Ghmj9U=w_{&P(p~$Ord^`j*C~*un5(A2m@jncP^5U8zldU<_85>uT1+ z4Ae&}Uw){cw^gQG+TGzsS(3$36oL$KXpx;K$hcl0>b4A4|b_saKfXZ zPY4F*a^FR0usJ>kk-EvDuIK|AK=4->Z{7-T#&Y|(7>ejZDuK_nktEG^P{<7lnH#qj z4Z@dhG6sZz&pv$2dUhkP@V@O8jKdF1N$X+;3j5>9qHWY2O&c$bH9rnHR1&Mx{eX&ai0WQ5i(9tp7Upw3L7P2hYap>$Xnq2 z%O}@jE#|%tRI&3-Kk^tIj>tO9&A}PrVCRQErX4Q#DI(AQK-93}yS+%avf}JD9+f0? zV~lfxK9S2rxLy>FqvUZStVoCAkX`5_MVj+nN1QHrKGUo^;N~B3hQ5I^;j&D$$MYsO zE4pJaPRofndPE5t*xokexz(BjXG1XV_PZ>m6QmqlS8<;6&9E#NeMVv*G#=4#i=3Oo z?tkHUs3Q>1MPex{zQl{dOY9l>MAD}&@rvw9hMbQSbA)ArsF2<-b9+QcUfNE}NWQXH z@>%io9`nJ0UUI_)k2p$%!J=~NiPn_R3z6zI1L_lo*8hYGrfJbz3MoVm#;zvl2jYC59cN@)=;m~~d9 zr-8ad>AM)oVUL`A5UDdN$ejXgRQwTulu&_brQlQYD13L|aMsTvA7POY)@TD{&IyfQ zUlSPq;_QTk(8oE>>zSepxg)*ykxMn^9tE?ziGg^!&Q~Y6&xgpGP@LA!0!axBe~A2P zJonnKY(Rp-`>1}~d!Y15J6xB;XWhx_^g8(-;}}ezimI9>5#_-=GE;hGE#knKXJ$&I z?;#TXBQqr`57;<1dz%4DZiMIIEfqD*EIVwaQyM(Vt|LZi7RGZ=UJW0R=@v@3j;^Y% ztvHfpXIL1)uB8Dde0YPzpu2UFmX6R+TOsswu}HjtK4Z~6Z5_~Kg!POb1&CHgNoqLh zR7@bOQY3BHDTw?W82%W!@N=p0=@`qqC@zB~d4VFi7&h8YQI4I=0vVm$voBQREQf}> z9@vyoGY29aj&g>CGaa8e&73Qs2`3x8NJs2vvEdfC9ptM?E-1i+tWhJANx|G2)f2_i zqGqs~|Kw{AGgm3j>s7(Ehj700)I>Shu}bQI?CW8?SLD1sF@mEJ?Eq+jgx0ou9MVgi zGbefJ`jxnQfGKsp<6{sshD=N;hThkKTgoP1k>~G2$qRKubsYs(HHS2OPB;1KJ~{1+ zJaT_rV>j!i`oo$$WqZl~sNS$P-hd67hw(>s<+}BLvOl8Xo7YeFhjSf*+8CA0^v1c^ z`3t|zEE@sMAI;Z8oWA~d!Q4r0Q#Ot$}d+!wEMa6sIJ=%MvVn4o)B`T6bSSd6{gN>Qm-k0bzdeoilYGd!s)u>URTkZkp+}N630&xnwI^eBpk9e5@!* z%`u^RI=zj0C@Pl|c!0xpHSCrzl%*MQ8O0z;RV(V+=~j-U zug)lgx^_k|hX`Fac7IX-&b0H5@;Z#dmLt=C$Yc-2RE?tRrdh}(Z^YuM$PWhjY@a+; z2T)YOs6n2(6%;{gj%bA(y3NhCDJ#{1Jh4EYR5j~Fo`PVW)YYR96ots9gm|gCi-M)i z^~qCIs*IMNc?NmP`jpX3nU5U4Q{Gg)RYr4Ve>+R6deK}tAdn?>-DtiPA=k!6)Nkw= zUq&;fSkb1c4b6@Pnl^PcXkIJ?xn6HmRfT3mi9w%wEh(c}vB=1>xgzLZ*~sx}2uV!N}K0QjwHZqX~0}N1dupG+$Qw)Tt{&6J`}M&;+BQ zoMM8N(`;F7(5L#km(yH1)X0DW;+yM|?BD#cTu$@lFe8t+YDtxeCe0dT(&8?}B1_pC znlu%GJgKKZInA22$fovo@?$6DZevZha+*1nNwcNiRxF`8R29se;%zOVSyUa&B*Px6 z>!l=1$r74E>yqUfM>T0Ct@rabR5#XOWTmPnO{EP9xl#=FB{Y$0lI0plJ!x7Uo|re~ zgjqr}Y@^I*?6^}kkfvE}LatN|q{+6)$~BHDx`bw2T|%x@Wzn3gPt29NLulSLAS10H zbf#EaGxqFWLX++YBSY#5w}d8KqmiYhE@de+*_x1rz5^7uF2y%$Db25DgFeLvYAH>v z7K1*;2v|y!YO_I~YT;Z;Gii&FA$2z`rD?R)$THgL*I#Ov(i}RHvQS)ZM8(5tsyXFH zX(`Q~qY`qZ7-CCl>KvVzE9DSdO0%a`XN2Ct*!$6?G;NNt$VWX98$ChO=2+xvf`)+} z%c))}O`3QhPs$fd6XrN%!Ut{K1<{;o3*<>z5Y3tnIc)H4udIX$uQ<>%-lDcKf4V(uyAQpUG?$flNc>#+N2f({7kM0pQl zyho#}wqmb~`0!On%FvZnL;yvR;}rqL8k1uCipGjfgj~+}4vj>tcv>S-Wx}jryjNi; zGGxX2YJ`HX5ehX2Grm)y){)$VqRcn7G&E4QHpcrDj@)+xqh=Ct?Tq)^xW?*D*qTzl z4#o#;oLHuS>12GD!ZcTJ!XU$-uSQh+^k2jO`7x?QMV$bRl0 zI?xYqfc#2_{WQT7e{5gXUcY-R_En#wWU9?``11$+K9AoQ@Jsz*#EzibvdY?;I6U(6 z1@<9Tp^7?sdxTzkvAsj~6tlz{gAWj0h7hk3t=Sas=!R_xa`z9E#OhjVYfEAtFX4QA z4eIBxgJey|)9;F*H^9-Br5M~}jc-58zUpWlvr%af6}o4z;>SWl)up{{2s-9HeckIOBsFt?P1h>U-+TmgR_J=jeI1B==bWHEkih*1 zxOvXCJ`Q&Z0x=VMJ4@m9uxA*m(K42vF1?C11ncZx43Sl+_<2wLpE?sU1}XHNaMNe% z+0eCxb;m%L9a0?#I=OT=H0u?VQMIBwQ1U;!tgwaZi^wT@{Zh?%s!rUL@TC@08PisgGVcfb=d`H}M9th5+iP=;DqNu6A1jZO^Hib{G04m(xmOfjzwQz5Z7Qbd_xny+Dq zcznu)$X|0&bziMeRbFZvqUQWIQ5XCfWgS)=_toOyUdspj;iZx1Q*V*}4bPY1rs+BD(a;v2U3vG-!F?4u=6Xq>Cv1}RQ(LhUi zWTdCFY#9YAUOcjxOo(EuW11!|49d!umBbbc1$v+~eF>rz^P@E(0;+h-AX6BF*^=@g zGtdiWZJJqG`3j#KfW?a!kHrxb2FsITqCw>=Vy6hM+dQtzaN|;0ThUmpn?P1JxE3b* z_%K4l#ESO!63{!a-!bxf%|l<2CC>30ho+l+sr6&<6_IB=zJYEdzB@Hv>IIXr?uap% zQx>zq%A3D*|9(xdYNUPh8D;*_jPpP8~A-wtpTu&m1-veO9h!o;*y4{ z7CLy~c;Q(pNTl5N60Qt4=X#?jaZ)#*a5yD;HVhJnzhqsCBchXsCC9}YKN*$*`3TrF z1p%98f|F>b&^ssMIL>&;P`08RXS+E;G$LYpc%1O&X}q{ctE{Y4*z$v^D#aS>GZ(hG zFhY<_%G)||rdvD;8A*{nI-Kv81nE$j1b#T}tr(5YVu&Sur9QfCK#4*H%b8j`mfwFJD(v+f0_r@?eVbQEjA>fKBpRXQcXv zV=!HBAmqW7ax4+scok>vYB_3C%=x6>b|X>Q3mYlkwm=+n@x9)2qFf5pS0Bp&Hp_B7 zfH^T9F#nB31B;US$b(YE5t=UM6U{O!j*uvb_8Pj3eYHZkcXJhDTiE#W{4E=B+b66| zgl1Z8Mdd~X@q7}RHEt<=<$cv$>~1#OzEy8$sR01QBznuD%XC3TC9xq@-PkPa|fw zU^le8BQCZcIA-uB>K?Jzdkg*ZSNy)M)}11<$&WWwG?IBd#co?556-kfbQoMR{_m{y z)b$7l122m3-78-))^{xU^4-ey{W(!4{*3bOOa}Yv{T1I24`opEf+9N9nstEA`?0~s zu3SYNmq!akP_e?XreOn47(^h}`N_=sEL?nI&;r5U!Jl{W`yPI2pS_>l_lcK_o}Y(B zcs}-hi|GR_5*w@6Lrn)ShJ=}$D`QyS4@`=z+|U@qOfF4|tZJ%^VXY|lkYFWN_OfM| z=w&PDv$4cOf*L3NW^v-D%Lm zF2f<_i&FqSP(dWQViYPu9ZM+QB00cDwg2Z=$N`UV003B}XYee_xSBBbvY-50|qGhZ1Qc)pL z)CMR-e^=L4Qj5xoU{f*zsuqmyXp9m~-DouRc<~shL{lH2k)10`LQO!?kd(qJ3bg^z z5u*}`vQQlmHF-ody~WlP1C_>Lb0Vgpv1U_6D~#VJ#)HeSA_YHS;;2wyHX0pAeo z@;Ug6g)7A#Aoad~)XzVCqvP9P^dY|w_G!TQ=+hBE*cJXOoz_wMN&c-j8Sbm^h2>GC z?q-hlUU|82Z}Xn+K(uuC#$3hf{LSe^;Owb8FgXh-0k|dY- ziix~_zQL~E9^qfvW3ZOAylhB=A-B9-@u>*5og&iTpx{_Z93;^B`hJ|oF!B8yJ zz6;%>9oRz*bqw|lzyJis4;O$UC#vi<4gvr%Ur!&I04U2cxs!0C5ZP$|u)FPBiEJ2ND&K8hbr_i9HkpK2G3HSgCojIcc&y(7X3qaIR4nA5@AcpCyV48lsT zrvvrdf@DOFcmIY$);opnMkmj0#B-BV{9uMx6!p9;%4d#_!0?qVQ=(SHW=qmGL}0Lc z4B-}ZkL9qYXEVZc(9u+tIVcAT^bYECH0tuKQ~b?LuMV2YFg9g~5of(OG6!kQou+zYWmxvcmtkUhahBH$gI(M3>fkRH zRwu(O-|7eE{sK06VOD=t)_k`>Oa%;|*TepJ_j1!Tnv%xWfy0xxz3(qIQcvo`V$W)XEu@moG8TEnol zw+r*P_p(AEe`G0J&*H~&y~@y-oi*+OghMCpM234{5amr4vwEH?M!;K ziGI*=?0x*9NN^wG_apq`T;XKlAdwAeP7b6w6Cur+l#amh8Hj5R=||Pt_1eM|!cW{~ zz*hW3j3@+2f&_z{J3;-ix)B~G;1Q{#w@u7(V5+Luw$K$|1&KDu?5d`2UH#|cBr<|g zj5v||iY*n5p4IDK)k$PjRhkM$;ux$q=#a>w#&Ggf%$#YNaC$KTPA{^;&VJcpXI4(w znVlPUq7%c;oJnCP776nrYP$&K-9obV_)g(-L;MF1Qt-Y+IynatQ4I`6;M7T&foy7u zi7jQRMy$hGD2`Ox*#0T4p`xh?vLobtISrPQlx?k;6b};1LO-|hE5#9^wnY)E4;Jz4=5tT$Q_$n5PJJn z4(ZFyl;Kz!2|#!^<#_f5Ia)@8MDxfG(A?1h^czDnLhK3Yj%utuA=Rm4-}#rzbmEo5 zfBl}Ai1XUnKZ0IiVIy59g?-ZQ-hSLEs>|kZ8g{-c%roh8&5GaVak#LG3(NL!G#+n* zAEdWw!Nfv+4{M0W+edm3+n~=Qa(_!hYL_*&)eeX6(lc7FL!3h>1Fvtsd1vbY_J_2& zd7G(6<+tu_whQ;e(o0^ajvh$c7Z^l;7K&U+Pw%8*+d^s1`Hp)k5X`yEiM)tc!^_yN zO-I&MZxLc!aoeQ@zp%g*ma?4hY9{XveaKIVDuFHnacV+0hs4z^9dqo>Hn5&HW|9{r{Ix4cTE5nLU((*1!SKFNd@($k-m)@jdu159ZzDpwY{3|{0XK57S zSbo*?tJfJXMaaZU zwz6^<@kJ)>G^~NhXogzStRk}?Nj?=48$Sa*B9>IqOtd8c(4rFg7il$%pBb#@GyGU^6wo z3=6}4l7b#*Q93=$&SvyqG#8v}rmlbomO1i~v6xOizljz}WuuUkKa|5D#cpQA8k$C!=6A3vX}%J<`KMnZ{TN0%@^DlTj6X&L^Y# z2NGs!j-)S@0Ocst>5P?6=2X8WlNr%5wv-+iJ7_U-9x`d=q=P3pnTO@nOqG4J%ubex z%l*Xlif)CUB(uj*>cMs*B^}}?t)EH>EByqS5gLGY5@W0Vg!SmFLw(S%>Kb&}VK#y) zOUY~eWLaHGtnd>JCRvQFwGn~|k}LgW#RQ2}v(af~7>_ibswKeKIzM&mq$4M7K`YnG zBn@sLW;$Pu4^YJpH$W7zQG$%s(u0$^DrYHP&S7|CoBRX<>!tutL#dt~aM>_bj8OSX z89PFP^r{=D2~IRFn&^=pnq?YeEz`tk+B_YjY0Gpm*0(MdoI(>yKzO7E7&}TmqS8mp zMUP(gPLKMGsiI)5L$< z=s%k1+tXBCp;@XPk?VN*$k+~zCjPw|kR|Wb^n~jphBP1h#RGT@=oV0C?~=e_IjaB+ zN?_Jhs@ISP7#luF%;1rgqDObHX46sO6Y@B%wT$gqr5@1H;)mprwLN`1x&}*P2Q4mL z5<7Y=_HUiB<;#xAVr_#vdx48BT7-)-xDn~a6Ey8c5bAQEZFu_-z`lM8DUXjaoIeb~ zgHjxt!Cl=weO;XrxvdM4bP-D}z7tA&B88=^{#3=Gg7YxS~aOUsei zF)*^a5`o~m_AJ`81aLRtrvC2X&FdNfVP7yXGQ4_mt9+o3?c#o<@9u`jn9i=%kPLKm zWwDw*P{pwE-3dQGLx-RnyV^<@Ey4UlYb%C^x_08@m)KxxZ`;sL@aybqAK8Zg1C6z7 zT(+#VyrisjIaPD)YPSt^46Qy8+vu)A@{Hm?QBgg+;gT&DgP^(vcacM_xW((=-QQX< zFi?dpO=~Shmv3!`A+>Y>(NUAMsA6zuWhF{Mbe|sK&PznX zrDA0ZJMb82?hpKf9~xod#Pf+U7Mawx}N6QIq79mzbKE(u!z-kV`;!CJ~pI z(h5mWch9y~h!v9{aRfQBWAMa*VZxKxF$qmShG9Zo6Ee1XDK@n@4EsszQ1`~>`X;+P zBC73a_sN<_VARq8s%;0Ct?<*m>;oA6B-(Cm++5YviV+*Hq?s^!J$;FQ~_{;!2LC`mP{3itPSpj@j0G}Oza|HbtJbpO=e6GMZd-&V{eqsQgBhw7@D60hHhq|V1$d&TH7NxAutlF1 zpig7RTKMz;KAo+#@EHL-Oe!pVW&oebvMl_B0Db~{Z>!&4hh+uuS?n#PL+uy>w0ldp17JhO7 zKbgJ1#q7WQ06w3+XyK;>@Ke~m7Jg~~Kb75R;im=g)7UpH{PX~RIy=L{&j{dWumKA{ zGk~AT27#yXOlxKc>*bLa{eA)Z{aB@ipB2E*Vhb$%>;Qf?n`z;r0eqBw<}ZGjjdKF{ zIqYQ%9}D1P>_UrvUVwfc`-;ME zg+ScFdTg&J^Vw+%e-{K=9QXmi594_j_!GPh@XLVr;DAeTtD+|{s>AjV@Y|m?DLmDW z1AjQ+rFh1{+k;o*nPgiU-+*US&x70WjDxiYlNCa~0e>j~UlxFG0X)s1{|L`B4R|8z zKHGp70-kEX6@X_b7)~a|&piBf*a3m|9>7)r51E^I9~}6D0MlA7+kXIC2$_dMui25GPp0nUX*u56Kl3i`VtJr^8@M_j;!H2RVEch_C%!1dj{VccwaxL9k)PHN) z>rEzH$$n+QRqR#^u4dn`;C1Xo3trETwcrh`(t>MPkp&;laxHix`@r9?#YcXXjXO1KVZ6N3g9H+{g~I;3l@e1vj%?3vOW_9bxv@X7+*wZ($Ew@K$z% z1s}=2X2D0X6D;^>cB}=rvT6%HhAp( zf1CaDaI=1wvsW$nJM32$dNfo!Vb0IAF%lrd@IYb;M>@T z8_fFskUej~x3dQ<_($w|3%-M0V8K6TyDj)9>=+BalT}&pU98xG?`Am`{NL=o^=AF< zVNY4`PuY(x_+ECY1^cmdo&T;t3^ z$8WOWFY_J?F6E^b{5b#H3NwEzzr}*L@*Ni3%$Hd3cK-2lGk-6?%Yujb9t$4ehgk4Z z{^>F^e+j?Wg6HuwE%;A-g9X3Ib1irSf9fEU-zt8I1=sQ;E!g3+E%;OR%2G4`3+y@z zK7}7|!P$JV1%JjqT4Ls};&)ka13$%rui>>8yn;`$;23|S+~jvDzr%vx=4V^*hrHE- zAK|d8^M3L|mve5x8T_d-4~_BrOa46zeukf5!RPZT3qF@mw%|YWS4vHOe`2>;@SALp z1;5AETJQrr-Gcwjo;=Xx_aVE=f}iL87JNNF)PnEjITm~+e_^r7ZyNu;1yAOK7CebB zvEU+}VZk@^=N6g#ZsRvta3?>>g7@$Z7W@>SWx;Q=w@XZZpRk`<@E!aD3!cS~wcz7; znFX)mX%>72e{P}4|8D+$3%-btSnzv%odtiH=UH$me|>?;?{R*+1-J5(EqE(mZ^6xc zmIZI;Zx@^VdigyTJj~Cw-~qnHf|v677F@zVDl+-a_?vvE1^<;VwcroMWiI|!HyZmbwJeAj5u*-8Tcp`sbj+y@eezpbQ#A_}1Rvxk74*qo1%zpyE*n*$r ztrq-O7Pa8Nv)5*u`G3T(x8VKw@fIBCr51b`|74b#|8#z@1>eO_wcxMwH5U9X4_ok; z_=EeI{0`*jSn#iTjRhag(=B)le|V;uzlndvg17NH3*N!=EO>}NIm67~&o8pzCA`^! z7xJkVJeR*X-OT?IzsiE&;N2Fyo-efEmHfSFX8w)*b_)*i-4^^$c8CQ(&pw-K=0BM~ zWWibdzbyDaY?B37@;nQ!=g&+r`F)RHY{AQTodrkvBn!TTKb~*qe~Vve!SC}H3x0^t zu;6d;=O>%_)A+Y7_)*?!!N2D*3;qiKqig0rn_q6hukfQR_>XLc1;5Uo%ro=9!_Kqd z`}koN{0jSL#H4?p{kH`_$M;z9b$q!6-@`wiWahtu-(kU1_<#lH@r4$g%U_&m=HH)R zX~8%0HVgg%FSOux{#ve?e>cC%f`7}qEch)p&w@W@Z|0c!Z|B!r@JznVf{*13Ecj6V zZnl~KH2y;izLO7F@P&M_1;4}J%QEwy#c#CW#k|jgAL9!x_$dDR1T+6;ex(IB@-7SR z=JPE0c>Y?ZnSYR9Wx;*?I14W4Q43zc|CnLsFXUHR@E>`*1;5VcS@1gkM!K2*5dM7& zKAdl}V9tvy_#f=8G&BDn*i9CE5{JsN_mdZzz!zEYzuDiy9vb_Vwfu(`T*rqj_-ek) zf8wh@q!Z_cGT1@|Q#0I9Cd*N9qkt!{_qR%Z63$|eD_GKJvmYz?3xYm} zU7_G+0q3$)E&7S9SHb@j_(|*t1=BEgLlL&xqR(SR7VI+Df+w>Nx0v#@eD;!pX&H1w zQ`mh9t`hK6cC&)l2zVO1Ou+*Jp3crv@N@ysU`H!hws${Pt>9LHpT$ZPyh^~c*(?Pg zF5oB}+ROUM`pjXkZZ_c<`>lf43VIkCDS9NM{)Ox!g{NWehUT$(*88SCH4y5Do-+gR zXL!&0hwvX8unU-c<>?=S$?voNA^0}|_|5?QeFG-`ml!bRzaRjg8h{4^aBBeG7=V`t z;Kc?^<;Mc>qyP+&tM^0oqj9Kz2!2-s_@Cfc1Mm|8_|5=)Ljb-o0G|T&U1RtUS{7>+L06aAS8_i{fpr_AO=<6^8!T(v`3$Z=){{@U)q5gk~{=X)~-k|?) zhlUUs5PpC9|CSItM8VDU|Ft3Zf4O@X__~T}e|+zgM?)#l7f_(Wp#(^!l)RGyLi23W z=G8pf6f3)VoHS|kIL)I?OM!w2RZyxRRw-HpwQA9#MT-I!MXZ8a5VZ@^bJBDf70`M71>MEI$QwVm*j z5$iU>4_FrUE7G@s5MSLZCfpyv$pRI>PU1I8{C2{vmh~ROha%R82qC{4Nc!(5g#JB* z(0`B+1C z-kS)am;6P@e4RhS?T9Biu5aLL!sGUU`XZcqYlNR2L?BG{M1JIW)DyKc@(WG(rXGk` zQ9|6DE+B+I+0HNFr}hvgIW9Ml%MJZ=iHG*4%ftTpY{Y7$_|L$9z_U@#ILX6b!-Oao z*-PcwNeDeNfy86`z$3lHixPrI%R|bC?FFxp!VfC{lN{-#@NI;jh*)Ds*-!n8f`K%8|5Q6?)DnH_~T!r+TIE z7`ZD&4#;w4B8M=`0a*@MO!6oc`v-bBTp?kd{%HxLF>(4{3D-*a0SUiT!k>}wsDwW& z;Xw)SlQ1fc^*tzI3`QLOoP@VX`12A*qvG`a5{A<`{E&n@CHw^mUoYV=N*IM^{s9SJ zE8&MFe5-`fIN2XJNchVVZkF&P5?&$UMyCnP#38V3GeupHyPQu@maKD7VCE;EPKPBNE z5=Lib|GZn;9VQc~IxA9WTc|QC@_RS_W(wbJ^EeP$XjMgUg5Z&*cMNNA~=|Qsrs4t&dO` z@%IUSf)K``DOeGtrxR*Fq2I6`AnW;~Wuc2$5romy8QCwV+ScO~hP^)}{1AR?nGp8b zWFN{+->WA7&J*POC*rT5FnFbe&|4{3FYzsca2fMJWhB>0bL}MHykMW7^2eSO1#ctTeb|W4`mlXkG z2(lvhp2oEVNr?K&B7|P9KVX5xUnaO% zaEV}@Ai5Cy0ZohL*9i7VJl7-qHKv>xce$KEF6Up=yp-(wDA|qpj|-y9S&=hr3qvg1 z{Wu}Yb6D^wA>_vBM`vOEK-PcUve@qkvmPLZTq}Z3i=oZ+AKD#Eu_C*SdVw<5hksb# zU&TIz**+j{IacH>Th$BnaJzz?&rv+^XOhorg!kagGx-N{Qv|smp&s5uVesb*<`N79UoOb~3VJb=F&|aU={#=*Z;YRYrCdNR*WctmjWGKk$mK(0IY4%! z9v>k@{6WEQO8gkT4WbvwdjD>zaR_1DTC520NkSC%Swi@W+bO~)ki8$qypIs^+&+Pq zP}rZBjXD2*Ho^LSk~)=X1zCxJ|OG+r)A;R&i=+wXGIYIZo&5wMs4dZ zN&m3m82hdjeL&WSOnKZxn8!UJ_rG(E_J{cn*B_AOa8u>>hA{Uh;O8j6dA1s#cVpjz z!ieW_4)_ZSo8`Mf^a5G0Z7VwvW;=j94xDFO2T30F`!pfy{UySC@q2KDrru`J3uL_! z>E{SzN@GQUtOt$ud9Oa`e}%%p3|r~FkPy6bLJWG`Z;?OG3vd%0rFewjA^f`p$M}7P z*aKvHFsOW*@BktuK%~!e0`6j1WqmAcUUp5t{w}YS9B^J?Wwc zVb%kDjO1`rQ}-v8e?z!Y(y#U_PrKLwypHmlVypIr zu)1H#eP+Jgr%nG~CGtR)N8{l862e>$z{g21CY6T?A^!p){Lk|dgmEk4bWCZi$j2-T zO`3UJF0=ivk^F$19|l|QrwDUD1#s? zh?_8vb7sAEi#(9!Pqx+k0bw4`fjpjLQ*FQ4_oQGtp&v&*xNPQ+M#k*`$nvwK9o}MF+&>V{?GXQPJH#ZN`v=mwe*mwb ze3s&;p9pL5>pz4L=I|(fb%(-(5{?UQRQrfDA7%cq#5V|HKEv|Y3pNT~D|oBm4T882 zGJl02?k5~xEqJvc#z~I9N^p(fI|R|+I34Yt5$%u>?THcXff4n}h%=V!Fz_sWn*rz8vAN$&bh~G@O2XAaI=Kr8jimxMPa=l z9jYgPOc%T)O@&JYTLf`uap)mK*;z z%D+2ewGp1@#NXBqXo zlKfE?;hzPG{L@y?BT(+^#80;gen@bSAm7Kp!w|{(bw5fMKb#}DSa79aOpyC84MM3ZM8nlR%Tg4u%Af;R}_Q3&(?OK^_(VVU5yf}aq4K=4`d)87T> zN>M&6FeqZI8~+JDEPSGlxZry zM9>l3D0q+HUcsjbw_&^!JoO|ce-sd4)^})cf2J_-bji0~@O^^!3O*?Kgy6~2544?cCp|0W zzKjC{I-c!ZBX*t@QTs$6veo_@@*TrlAiQ7M)^|xCjKI>BagX5FB>$gEI3jkODu`PM zmj^{YdpJKXzm4fR{tdyDknUlT%3+r5eG?24%8 zjOV)L=6YQ&^*SwLJuc-b6T3GGYCX*F7yf+IkEH)V5K(G;5WJoccH$8<$3H~~yQWJy z`ULM0q@UBK^zRbF?|R;GhfyBB|HtJ1A9c&a^S8AT>jo;vyog#K-sSp%(+4E|%@MVa z>ZxD854<&E-AMAMxq7*M;HLI=ibo~xBz%{w|DgW`3h%bne(X;CQU&<~h)4O%dqVKn zg43vckk1iZBDhv?gb;S!D&fxxJ}dYq!D-|d(j)a=CHQ%X|DNDIGJZcII1Lp_`p*(9 zBZQu63HM0&{elk*J}&9M6}(X9cZ&sY7yPi`Hv~T=)|=|q-!So3%lV1ZBi7A^+!hMI4f908 zIj$V*am2neBWi!)J*ZczU*wA+j1i)YgMzmR;wTKqLE)TCau9o!%Zt9PTJ;w+! zIXF-B7Ye>x@P5Jlf-eaEMX;Ijf&XwMgY$c@;Jt$T1%D!_#~E!Gj}uE}oJbQtT;uki zw~~G9WuAIL#QFw>v9H4Nm@H~NBNX2lQR}LcTz_)?tdRPd;l{I{i^R`=aP?rxjpx-7 zwch`|ZLxpg_kU76@GL3!3ch#`gf+J8?=So;rCbWX?An-MNx)b*Ms^ONa< zmkO>Bf(U49-XQ5igLoD#9HROaXDzZJxmIO{)E@FGDyAJ^p>k@$NAKPUJdK`f0} zPmAC>!7YNf3w~Vipx}=L{~h46Ol+Y_SxX3)G3;kkl^gz(>x;I)L{eMInKiT{Cwj|u)&aH`A)PZzve z@WX;X6#RwY=`)o61%gWi+XROMw+X&a@IJuo7gerb)j#U2uV5iQqOu$lovFPZ45Xx1SL8`kbWyLehUHsMouCevB#%k;mqpKa1%D}st$D6LOc@xp z{Cg?ADq_8#5S6Oq`My^t_q`M3zJ~V3<2LY^=+*a&-x>PXNIt`Y?-aa8@Q~p1g1;4f zU2wM4quzHbm+%@w)XNiuxWD|5#Q$B8-rPt1B1`ZQLbQ|b3i3P2kZ#Mo?_@!}zHg*3 zob3=^Ytv8Iv%XCdeq6%O2>wd&Y&eecT|fvqy&uph@s8jiA@sjX@E*Yj2qE_sLg+ax z;a^Djj}o@z{xV%~iC_yM^xh!h_X+MHgkHV>cueBYllx8qA>^7RyjAc~!JiYtf4?C_ zzq^R;Gr)Cnzu77HG$D94-5-D#3oaGhF87UHf}a!o8X@w3M#4WA{EOhZa^ENrTt*1~ zYQYT>f1}_Xg7*p1_p8XChXnaP1o^*F7&z6qAGJt0CO9PccELLY?-RUD?n56I{Jh|| z1bLqX?e%vOPL=!8S%Mb}UMh%c9`pR0`(cyx!;{_q$@9h%nK!=XjypWwUoPu8OoH`3 z-BY^13SKPzwN$WCP>(NnNtoB~@ZZA{{+8em1z!=w5W;?L73>ncju3w4c{fn6d-c5g zo5K5E1Hj|m?^J34E)>cL{z& zaEbJ{m4bR6xJmlmcER@(!p=_!?@>Ye-XxWmUjIS3RPZXn0l}LDZx^(rpE-gGaAOD*qb6&4T*{ zzb!cBbj6Dbb_!lA_&6cT`(wc=bA&J0A-GlWNkZ^{CV0siieDwTQ}98-e+Zs-rsDMq zzC-XZA@sc@c+OdhS1dS4i1b?p>30IC+|LU}=c@1`!M78Fzf15p5}*1e#k-Uc=}m&S zN&LqI&plhEUn)3Ai2QC9Jn1nKu) zNY7ruuM4JIh+i$=SICk5pO@uaE%@K1bfA8Y{U%$57Ya5IV%>WcAr=*{OFXusc)q6f zZzetYvTppHJFnPC@wmBfA)FOa-xolBUzU8I6nsJOPlD4WpEnD(3yuoveLTI+d{p9p zBB=MFu=U2}n=ZIquwAfE@I8Wh{rRkf|4MkhZJm^&^qeJliQpB4n5Xgj0_7T(_!|U2 zAjtd9NPkkoKNWmMkluJm^)OdZ??abLxJmG8!D|VT?_NUKcTnPgNQim#FVmF1zX|Gj z$(g7y%7@n*z)}gf3dRNBDah*#@OYg8{JO;J=aYYy@RTV^?^%L5g1ny%JC{kglQ4$w zp$Oh3_@xXb{|&*P2>wM-?`vIng5oU_TtWza-GpeT*Al`X`z8GlA@YAt!n{s!u>OiL7`55>&NLcSL@00LB!Dj{a{yZK@ zupeg&o+p?s_!dFk&o@Z;20`85@l{0D^MK&Pgs9IH>X&FwdVh(ZFCm`G9e2yWiOSU> z>#Vcgbr$=jSp4!wmp@AUPFa7QGui#P;j>RZK+_ZAd1H2enL?1gJUa)LE#gk`VfN z-3$Dk#B)1Fd*b`k^?1J(`4f8aNR;s`!E?pW7ZQSpTR5YBUV%q(?3eEez9{$y;hiD% zP$5Xa6GG$vM+Nr_9u|CEko|$@QPx7dU2S38@bF+y`^a!?$XYlwOz&O;cI!`gvEf2~ zSDq6eX{Q&8f#t?^4I;)Hf!8ID3HS7O4RCtTLcAZEUtaIvC53orBEQXfSkmzFLcFEi z=^W|n+pMGL-PR;S@0X6L_iavn9A((vkciNkx)nCz=2 zk*HqWOs||X#V7^ueomIu0Z*|-S{0RQB#yTqo0_D!+Ey>Wr@u#g!5iIyqM_Jbg9Cj| zd|;s0CnrVG33zQBy)~Z8+tH2}Qm*Y8f!Hq&VI;Z;P*yLZ*5OE7=-OreIqyUdxH*yt$8?b%%N*rnL|+ zx^(c)Os5;|2R?Efdd=Y4!T3UH>uv4rgRzYZ*A5Ph#24l|C4JeroZj|$_p<8Y^|8!c zha$4GJ(9?7VF$QtolQt^>PLIa+AFhj2AdZ-TVe*6D`_n{-okE3bhH+e#8CE@(acTV zWyNiI&iY(KqOB8e938~_F4lP?-&>ma9qN-rL0Mu_}a_tC{N2^!l zw-v8i-V<*dPwwbi>vW*!QfYGv`$>6A-je#fiu|V5t}ds5jraJnJ=TT>!Sv!GR$tpv z(bPSX8LwHHJ6?U)0A9MisF`4`A#|c%Uj<5nDTwu$Y$c^ zEooR@mz&wybybnGbgjW{8y@KE>0s6Q%9SH)TO0Fow+uCJiH*008Uht`Q)N4;ZqM1& zyP>&0zj8^N)0J^s&wv5k09D@zUab7N@UvbnLpbbaaCu3Tq}DTQXtuRCRd zY~}x)nz{nKK(Z^lw|%@x)ZUmpu#pUK$~PAlRcE#omX_s=C$H@ti7~lmIk)8e=ECBV z((L*rmHAFlr%`}dM~Bm?bY~B|{4u{@qt0V?kVpD6`Nc*Php0&+|4%d^nQb&e+dWV=@p`6mOVKm;lwjjGd z?$c`MWt+ooct0*ntf#VOJDbWjT~+5aY-qqMe#do^wwU6s8f9+Jy8iOgy7s#G(n23@ zM+e^O%c@&?J4khPV@uMfM+^lpk3XXlJAsVw&CvFe7* z^z3@357zYz#+ExvH?$UwFRfNRP{!PmwRxL5o9bIj7x|1FL&Kdt1FX4Zh#cu$wW7bb zp}iPd9h_FIoau0 z+qZnfNN!zrf1b0^90rJwHw)wb$_B04%#Ez5zq52p|K`rR<%^tdpDbY0fEtKbss7a7 zzr3P3Z_)Dh{?75f8BndDq>ptsHg6eq8VYmUmid^E7Y_HdsX?svD$3Yda@EGlyt0+8 z)nz_j$4g>|H^-$>W)HJ_`mb71*1D>9prWJA;Wp!K2>m_u;%BEnu8NyqOHJI_SXfeB zwWOzHbIu}1-Pb%ru`A+8L8|LnYV+Wt*z$Pw+KT#4AE|gRrY`DT#_ZYUgIt`7>cR5< zlGd8yjXsVV?&-t(pPAmVhzqm6rMtMixvIW0o;SX(@fPcNx2lGYE~YQpw5q7{ae$*vs(o!oU}1)Jk5*R`$7?enQ({YGO}Upr6; zUC#2}EuF<{^SXU`*Jcq#m#YQ*`Kl)qCw zP}146sJ67U-+v5m*MsJAx$iG;DbHNn-dm1QoJ;L3!qDa+%mLY&mS(Pn*s_+cs*2vW zt}36|C~gt@Ubso!YnSHrwQMfFYDMA3;_=#PDS&rnt7%vM7Ou9;uAJ=J(G5cz%krHz zDv;M4J?)|i0~@to%}289Yc>qUR$#a-7+=>~h?}n-beHfwrazWbu(7LrUGFBJnE5tcr8(tI&1H2t4ts8_VU9bZFCSq~HD)fYEF8(a>Z+zTrzcrSu=nzxh>HS{@oIn7NmhbMbp^XS$s^VF6t z%DC$0Wkt*KTSv>$ft7J%mQZphX&dSr6TL9Uk}yUQwMU>f8F;y-)`>hnQy<%hhOC~2 zxN~*4^>+ezwnR%=%(Vw&G#HIf_9oFykCt0Q&d|mVUW#t)8R}{8>FpWb3`sY+11pJP z2TgTMY+Gk136c$p8h2=`p{Jh~`fi*Ub#U1_uf(EVCSx>lpMJM9CV)2n-YrQkn8;ixQ z?v5UeyPZQ&GHk6?4T1{D-N)*RwK=_Qn`48h>t3s)7b~ycwzZbtUx~N#4g&5+8xwJ4 z>6i$$22I4lUbHB#TarlxX;TE@?%1fsZ3AkE$Ihk?w0qS%G)#@o!Xlp9v!k}El+k@d zYpu3+YQZ#w^$&MBxDj_?HHe|#mxP$78^U^0LgHa&C8oH{ zut>Z%#1w0sI4^_Q_7Lk}A8EQ1v+YT5#p61=t~5QtBJnUYtns<4=^x35ng5ycvUDTy zFl#qMT$WHI9cB%cTsq83(2$mGRnEJSCOpCWs^g_GOC{kj+ot1%Wer3M!YqPJ1@5Yi zG=y2U`Dmc0AyS4A%S%InJO5BB!tA*CsNg*wDnpn}p7HXsfkO(y?BI-3pllDbqhpAA z=SfOQn2ixrNn#g=w`8akVfJK_YEg!S*$gsO&?Y)%KY?4m9)ZSgJ8(^e*mp1t(7Ti* z9%h@;6sJdw>M;yy2=g4qPXjMiNx=l>EeSX9&O8Z+*_tSJkE0Tg>eF5PQsK=JLFU#KS!B885C}7v=$wA)9OmkxU7*g=nagIlJttk&-am zYW_;pb{^>nv!Ca$1AB<1U;>K=U8SA}S)?J%ldN$j=m(0VAj}g*Qvqy|XLY1uQ;3Ik zriMu_fV30z?ws1vQ-0tbs=z%x!w9Wp%x)U%3bCD*M3+3;B`sl|?IzKZ*mNX4*&%iv z$LY}d}JrP zv*0=NLb-=I^kU{N58+un#8Y@f+ZS zSz*aZZmTHS$?d6#>|{1n5~7pXP0_N61;7NhQnc)(_ED7Zi58yRHi<~9(QX2JBrNwYZICDp z|I+S=p+Xg60$U?WeiHj4Ech>NiYN_ykXo5NfgKSgJL&BZS3EHkPGB!2A+5}wz(xp5 zPG%QG2~K7Uge51v{~^+o+WcVIN$q?n$;2TEn#N3E+e1sM+L^$f2MhiS8y+k_x!n#W zDyQkFykU;hd1qbvTr0^=V4p+fONU%ZZ~~hgEckEQ;b2|=()NZ|!=&~$yb311u_4ll z}U}UMT5FZ(WG^B=;>6(v#e@(DG_9nZS;P5}e$21ul=$R!CRp}g+?E)lL$$3idlGWa17!_!%tLQIfF9;p$Apes z>kS5Sd#J;t6FLbi$Dp7*%qgf)CnDWr82a1=w1?R%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 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⩔osW#!VP{l#GW#Io)^!ApP`G=_5;-PDvkKo8g*4 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 z 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